netcat 不发送最终 FIN 来关闭连接

netcat doesn't send final FIN to close the connection

我正在玩自制的 nodejs tcp 服务器,并在 Linux 下用 netcat 测试它的行为。建立连接后,服务器会在线下发送 'Test' 字符串并关闭套接字。我希望 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

它的行为符合预期,并在收到 'Test' 字符串后终止连接。

问题是为什么 netcat 的行为不同?

netcat 设计为在双方关闭连接之前一直工作。你还有一侧打开。

当服务器关闭与 FIN 的连接时,连接仍处于半打开状态,您可以在其中发送数据,服务器可以接收数据。连接将保持此状态,直到您关闭 netcat 的标准输入(键入 Ctrl-D),这会使它向服务器发送 FIN 数据包。