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状态。
排查程序自身的问题:
是否对方发送关闭连接自己没有检测到自己得知对方关闭连接却没有做任何事情。