详解TCP的四次握手和三次挥手,以及里面每个阶段的状态

发布于:2025-03-28 ⋅ 阅读:(23) ⋅ 点赞:(0)

TCP 三次握手(连接建立)

TCP 连接建立通过三次握手完成,确保双方同步初始序列号并确认可达性。

阶段说明
  1. 第一次握手

    • 客户端 → 服务器:发送 SYN(同步请求),携带初始序列号 seq = x
    • 客户端状态SYN_SENT(等待服务器响应)。
  2. 第二次握手

    • 服务器 → 客户端:回复 SYN + ACK,确认客户端的 seqack = x + 1),并发送自己的初始序列号 seq = y
    • 服务器状态SYN_RCVD(等待客户端确认)。
  3. 第三次握手

    • 客户端 → 服务器:发送 ACK,确认服务器的 seqack = y + 1)。
    • 客户端状态ESTABLISHED(连接成功)。
    • 服务器状态:收到 ACK 后进入 ESTABLISHED

TCP 四次挥手(连接关闭)

TCP 连接关闭需要四次挥手,因为服务器可能需要时间处理未发送的数据。

阶段说明
  1. 第一次挥手

    • 客户端 → 服务器:发送 FIN(结束请求),请求关闭写通道,携带序列号 seq = u
    • 客户端状态FIN_WAIT_1(等待服务器确认)。
  2. 第二次挥手

    • 服务器 → 客户端:回复 ACK,确认客户端的 FINack = u + 1),并继续处理剩余数据。
    • 服务器状态CLOSE_WAIT(等待应用层关闭连接)。
    • 客户端状态:收到 ACK 后进入 FIN_WAIT_2(等待服务器关闭)。
  3. 第三次挥手

    • 服务器 → 客户端:发送 FIN,携带序列号 seq = v,表示数据已发送完毕。
    • 服务器状态LAST_ACK(等待客户端最终确认)。
  4. 第四次挥手

    • 客户端 → 服务器:回复 ACK,确认服务器的 FINack = v + 1)。
    • 客户端状态:进入 TIME_WAIT(等待 2MSL 确保所有数据包消失)。
    • 服务器状态:收到 ACK 后直接关闭,进入 CLOSED
    • 客户端最终状态TIME_WAIT 超时后进入 CLOSED

状态转换总结

阶段 客户端状态 服务器状态 事件
连接建立 SYN_SENT → ESTABLISHED SYN_RCVD → ESTABLISHED SYN → SYN+ACK → ACK
连接关闭 FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED CLOSE_WAIT → LAST_ACK → CLOSED FIN → ACK → FIN → ACK

关键细节

  • SYN 洪泛攻击:利用 SYN_SENT 状态耗尽服务器资源,需通过 SYN Cookie 等机制防御。
  • TIME_WAIT 作用:确保最后一个 ACK 到达服务器,避免旧连接的数据包干扰新连接。
  • 半关闭状态FIN_WAIT_2 时客户端仍可接收数据,服务器需主动关闭。

通过四次挥手,TCP 确保数据完整传输后优雅断开连接。