https://www.eet-china.com/mp/a44399.html
当我们的应用程序不需要数据通信了,就会发起断开 TCP 连接。建立一个连接需要三次握手,而终止一个连接需要经过四次挥手。
FIN
包(FIN = 1),客户端进入 FIN_WAIT_1
状态。TCP 规定,即使 FIN
包不携带数据,也要消耗一个序号。FIN
包,发出确认包 ACK
(ack = u + 1),并带上自己的序号 seq = v,服务端进入 CLOSE_WAIT
状态。这个时候客户端已经没有数据要发送了,不过服务器端有数据发送的话,客户端依然需要接收。客户端接收到服务器端发送的 ACK 后,进入了 FIN_WAIT_2 状态。FIN
包(seq = w ack = u + 1),连接状态下服务器可能又发送了一些数据,假设发送 seq 为 w。服务器此时进入了 LAST_ACK 状态。FIN
包后,发出确认包(ACK=1,ack=w+1),此时客户端就进入了 TIME_WAIT
状态。注意此时 TCP 连接还没有释放,必须经过 2*MSL
后,才进入 CLOSED
状态。而服务器端收到客户端的确认包 ACK
后就进入了 CLOSED
状态,可以看出服务器端结束 TCP 连接的时间要比客户端早一些。