连接释放
TCP连接包括连接建立、报文传输与连接释放3个阶段,连接建立经过“三次握手”过程,连接释放通过“四次挥手”过程,客户端与服务器端都可以主动提出释放连接的请求。
四次挥手
下面是客户端主动提出连接释放:
(1)当客户端提出释放TCP连接时,进入“FIN+WAIT-1”状态,向服务器端发送第一个“FIN”(控制位FIN=1)。
(2)服务器端在接收到“FIN”报文之后,立即向客户端发回“ACK”报文,表示对请求报文的确认。此时处于“半关闭”状态:客户端到服务器端的TCP连接已经断开,但是服务器端到客户端的TCP连接还没断开,服务器有需要还可以继续发送数据,一段时间后服务器进入“CLOSE-WAIT”状态。当客户端接收到ACK报文后会进入“FIN+WAIT-2”状态。
(3)当服务器端已经没数据需要发送时,会向客户端发送“FIN”报文,服务器端此时经过“LAST-ACK”状态转为“LISTEN”状态。
(4)客户端接收到“FIN”报文之后,向服务器发送“ACK”报文,表示确认。此时,客户端进入“TIME_WAIT”状态,等待2个最长报文寿命MSL之后,进入“CLOSE”状态。
TIME_WAIT状态
作用
1.保证 TCP 连接能够正常关闭,即被动关闭连接的一方能够收到 FIN 对应的 ACK 。如果被动方等待一段时间仍未收到ACK,会重传FIN报文,此时处于time_wait状态的主动关闭方收到FIN后可以重新发送ACK。
2.防止延迟的数据段被其他使用相同源地址、源端口、目的地址以及目的端口的新建立的TCP 连接收到,这可能会导致延迟数据段被当做新的数据段接收,导致错误。