C++ 使用增压asio等待的时间

C++ 使用增压asio等待的时间,c++,tcp,boost-asio,C++,Tcp,Boost Asio,我尝试了官方的tcp echo服务器示例并进行了测试。使用netstat-ano | findstr TIME_WAIT,我可以看到客户机每次都会导致TIME_WAIT,而服务器会干净地断开连接 是否有任何方法可以防止双方完全断开连接的等待时间或关闭等待时间 这是捕获的数据包,似乎最后一次确认发送正确,但客户端仍有时间等待。 长时间的延迟关闭等待实际上是一个编程错误。操作系统执行连接关闭,但应用程序不记得及时释放套接字,或者根本不释放 然而,等待的时间并不是一种例外情况。对于在正常连接关闭期间可

我尝试了官方的tcp echo服务器示例并进行了测试。使用netstat-ano | findstr TIME_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禁止的消息

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

等待的时间是在双方彻底断绝关系之后,它只持续几分钟。避免这种情况的方法是在第一次结束时结束。通常,您希望在服务器上避免这种情况,因此首先要关闭客户端


时间等待肯定是在第一个关闭的那一边。等待的时间不仅仅是一个丢失的确认。这篇文章是用图片更新的,似乎是最后一个确认被发送了。另一个问题是:谁负责处理最后一个ACK,是C++代码还是Windows操作系统?@ AJ323操作系统:更确切地说,TCP实现在网络协议栈中。发送和接收最后一个ACK不会阻止等待时间。NB代码格式是针对代码的:否则请使用普通引号。因此,对于我的服务器,我想客户端的TIME_WAIT是正常的行为,也是最好的结果,它不可能两边都是干净的,我的意思是没有XXX_WAIT或任何其他状态。你需要摆脱TIME_WAIT不是“干净”的观念。这是TCP精心设计的功能,对其正确工作至关重要。当然,至少在美学上,最好将它转移到客户端,在那里它不会被注意到,而不是堆积在服务器上它肯定会被注意到。