我正在使用自制的nodejs tcp服务器并在Linux下使用netcat测试其行为。建立连接后,服务器发送'测试'将该字符串向下拉并关闭套接字。我希望netcat通过发送适当的tcp数据包来关闭它的连接,但它并没有! 这是我的工作:
nc -v localhost 9000
之后,整个对话看起来像这样:
netcat --> server (SYN)
netcat <-- server (SYN, ACK)
netcat --> server (ACK)
netcat <-- server (PSH, ACK)
netcat --> server (ACK)
netcat <-- server (FIN, ACK)
netcat --> server (ACK)
此时我希望netcat发送FIN,但它永远不会发送。连接在一侧是FIN-WAIT-2,另一侧是CLOSE-WAIT。
如果我用telnet尝试同样的事情:
telnet localhost 9000
它的行为符合预期,并在收到&#39;测试&#39;后终止连接。字符串。
问题是为什么netcat的行为有所不同?
答案 0 :(得分:2)
netcat
旨在工作,直到双方都关闭了连接。你还有一面打开了。
当服务器关闭与FIN的连接时,连接仍处于半开状态,您可以在此状态下发送数据,服务器可以接收数据。连接将保持此状态,直到您关闭netcat的stdin(类型Ctrl-D),这使得它向服务器发送FIN数据包。