TimeWait
状态会出现在什么时候?服务端出现大量TimeWait
状态怎么办?
TimeWait
出现在四次挥手中。
我们可以先画出四次挥手的图。
C S
Fin_Wait_1 ----->
<------ Close_Wait
Fin_Wait_2
<------ Last_Ack
Time_Wait ----->
Close
Close
首先客户端向服务端发送Fin
标志位,表示要进入关闭连接了,客户端进入Fin_Wait_1
状态。
服务端向客户端发送ACK
标志,表示已经收到关闭连接的请求了,但是可能还有一部分数据没有发送完毕,服务端进入Close_Wait
状态。客户端收到后进入Fin_Wait_2
状态。
等待服务端把数据传输完毕后,向客户端发送Fin、ACK
标志,表示已经发送完剩下的数据了。服务端进入Last_Ack
状态,客户端收到后进入Time_Wait
状态。
客户端向服务端发送Ack
标志,表示自己已经收到了关闭连接的请求。在等待 2倍的最大传输数据长度后,客户端会关闭。
如果服务端出现大量Time_Wait
状态,表示服务端可能在此次连接中扮演客户端的角色,去访问另一个服务器。
此时,由于连接关闭数量多,默认的2MSL时间过于长,导致存在大量TimeWait
状态,可以通过调整TimeWait
等待的时间来减少出现TimeWait
的数量。
Close_Wait
状态出现在什么时候?服务端出现大量Close_Wait
怎么办?
Close_Wait
状态出现在四次挥手中。
如果客户端先关闭,服务端收到了这个关闭请求,但是没有处理,就会堆积大量的Close_Wait
状态。
排查程序自身的问题:
- 是否对方发送关闭连接自己没有检测到
- 自己得知对方关闭连接却没有做任何事情。