梁越

TCP的TIME_WAIT和CLOSE_WAIT状态

0 人看过

面试中常问的问题

很多面试中,特别是后端岗位,特别是和服务器相关岗位的面试中喜欢问这两个状态,首先回忆下这两个状态出现的时间,下面是三次握手和四次挥手的状态图

状态图

TIME_WAIT

TIME_WAIT是出现在主动关闭的一端,一般是客户端,在收到服务端发来的FIN报文之后进入TIME_WAIT,TIME_WAIT的时间一般是2MSL,1MSL是30秒,主要是等待某些在网络延迟的报文到达,从而正确关闭

那如果服务器这时候出现大量的TIME_WAIT状态,会是什么原因呢

首先出现TIME_WAIT状态是正常的,如果是在服务器出现,那么一般可能是有以下两个原因,

原因

  1. 大量的短连接
  2. 服务器主动关闭
  3. http请求头没有设置keep_alive,而是close

第一种情况就是连接时长很短,导致连接关闭后进入TIME_WAIT状态,并且大量的短连接同时进行

第二种情况就是像某些爬虫服务器可能会主动断开连接,那这时候服务器会进入TIME_WAIT状态

第三种就是请求不是一个长连接,如果客户端挂机后,服务器超时会主动断开

所以针对以上情况,有以下解决方法:

解决方法

  1. 在业务层尽量避免服务端主动关闭
  2. http请求头设置keep_alive
  3. 服务端开启TIME_WAIT复用选项,设置net.ipv4.tcp_reuse=1net.ipv4.tcp_timestamps=1

大量的TIME_WAIT状态会导致新连接创建失败,因为端口只有65535个,端口不够用了会报错

CLOSE_WAIT

原因

CLOSE_WAIT是服务端收到FIN报文后,发出最后一个FIN报文前的状态,所以出现CLOSE_WAIT有很大可能是服务端没有及时发送出FIN报文,也就是没有主动close或者shutdown,这种一般是代码写得有问题