面试中常问的问题
很多面试中,特别是后端岗位,特别是和服务器相关岗位的面试中喜欢问这两个状态,首先回忆下这两个状态出现的时间,下面是三次握手和四次挥手的状态图
TIME_WAIT
TIME_WAIT是出现在主动关闭的一端,一般是客户端,在收到服务端发来的FIN报文之后进入TIME_WAIT,TIME_WAIT的时间一般是2MSL,1MSL是30秒,主要是等待某些在网络延迟的报文到达,从而正确关闭
那如果服务器这时候出现大量的TIME_WAIT状态,会是什么原因呢
首先出现TIME_WAIT状态是正常的,如果是在服务器出现,那么一般可能是有以下两个原因,
原因
- 大量的短连接
- 服务器主动关闭
- http请求头没有设置keep_alive,而是close
第一种情况就是连接时长很短,导致连接关闭后进入TIME_WAIT状态,并且大量的短连接同时进行
第二种情况就是像某些爬虫服务器可能会主动断开连接,那这时候服务器会进入TIME_WAIT状态
第三种就是请求不是一个长连接,如果客户端挂机后,服务器超时会主动断开
所以针对以上情况,有以下解决方法:
解决方法
- 在业务层尽量避免服务端主动关闭
- http请求头设置keep_alive
- 服务端开启TIME_WAIT复用选项,设置net.ipv4.tcp_reuse=1和net.ipv4.tcp_timestamps=1
大量的TIME_WAIT状态会导致新连接创建失败,因为端口只有65535个,端口不够用了会报错
CLOSE_WAIT
原因
CLOSE_WAIT是服务端收到FIN报文后,发出最后一个FIN报文前的状态,所以出现CLOSE_WAIT有很大可能是服务端没有及时发送出FIN报文,也就是没有主动close或者shutdown,这种一般是代码写得有问题