TIME_WAIT with boost asio

时间:2016-01-26 02:55:08

标签: c++ tcp boost-asio

我尝试了官方tcp echo服务器示例serverclient。使用netstat -ano | findstr TIME_WAIT我可以看到客户端每次都会导致 TIME_WAIT ,而服务器会干净地断开连接。

无论如何都要阻止TIME_WAIT或CLOSE_WAIT,双方干净地断开连接?

这是捕获的数据包,似乎最后一次 ACK 发送正确,但客户端仍然有 TIME_WAIT enter image description here

2 个答案:

答案 0 :(得分:3)

  • CLOSE_WAIT是编程错误。本地应用程序已收到传入关闭,但尚未关闭此端。

  • TIME_WAIT来自之后双方彻底断开连接,并且只持续几分钟。避免它的方法是收到第一次收盘的结束。通常,您希望在服务器上避免它,因此您首先关闭客户端。

答案 1 :(得分:2)

长时间停留的CLOSE_WAIT实际上是一个编程错误(操作系统执行连接关闭,但您的应用程序不记得及时释放套接字 - 或者根本不用)。

但是,TIME_WAIT并不是一个特例。有必要在正常连接关闭期间可能丢失最后一个ACK段的连接上提供干净的关闭。没有它,FIN + ACK段的重新传输将通过连接重置来响应,而一些敏感的应用程序可能不喜欢它。

在TIME_WAIT状态下拥有较少数量套接字的最常见方法是通过调整全局OS级参数来全局缩短其持续时间。 IIRC,还有一种方法可以通过setsockopt()在单个套接字上完全禁用它(但我不记得是什么选项),但是你可能偶尔会向丢失数据包的对等体发送可能不需要的RST段在连接关闭期间。

至于为什么只在连接的一侧看到它们,可能是在请求先关闭连接的一侧。它发送第一个FIN,接收FIN + ACK,并发送最后一个ACK。如果最后一个ACK丢失,它将再次收到FIN + ACK,并应重新发送ACK,而不是RST。但是,另一方确切知道当最后一个ACK到达时连接完全完成,然后就不需要等待该套接字上的任何其他内容 - 如果有任何东西到达具有相同地址对的主机+ TCP端口端点作为刚关闭的套接字,它应该是一个新的连接请求(在这种情况下可能会打开一个新连接),或者它是一些TCP状态机违规(并且必须用RST响应,或者可能一些ICMP禁止的消息)。