【网络】TIME_WAIT状态相关问题解析

        TIME_WAIT状态是TCP协议中常见的状态,简单来说:TIME_WAIT状态是四次挥手中server向client发送FIN终止连接后进入的状态。



下面总结了有关time_wait相关的问题:

1、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE?

①、为了保证A发送的最后一个ACK报文段能够到达B。即最后这个确认报文段很有可能丢失,那么B会超时重传,然后A再一次确认,同时启动2MSL计时器,如此下去。如果没有等待时间,发送完确认报文段就立即释放连接的话,B就无法重传了(连接已被释放,任何数据都不能出传了),因而也就收不到确认,就无法按照步骤进入CLOSE状态,即必须收到确认才能close。
②、防止“已失效的连接请求报文段”出现在连接中。经过2MSL,那些在这个连接持续的时间内,产生的所有报文段就可以都从网络中消失。即在这个连接释放的过程中会有一些无效的报文段滞留在楼阁结点,但是呢,经过2MSL这些无效报文段就肯定可以发送到目的地,不会滞留在网络中。这样的话,在下一个连接中就不会出现上一个连接遗留下来的请求报文段了。
可以看出:B结束TCP连接的时间比A早一点,因为B收到确认就断开连接了,而A还得等待2MSL。


2、Time_wait出现在那个阶段?time_wait的作用?

   time_wait作用:
 (1)、为了保证A发送的最后一个ACK报文段能够到达B 。
 (2)、防止已经断开的连接1中在链路中残留的FIN包终止掉新的连接2 。     
   (3) 、防止链路上已经关闭的连接的残余数据包干扰正常的数据包,造成数据流不正常。 
由于插口的2MSL状态(插口是IP和端口对的意思,socket),使得应用程序在2MSL时间内是无法再次使用同一个插口的,对于客户程序还好一些,但是对于服务程序,例如httpd,它总是要使用同一个端口来进行服务,而在2MSL时间内,启动httpd就会出现错误(插口被使用)。为了避免这个错误,服务器给出了一个平静时间的概念,这是说在2MSL时间内,虽然可以重新启动服务器,但是这个服务器还是要平静的等待2MSL时间的过去才能进行下一次连接。

3、TIME_WAIT会带来哪些问题?(主动关闭的一方)
(1) 作为服务器,短时间内关闭了大量的Client连接,就会造成服务器上出现大量的TIME_WAIT连接,占据大量的tuple,严重消耗着服务器的资源;
(2) 作为客户端,短时间内大量的短连接,会大量消耗Client机器的端口,毕竟端口只有65535个,端口被耗尽了,后续就无法再发起新的连接了。


4、服务端time_wait过多的处理办法?
net.ipv4.tcp_tw_reuse=1  (/etc/sysctl.conf)
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)
net.ipv4.tcp_tw_recycle=1  
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。                                          net.ipv4.tcp_timestamps=1  
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

猜你喜欢

转载自blog.csdn.net/yaotengjian/article/details/80457938