15-17.【HTTP】TCP 三次握手和四次挥手?为什么 TCP 是可靠的?

2 阅读2分钟

1️⃣ TCP 三次握手(建立连接)

三次握手是 TCP 在客户端与服务器建立可靠连接时的流程:

步骤发起方内容说明
SYN客户端 → 服务器发送 SYN 报文,随机序列号 seq = x表示客户端希望建立连接
SYN-ACK服务器 → 客户端回复 SYN + ACK,seq = y, ack = x+1服务器确认客户端请求,并发送自己的序列号
ACK客户端 → 服务器ACK,ack = y+1客户端确认服务器序列号,连接建立完成

✅ 建立连接后,客户端和服务器都知道对方的初始序列号,从而保证可靠数据传输。


2️⃣ TCP 四次挥手(断开连接)

四次挥手用于正常关闭连接,因为 TCP 是 全双工,两边都要单独关闭发送方向。

步骤发起方内容状态说明
FIN客户端 → 服务器发送 FIN,表示客户端没有数据要发进入 FIN_WAIT_1
ACK服务器 → 客户端ACK = seq+1客户端进入 FIN_WAIT_2,服务器进入 CLOSE_WAIT
FIN服务器 → 客户端服务器也发送 FIN服务器进入 LAST_ACK
ACK客户端 → 服务器ACK = seq+1客户端进入 TIME_WAIT,等待最大报文寿命后关闭;服务器关闭

⚠️ 四次挥手比三次握手多一次,是因为关闭连接是单向的,需要双方确认。


3️⃣ TCP 为什么可靠?

TCP 之所以可靠,主要依赖以下机制:

  1. 序列号(Sequence Number)

    • 数据包按序号排序,保证顺序到达。
  2. 确认应答(ACK)

    • 收到数据包后返回 ACK,没有收到则重传。
  3. 重传机制

    • 基于超时和重复 ACK,丢包自动重传。
  4. 流量控制(Flow Control)

    • 使用滑动窗口(Window Size)控制发送速率,避免接收端缓冲区溢出。
  5. 拥塞控制(Congestion Control)

    • 慢启动、拥塞避免、快重传、快恢复等算法防止网络拥堵。
  6. 校验和(Checksum)

    • 检测数据在传输过程中是否被篡改或损坏。

4️⃣ iOS 开发实践角度

  • URLSession / NSStream / Network.framework 都基于 TCP 或 QUIC(HTTP/3 使用 UDP)。
  • iOS 开发者通常不用自己实现三次握手、重传或拥塞控制,但理解它们对 网络延迟、重试策略、性能优化 非常重要。
  • 对于实时通信场景(如 WebRTC 或游戏),可能选择 UDP + 应用层可靠性 来绕过 TCP 的队头阻塞。