我尝试了官方的tcp回送服务器示例服务器和客户端。使用netstat -ano | findstr TIME_WAIT,我可以看到客户机每次都会导致一个TIME_WAIT,而服务器却不干净地连接。
无论怎样,是否都要防止TIME_WAIT或CLOSE_WAIT为双方彻底断开连接?
下面是捕获的数据包,似乎最后一次正确发送了ACK,但客户端仍然存在TIME_WAIT。

发布于 2016-01-26 05:34:03
发布于 2016-01-26 04:44:49
挥之不去的CLOSE_WAIT实际上是编程错误( OS执行连接关闭,但应用程序不记得及时释放套接字--或者根本不记得)。
然而,TIME_WAIT并不是一个特殊的条件。对于可能在正常连接关闭期间丢失了最后一个ACK段的连接,必须提供一个干净的关闭。没有它,FIN+ACK段的重新传输将通过连接重置来响应,一些敏感的应用程序可能不喜欢它。
在TIME_WAIT状态下拥有较少数量的套接字最常见的方法是通过调优全局OS级参数来在全局缩短其持续时间。IIRC,还有一种通过setsockopt()完全在单个套接字上禁用RST的方法(不过,我不记得有什么选择),但是您可能偶尔会向在连接关闭期间丢失数据包的对等端发送可能不需要的RST段。
至于为什么您只在连接的一侧看到它们,可能是在请求先关闭连接的一侧。是它发送第一个鳍,接收FIN+ACK,并发送最后一个ACK。如果最后一个ACK丢失了,它将再次接收FIN+ACK,并且应该重新发送ACK,而不是RST。但是,另一方肯定知道,当最后一个ACK到达时,连接已经完全结束,然后没有必要在该套接字上等待其他任何东西--如果有任何东西到达与刚刚关闭的套接字相同的address+TCP端口端点的主机,那么它应该是一个新的连接请求(在这种情况下,可能会打开一个新的连接),或者是一些TCP状态机违规(并且必须用RST响应,或者可能是一些ICMP禁止的消息)。
https://stackoverflow.com/questions/35006324
复制相似问题