TCP四次挥手过程
字数 1885 2025-11-02 08:11:07
TCP四次挥手过程
TCP四次挥手是TCP连接终止时使用的过程,确保双方都能安全地关闭连接。它涉及客户端和服务器之间交换四个特定的报文段。
详细过程:
-
第一次挥手(FIN from Client)
- 描述: 当客户端的数据发送完毕,并决定关闭连接时,它会向服务器发送一个TCP报文段。这个报文段的首部中,FIN(Finish)标志位被设置为1。同时,它还会包含一个序列号(Seq),假设为
u,这个序列号是客户端之前发送的最后一个数据字节的序列号加1。 - 客户端状态变化: 发送完FIN报文后,客户端的状态从
ESTABLISHED(连接已建立)变为FIN-WAIT-1(终止等待1)。这意味着客户端已经不再发送数据,并开始等待服务器的确认。
- 描述: 当客户端的数据发送完毕,并决定关闭连接时,它会向服务器发送一个TCP报文段。这个报文段的首部中,FIN(Finish)标志位被设置为1。同时,它还会包含一个序列号(Seq),假设为
-
第二次挥手(ACK from Server)
- 描述: 服务器收到客户端的FIN报文后,必须做出确认。它会向客户端发送一个确认(ACK)报文段。这个报文段的首部中,ACK标志位被设置为1,并且确认号(Ack)字段的值为
u + 1(即客户端的序列号u加1)。这向客户端表明:“你发送的FIN报文我收到了,其序列号是u。” - 服务器状态变化: 发送完这个ACK报文后,服务器进入
CLOSE-WAIT(关闭等待)状态。此时,连接处于“半关闭”状态:客户端到服务器的方向已经关闭(客户端不再发数据,服务器也不再接收数据),但服务器到客户端的方向仍然开放,服务器可能还有未发送完的数据需要继续发送给客户端。 - 客户端状态变化: 客户端收到服务器的ACK报文后,就知道服务器已经同意关闭它这一侧的连接。客户端的状态随之从
FIN-WAIT-1变为FIN-WAIT-2(终止等待2)。此时,客户端仍在等待服务器发送它自己的FIN报文。
- 描述: 服务器收到客户端的FIN报文后,必须做出确认。它会向客户端发送一个确认(ACK)报文段。这个报文段的首部中,ACK标志位被设置为1,并且确认号(Ack)字段的值为
-
第三次挥手(FIN from Server)
- 描述: 当服务器也将自己的所有数据发送完毕后,它也会准备关闭连接。此时,服务器会向客户端发送一个FIN报文段。这个报文段的首部中,FIN标志位被设置为1。假设服务器发送的这个FIN报文段的序列号为
w。 - 注意: 在实际实现中,这第二个FIN报文常常会与第二次挥手的ACK报文合并发送,以提升效率。也就是说,服务器可能直接发送一个同时设置了
ACK和FIN标志位的报文,从而将挥手次数减少到三次。但理论上,这是两个独立的步骤。 - 服务器状态变化: 发送完FIN报文后,服务器的状态从
CLOSE-WAIT变为LAST-ACK(最后确认)。这意味着服务器已经发送了关闭请求,现在正在等待客户端的最终确认。
- 描述: 当服务器也将自己的所有数据发送完毕后,它也会准备关闭连接。此时,服务器会向客户端发送一个FIN报文段。这个报文段的首部中,FIN标志位被设置为1。假设服务器发送的这个FIN报文段的序列号为
-
第四次挥手(ACK from Client)
- 描述: 客户端收到服务器的FIN报文后,必须发送一个确认报文。这个报文段的首部中,ACK标志位被设置为1,并且确认号(Ack)字段的值为
w + 1(即服务器的序列号w加1)。 - 客户端状态变化: 发送完这个ACK报文后,客户端并不会立即关闭连接,而是进入
TIME-WAIT(时间等待)状态。在这个状态下,客户端会等待一段时长,这个时长通常设置为 2MSL(Maximum Segment Lifetime,报文最大生存时间,通常是2分钟,但实际实现中常设为30秒或1分钟)。- 等待2MSL的原因主要有两个:
- 确保客户端的最后一个ACK能到达服务器: 如果这个ACK在网络上丢失,服务器在超时后会重新发送FIN报文。客户端在
TIME-WAIT状态下收到这个重传的FIN后,可以再次发送ACK,从而保证关闭过程能可靠完成。 - 让本次连接的所有报文都在网络中消失: 等待2MSL时间,可以确保这个连接所产生的所有报文都已经从网络中失效,这样再建立新的连接时,就不会出现旧连接的延迟报文干扰新连接的情况。
- 确保客户端的最后一个ACK能到达服务器: 如果这个ACK在网络上丢失,服务器在超时后会重新发送FIN报文。客户端在
- 等待2MSL的原因主要有两个:
- 服务器状态变化: 服务器一旦收到客户端的最后一个ACK报文,就确认连接已完全关闭,随即进入
CLOSED(关闭)状态,释放所有相关资源。 - 最终关闭: 客户端在
TIME-WAIT状态等待2MSL时间结束后,也会进入CLOSED状态,彻底释放资源。至此,整个TCP连接完全关闭。
- 描述: 客户端收到服务器的FIN报文后,必须发送一个确认报文。这个报文段的首部中,ACK标志位被设置为1,并且确认号(Ack)字段的值为
总结: 四次挥手可以通俗地理解为一次礼貌的告别:
- 客户端:“我说完了,要挂了哦?”(FIN)
- 服务器:“好的,我知道你要挂了。”(ACK)...(服务器处理完自己的事)...“我也说完了,那我挂了?”(FIN)
- 客户端:“好的,挂吧。”(ACK)
- 双方各自确认后,才真正挂断电话。