TCP断开连接四次挥手

TCP 四次挥手是 TCP 协议断开连接的标准流程。因为 TCP 是一种全双工通信(双方可以同时收发数据)的协议,所以在断开连接时,通信双方的发送通道必须各自独立关闭,总共需要 4 次报文交互。

假设由客户端主动发起关闭请求,服务端被动响应,以下是四次挥手的详细步骤:

🌊 TCP 四次挥手完整流程

复制代码
客户端(主动断)                 服务端(被动断)
  ESTABLISHED                  ESTABLISHED
      |                            |
1.发 FIN=1 seq=u  -------------->  |
    进入 FIN_WAIT1                 |
                                   |
2.  <------------ ACK=1 ack=u+1  收FIN
                                   进入 CLOSE_WAIT
客户端收到ACK → 进入 FIN_WAIT2
                                   服务端继续发剩余数据
      |                            |
3.  <------------ FIN=1 seq=v     数据发完,主动关自己写通道
                                   进入 LAST_ACK
      |                            |
4.发 ACK=1 ack=v+1 --------------> |
进入 TIME_WAIT                     收到ACK → 进入 CLOSED
等待2MSL后客户端最终 CLOSED

第 1 次挥手:主动关闭方发送 FIN 报文

  • 动作 :客户端数据发送完毕,向服务端发送一个 FIN=1 的报文,表示"我没有数据要发了,请求关闭我这一侧的连接"。
  • 状态变化 :客户端从 ESTABLISHED(已建立连接)转变为 FIN_WAIT_1(等待终止)。

第 2 次挥手:被动关闭方回复 ACK

  • 动作 :服务端收到 FIN 后,立即回复一个 ACK 确认报文,表示"我知道你要关闭了"。
  • 状态变化 :服务端从 ESTABLISHED 转变为 CLOSE_WAIT(等待关闭);客户端收到确认后,从 FIN_WAIT_1 转变为 FIN_WAIT_2
  • 注意:此时连接处于**半关闭(Half-Close)**状态。客户端不能再发数据,但可以接收数据;服务端如果还有剩余数据没发完,可以继续发给客户端。

第 3 次挥手:被动关闭方发送 FIN 报文

  • 动作 :当服务端的数据也全部发送完毕后,它会向客户端发送一个 FIN=1 的报文,表示"我也发完了,现在请求关闭我的发送通道"。
  • 状态变化 :服务端从 CLOSE_WAIT 转变为 LAST_ACK(最后确认)。

第 4 次挥手:主动关闭方回复 ACK

  • 动作 :客户端收到服务端的 FIN 后,回复最后一次 ACK 确认报文,表示"我知道了,连接正式关闭"。
  • 状态变化 :客户端进入 TIME_WAIT(时间等待)状态,等待一段时间后才会彻底释放资源;服务端收到这个 ACK 后,立刻进入 CLOSED(关闭)状态。

💡 核心问题解析

为什么握手是 3 次,而挥手是 4 次?

这是面试中非常经典的问题,核心原因在于 TCP 的全双工特性 以及 ACK 与 FIN 报文的分离

  • 三次握手时:服务端收到客户端的连接请求(SYN)后,可以立刻把"同意连接"(ACK)和"我也要连接"(SYN)合并在同一个报文里发回去,节省了一次交互。
  • 四次挥手时 :当服务端收到客户端的关闭请求(FIN)时,它可能还有部分数据没有传输完成,不能立刻关闭自己的发送通道。因此,服务端必须先单独回复一个 ACK 告知"收到了",等自己真正处理完所有数据后,再单独发送一个 FIN 来请求关闭。这就导致无法合并,必须进行 4 次交互。
为什么主动关闭方最后要进入 TIME_WAIT 状态并等待 2MSL?

主动关闭方在发出最后一个 ACK 后,不会立刻关闭,而是会等待 2MSL(最长报文寿命的两倍)的时间,主要有两个作用:

  1. 保证最后一个 ACK 到达对方 :如果这个最后的 ACK 在网络中丢失了,服务端会因为超时重传第 3 次挥手的 FIN 报文。处于 TIME_WAIT 状态的客户端就能再次收到并重发 ACK,确保服务端能正常关闭。
  2. 防止旧连接的报文干扰新连接:等待 2MSL 可以让本次连接中所有滞留在网络中的残留报文自然失效消失,避免它们跑到下一次新建的连接中造成数据混乱。
  3. Linux 默认 MSL=30s2MSL=60秒

总结:

  • 主动方:ESTABLISHEDFIN_WAIT1FIN_WAIT2TIME_WAITCLOSED
  • 被动方:ESTABLISHEDCLOSE_WAITLAST_ACKCLOSED
相关推荐
闲人编程1 小时前
Agent的安全边界:如何防止AI失控(对齐问题)
网络·python·ai·agent·权限·智能体·cai
2401_8734794010 小时前
运营活动被薅羊毛怎么防?用IP查询+设备指纹联动封堵漏洞
java·网络·tcp/ip·github
应用市场10 小时前
Android A/B 无缝更新机制深度剖析
android·网络
rosemary51211 小时前
SOME/IP初试
网络·网络协议·tcp/ip·someip
不知名的老吴11 小时前
认识Python网络套接字编程
网络
Yang961112 小时前
鼎讯 SZT-2000A:铁路高速万兆网络一站式测试方案
网络
星恒讯工业路由器12 小时前
星恒讯5G工业级通信模组选型指南:接口配置、工业防护与应用场景详解
网络·物联网·5g·信息与通信
云边云科技_云网融合13 小时前
企业出海的 “数字丝绸之路“:SD-WAN 如何重构全球网络竞争力
大数据·运维·网络·人工智能