我在不同的机器上运行RHEL 5.3上的TCP客户端和TCP服务器。
我正在查杀服务器,FIN被发送到客户端。 ACK由客户端的操作系统立即发回。
客户端发现关闭(通过read()返回零)并且perfroms仅在90秒后关闭。 在这个阶段,我验证了双方的netstat并且符合预期(服务器上的FIN_WAIT_2和客户端上的CLOSE_WAIT)。
由于90秒后客户端关闭(),客户端的操作系统会向服务器发送FIN,但作为响应,我们会收到服务器的RST而不是预期的确认。
我也多次看到由于“延迟”close(),客户端的操作系统发送了RST而不是FIN。
请注意,在这两种情况下,双方都没有待处理的读取数据包,并且未激活SO_LINGER选项。
有什么想法吗?
答案 0 :(得分:3)
RST
表示某些“数据”已丢失。在这种情况下,“数据”是客户端干净地关闭套接字的信息 - 来自客户端的FIN
未报告给服务器端应用程序(因为它已被杀死)。
换句话说,RST
告诉客户端服务器从未看到客户端的流末尾。