5.TCP的四次挥手_客户端 image.png

我这里大概讲一下:

1.客户端在主动关闭的时候,发送flag为FIN=1的包给服务端,这个时候客户端的状态变为FIN_WAIT-1

2.服务端接收到了客户端的FIN包之后,发送一个确认ACK包,自己变成了了close-wait状态,客户端接收到了数据之后状态变为 wait2,服务端之后要关闭后,还需要把所有数据给发送完毕才能真正关闭

3.当服务端数据发送完毕,发送第二次ACK包给客户端,同时状态变为了last-ack,客户端接收到之后会发送给服务端一个ACK包,然后会等待 2分钟的最长报文等待时间,在这个时间段如果没有重连就会处于关闭状态,服务端接收到数据之后状态变更为closed。

5.TCP的四次挥手_服务端_02

为什么会有time-wait状态呢?

5.TCP的四次挥手_服务端_03 image.png


第一个原因就是需要确保有足够的时间让对方收到ACK包, 如果服务端没有收到ACK包,就会重发FIN包给客户端,一来一去正好是两个MSL,也就是2分钟的时间;

第二个原因就是允许老的重复分节在网络中消逝。(TCP中是可靠的服务,当数据包丢失会重传,当有数据包迷路的情况下,如果不等待2MSL时,当客户端以同样地方式重新和服务建立连接后,上一次迷路的数据包这时可能会到达服务,这时会造成旧包被重新读取)。

5.TCP的四次挥手_服务端_04 image.png

5.TCP的四次挥手_客户端_05 image.png

服务器出现大量time-wait状态原因

5.TCP的四次挥手_客户端_06 image.png

5.TCP的四次挥手_客户端_07 image.png

5.TCP的四次挥手_数据_08 image.png