TCP 三次握手和 四次挥手

4 阅读3分钟

三次握手 (TCP 连接建立)

三次握手的目的是确保双方都具备发送和接收数据的能力,并且能正确同步初始序列号(ISN, Initial Sequence Number)。

过程

  1. 客户端 → 服务器:SYN

    • 客户端发送 SYN(同步)包给服务器,并选择一个初始序列号 (ISN=x)
    • 目的:告知服务器希望建立连接,并告知自己的序列号。
  2. 服务器 → 客户端:SYN + ACK

    • 服务器收到 SYN 后,返回 SYN-ACK(同步 + 确认)包:
      • ACK 确认 客户端的 ISN(x+1)
      • 服务器自己也生成一个 ISN (ISN=y),并发送 SYN 给客户端。
  3. 客户端 → 服务器:ACK

    • 客户端收到 SYN-ACK 后,发送 ACK 确认:
      • 确认 服务器的 ISN(y+1)
    • 连接建立,数据可以开始传输。

这个握手步骤发生在 DNS 查询之后,TLS 握手(用于创建安全连接)之前。连接可以由连接的每一方独立终止,通过四次挥手,每一方独立地发送和接收一对 FIN(结束)和 ACK 消息。


四次挥手 (TCP 连接终止)

四次挥手的目的是确保数据传输完成后,双方都能优雅地关闭连接。

过程

  1. 客户端 → 服务器:FIN

    • 客户端发送 FIN(Finish)包,表明 不再发送数据,但仍然可以接收数据。
    • 进入 FIN_WAIT_1 状态。
  2. 服务器 → 客户端:ACK

    • 服务器收到 FIN 后,发送 ACK 确认。
    • 此时连接处于 半关闭 状态,服务器仍然可以向客户端发送数据。
    • 服务器进入 CLOSE_WAIT 状态。
  3. 服务器 → 客户端:FIN

    • 服务器在发送完最后的数据后,发送 FIN,表示也要关闭连接。
  4. 客户端 → 服务器:ACK

    • 客户端收到 FIN 后,发送 ACK,确认关闭。
    • 进入 TIME_WAIT 状态(等待一段时间,确保服务器收到 ACK)。
    • 最终连接关闭。

补充细节

  1. 为什么三次握手需要三步?

    • 防止历史重复连接:如果只有两步,旧的 SYN 可能会被误认为是新连接,造成数据错误。
    • 确保双方的发送和接收能力都正常。
  2. 为什么四次挥手需要四步?

    • TCP 连接是 全双工(即双方可以同时发送和接收),所以需要 双方分别关闭 各自的数据流。
    • 服务器可能需要等待数据发送完毕后再关闭,所以不能立即发送 FIN。
  3. TIME_WAIT 状态的作用

    • 客户端在关闭后,会进入 TIME_WAIT 状态,保持一段时间(一般是 2 倍的 MSL,最大段生存时间)。
    • 目的:
      • 确保最后的 ACK 能够被服务器收到,避免服务器误以为连接未完全关闭。
      • 防止旧的重复数据包被误认为是新连接的数据包。

总结

  • 三次握手 用于 建立连接,确保通信双方的收发能力正常,并同步初始序列号。
  • 四次挥手 用于 终止连接,保证双方都能正确关闭数据流,防止数据丢失。
  • TIME_WAIT 状态用于防止旧数据包干扰新连接,确保连接真正关闭。

这就是 TCP 可靠性的关键,也是其区别于 UDP(无连接)的重要特性! 🚀