2010-07-20 148 views
0

我同时在不同的机器上的RHEL 5.3上运行TCP客户端和TCP服务器。TCP连接 - 延迟关闭()和RST

  • 我在查杀服务器,FIN发送给客户端。 ACK由客户端OS立即返回。

  • 客户端发现的关闭(由读()返回零)和perfroms只有后90秒关闭。 在这个阶段,我在两边都验证了netstat,它和预期的一样(服务器上的FIN_WAIT_2和客户端上的CLOSE_WAIT)。

  • 由于客户端的close()90秒后,客户机的操作系统发送FIN到服务器,但在响应我们从服务器接收RST和不按预期ACK。

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

请注意,在这两种情况下有双方没有未决读取数据包,SO_LINGER选项没有被激活。

任何想法?

+0

如果你杀死的服务器,还有的将是一个未决诉讼/包 - 关闭()从客户端将无法达到你的服务器程序。 – nos 2010-07-20 11:04:16

回答

3

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

换句话说,在RST告诉服务器从来没有看到最终的流从客户端客户端。

+0

谢谢!什么会导致RST被客户发送到“延迟”关闭()?我也面临这个问题。 – dimba 2010-07-20 18:43:10

+0

@idimba:可能意味着客户端从未见过连接结束('recv()'返回0)。 – caf 2010-07-20 22:19:34