image.png
我这里大概讲一下:
1.客户端在主动关闭的时候,发送flag为FIN=1的包给服务端,这个时候客户端的状态变为FIN_WAIT-1
2.服务端接收到了客户端的FIN包之后,发送一个确认ACK包,自己变成了了close-wait状态,客户端接收到了数据之后状态变为 wait2,服务端之后要关闭后,还需要把所有数据给发送完毕才能真正关闭
3.当服务端数据发送完毕,发送第二次ACK包给客户端,同时状态变为了last-ack,客户端接收到之后会发送给服务端一个ACK包,然后会等待 2分钟的最长报文等待时间,在这个时间段如果没有重连就会处于关闭状态,服务端接收到数据之后状态变更为closed。
为什么会有time-wait状态呢?
image.png
第一个原因就是需要确保有足够的时间让对方收到ACK包, 如果服务端没有收到ACK包,就会重发FIN包给客户端,一来一去正好是两个MSL,也就是2分钟的时间;
第二个原因就是允许老的重复分节在网络中消逝。(TCP中是可靠的服务,当数据包丢失会重传,当有数据包迷路的情况下,如果不等待2MSL时,当客户端以同样地方式重新和服务建立连接后,上一次迷路的数据包这时可能会到达服务,这时会造成旧包被重新读取)。
image.png
image.png
服务器出现大量time-wait状态原因
image.png
image.png
image.png