您的位置:首页 > 理论基础 > 计算机网络

TCP TIME_WAIT

2016-07-27 00:03 357 查看
问题:server端在客户端之前断开连接,在TIME_WAIT期间仍然不能再次监听同样的server端口。如何实现server端快速启动?



答:MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。

根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证.

大多数服务器端一般执行被动关闭,服务器不会进入TIME_WAIT状态。

服务端为了解决这个TIME_WAIT问题,可选择的方式有三种:

1、保证由客户端主动发起关闭(即做为B端)

2、 关闭的时候使用RST的方式

3、 对处于TIME_WAIT状态的TCP允许重用

为什么需要 TIME_WAIT 状态?

假设最终的ACK丢失,server将重发FIN,client必须维护TCP状态信息以便可以重发

最终的ACK,否则会发送RST,结果server认为发生错误。TCP实现必须可靠地终止连

接的两个方向(全双工关闭),client必须进入 TIME_WAIT 状态,因为client可能面

临重发最终ACK的情形。

此外,考虑一种情况,TCP实现可能面临先后两个同样的相关五元组。如果前一个连

接处在 TIME_WAIT 状态,而允许另一个拥有相同相关五元组的连接出现,可能处理

TCP报文时,两个连接互相干扰。使用 SO_REUSEADDR 选项就需要考虑这种情况。

为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间?

如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。

第二个拥有相同相关五元组的连接出现,而第一个连接的重复报文到达,干扰了第二

个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT

状态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被

丢弃。建立第二个连接的时候,不会混淆。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tcp 网络 time-wait