TCP连接 - 延迟close()和RST

时间:2010-07-20 07:35:19

标签: c linux networking tcp

我在不同的机器上运行RHEL 5.3上的TCP客户端和TCP服务器。

  • 我正在查杀服务器,FIN被发送到客户端。 ACK由客户端的操作系统立即发回。

  • 客户端发现关闭(通过read()返回零)并且perfroms仅在90秒后关闭。 在这个阶段,我验证了双方的netstat并且符合预期(服务器上的FIN_WAIT_2和客户端上的CLOSE_WAIT)。

  • 由于90秒后客户端关闭(),客户端的操作系统会向服务器发送FIN,但作为响应,我们会收到服务器的RST而不是预期的确认。

我也多次看到由于“延迟”close(),客户端的操作系统发送了RST而不是FIN。

请注意,在这两种情况下,双方都没有待处理的读取数据包,并且未激活SO_LINGER选项。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

RST表示某些“数据”已丢失。在这种情况下,“数据”是客户端干净地关闭套接字的信息 - 来自客户端的FIN未报告给服务器端应用程序(因为它已被杀死)。

换句话说,RST告诉客户端服务器从未看到客户端的流末尾。