time_wait状态知识整理

1. time_wait状态如何产生? 

time_wait状态知识整理_第1张图片

客户端和服务器都可以主动发起关闭连接,上图是客户端主动发起的TCP连接关闭。首先调用close()发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait的状态,也就说该发送方会保持2MSL时间之后才会回到初始状态。在time_wait的状态下,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。

MSL:Maximum Segment Lifetime,也就是最大报文生存时间 。

2. time_wait状态作用? 

(1) 为实现TCP全双工连接的可靠释放

在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,因此客户端必须维护状态信息允许它重发最终的ACK。如果不维持这个状态信息,那么客户端将响应RST分节,服务器将此分节解释成一个错误。

(2)为使过期的数据包在网络因过期而消失

如果旧的连接断开后创建了同样的新的连接,然后这时候旧的包又到达,虽然TCP会根据序列号和滑动窗口来判断包是否有效,但如果刚好旧的包的序列号就在这个范围,那么同样会被认定为有效,从而导致数据异常,比如延迟的FIN重传包会干扰新的连接。在TIME_WAIT状态下,不允许应用程序在当前ip和端口上和之前通信的client(这个client的ip和端口号不变)建立一个新的连接。这样就能避免新的连接收到之前的ip和端口一致的连接残存在网络中的数据包。这也是TIME_WAIT状态的等待时间被设置为2MSL的原因,以确保网络上当前连接两个方向上尚未接收的TCP报文已经全部消失。

3. time_wait产生的危害?

大量的time_wait产生需要的条件:
(1) 高并发

(2) 服务器主动关闭连接

如果服务器不主动关闭连接,那么TIME_WAIT就是客户端的事情了

在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于time_wait状态。在time_wait的状态下,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。因此,高并发可以让服务器在短时间范围内同时占用大量端口。如果客户端的并发量持续很高,此时部分客户端就会因为端口已经被占用而显示连接不上。

4. 如何解决大量time_wait产生的危害?

(1) 调整优化linux内核参数:出现大量TIME_WAIT的情况,一般是服务端没有及时回收端口,可以缩减 time_wait 时间。

(2) 服务器不主动关闭连接

(3) 重用端口:设置套接字选项为SO_REUSEADDR,告诉操作系统,如果端口忙,但占用该端口TCP连接处于TIME_WAIT状态,则该端口可被重用。如果TCP连接处于其他状           态,依然返回端口被占用。该选项对服务程序重启非常有用。

(4) 使用长连接:HTTP 请求的头部,connection 设置为 keep-alive

5. time_wait时间为什么是2MSL,而不能是MSL?

time_wait至少需要持续2MSL时长,这2个MSL中的第一个MSL是为了等自己发出去的最后一个ACK从网络中消失,而第二MSL是为了等在对端收到ACK之前的一刹那可能重传的FIN报文从网络中消失。如果time_wait时间是一个MSL,而time_wait结束后使用了相同的IP和Port建立了新的TCP连接,由于旧连接重传的FIN报文还没有在网络中消失,因此会干扰到新的TCP连接。

6. 一个MSL时间有多长?

RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。

你可能感兴趣的:(网络)