(原标题:“奇怪的TCP连接关闭行为”)
我正在使用Wireshark对TCP连接过程进行故障排除。客户端打开与服务器的连接(我尝试了两个不同的服务器),并开始接收长流数据。在某个时间点客户端想要停止并发送服务器[FIN,ACK]数据包,但服务器不会停止发送数据,它会一直持续到它自己的完整流结束,然后发送自己的完成数据包[FIN,PSH,ACK] 。我发现在客户端发送FIN数据包后继续从客户端的套接字读取数据。此外,在客户端发送此FIN数据包后,其状态为FIN_WAIT,从而等待来自服务器的FIN响应...
为什么服务器不停止发送数据并通过FIN设置确认响应FIN数据包?
我希望,在客户端发送FIN数据包之后,服务器仍然会在收到FIN之前发送几个正在运行的数据包,而不是整个长数据流包!
编辑:阅读this我认为Web服务器停留在阶段“CLOSE-WAIT:服务器在其端部等待应用程序进程以表示它已准备好关闭”(第三行),并且它的数据发送过程“完成”,当它将所有内容刷新到套接字的末尾时,该过程不能终止。怪异。
编辑1:看来我的问题有点不同了。我需要完全终止客户端的连接,以便服务器停止发送数据,并且它(服务器)不会因为客户端的强制终止而疯狂,并且中止其数据发送线程已准备好进行下一次连接。
Edit2:环境是HTTP服务器。
答案 0 :(得分:2)
客户端只关闭输出连接,而不是关闭它。所以服务器完全有权继续发送。
如果客户端已关闭连接,它将发出一个RST以响应收到的任何进一步数据,这将阻止服务器再发送模数缓冲。
答案 1 :(得分:1)
为什么服务器不停止发送数据并通过FIN设置确认响应FIN数据包?
他们为什么要这样?客户说它不会发送另一个请求,但这并不意味着它对它已发送的任何请求的响应不感兴趣。
大多数协议(例如HTTP)指定服务器应完成对当前请求的响应,然后才关闭连接。这不是异常中止,只是承诺不发送任何其他内容。