Administrator
Published on 2025-03-12 / 5 Visits
0
0

TCP 四次挥手详解及机制解析

TCP 的四次挥手是用于可靠终止连接的过程,确保双方都能安全关闭通信。以下是详细步骤和逻辑:


四次挥手流程

  1. 第一次挥手(FIN)

    • 主动关闭方(如客户端)发送 FIN=1 报文,进入 FIN_WAIT_1 状态,表示不再发送数据,但可接收数据。
  2. 第二次挥手(ACK)

    • 被动关闭方(如服务器)收到 FIN 后,回复 ACK 确认,进入 CLOSE_WAIT 状态。
    • 客户端收到 ACK 后进入 FIN_WAIT_2 状态,等待服务器的关闭请求。
    • 此时连接处于半关闭状态:服务器仍可向客户端发送剩余数据。
  3. 第三次挥手(FIN)

    • 服务器处理完数据后,发送 FIN=1 报文,进入 LAST_ACK 状态,表示准备关闭。
  4. 第四次挥手(ACK)

    • 客户端收到 FIN 后,回复 ACK 确认,进入 TIME_WAIT 状态,等待 2MSL(最大报文生存时间)后关闭。
    • 服务器收到 ACK 后立即关闭连接。

关键机制解析

  1. 为什么需要四次?

    • TCP 是全双工协议,双方需独立关闭各自的通道。
    • 被动关闭方可能需要时间处理剩余数据,因此 ACKFIN 分开发送(无法合并为三次)。
  2. TIME_WAIT 的作用

    • 防止旧连接的延迟报文干扰新连接(相同端口复用场景)。
    • 确保被动关闭方收到最后的 ACK(若 ACK 丢失,被动方会重传 FIN,客户端可再次响应)。
  3. CLOSE_WAIT 状态的意义

    • 表示被动关闭方正在处理关闭前的收尾工作(如释放资源或发送剩余数据)。

特殊情况

  • 三次挥手可能吗?
    如果服务器没有数据要发送,可能将 ACKFIN 合并为一次发送(变为三次),但多数场景仍为四次。

示意图

客户端         服务器
  |––FIN––>       (客户端:FIN_WAIT_1)
  |<––ACK–––      (服务器:CLOSE_WAIT;客户端:FIN_WAIT_2)
  |<––FIN–––      (服务器:LAST_ACK)
  |––ACK–––>      (客户端:TIME_WAIT → 关闭;服务器:关闭)

理解四次挥手的关键是认识到 TCP 的双向通道独立关闭机制,以及通过状态和计时器保证可靠性。


Comment