(1)四次挥手的过程
- 第一次挥手:客户端发送一个带有FIN标志位的TCP段给服务端,表示自己要断开数据传送,报文中会指定一个序列号
(seq=x)
。然后,客户端进入FIN-WAIT-1(终止等待-1)
状态。 - 第二次挥手:服务端收到
FIN
报文后,回复ACK
报文给客户端,且把客户端的序列号值+1
,作为ACK+1
报文的序列号(seq=x+1)
。然后,服务端进入CLOSE-WAIT``(seq=x+1)(关闭等待)
状态,客户端进入FIN-WAIT-2
状态。 - 第三次挥手:服务端也要断开连接时,发送
FIN
报文给客户端,且指定一个序列号(seq=y+1)
,随后服务端进入LAST-ACK(最后确认)
状态。 - 第四次挥手:客户端收到
FIN
报文后,发出ACK
报文进行应答,并把服务端的序列号值+1
作为ACK
报文序列号(seq=y+2)
。此时客户端进入TIME-WAIT(时间等待)
状态。服务端在收到客户端的ACK
报文后进入CLOSE
状态。如果客户端等待2MSL(最长报文段寿命)
没有收到回复,才关闭连接。
为什么需要四次挥手,而不是三次或更多次,原因如下:
TCP
是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。 当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后才会完全关闭 TCP
连接。因此两次握手可以释放一端到另一端的TCP
连接,完全释放连接一共需要四次握手。
只有通过四次挥手,才可以确保双方都能接收到对方的最后一个数据段的确认,
在TCP连接的关闭过程中,如果被动关闭方没有收到主动关闭方的最终确认(ACK),它可能会重新发送它的最终数据(FIN)。time-wait状态确保即使在这种情况下,主动关闭方仍然能够接收到这些重复的FIN,并重新发送确认,直到被动关闭方放弃重传。
如果是三次握手
如果一方在发送了FIN后立即关闭连接,而另一方没有收到这个FIN,那么另一方可能会一直等待,浪费资源。四次挥手确保了双方都可以确认连接的关闭,避免资源浪费。