TCP的状态转换
当客户端首先提出要关闭连接,客户端会首先发送连接释放报文,这时客户端进入FIN_WAIT_1状态,之后,客户端收到来自服务端的确认报文,那么,TCP进入FIN_WAIT_2状态。之后,当服务端想要关闭连接时,也会向客户端发送连接释放报文,这时客户端进入TIME_WAIT状态。
TIME_WAIT状态也被称为2MSL状态。在该状态中,TCP将会等待两倍于最大段生存期(Maximum Segment Lifetime,MSL)的时间。
在客户端先提出关闭连接的场景下,当服务端向客户端发送连接释放报文之后,如果客户端给服务端发送了确认报文ACK,但是该ACK未能及时到达服务端,那么服务端会因为超时而重传连接释放报文FIN(这个报文消耗一个序号),从而导致客户端重新发送ACK。因此,在客户端发送完ACK报文后,必须等待2MSL的时间,以防服务端没能收到ACK报文,而进行了FIN报文的重传。如果在2MSL的时间内没有收到来自服务端的新的FIN,那么说明服务端安全收到了客户端发送的ACK报文,连接正确关闭了。