1. 建立可靠连接:三次握手

  • SYN:客户端发送同步序列号(SYN=1, seq=x)。

  • SYN-ACK:服务端确认并同步自己的序列号(SYN=1, ACK=1, seq=y, ack=x+1)。

  • ACK:客户端再确认(ACK=1, seq=x+1, ack=y+1)。

  • 作用:同步初始序列号、确认双方收发能力、防止历史连接初始化。

2. 数据按序到达:序列号与确认应答

  • 序列号(Sequence Number):每个字节都有编号,保证按序重组。

  • 确认号(Acknowledgment Number):期望收到的下一个字节序号。

  • 累积确认:ACK 表示该序号之前的所有数据已正确接收。

3. 丢包重传:超时重传 + 快速重传

  • 超时重传(RTO):发送端为每个报文段维护定时器,超时未收到 ACK 即重传。

    • RTO 基于 RTT 动态计算(Jacobson/Karels 算法)。
  • 快速重传:连续收到 3 个重复 ACK 立即重传丢失段,无需等待超时。

4. 流量控制:滑动窗口

  • 接收窗口(rwnd):接收方通过 TCP 首部 Window 字段告知可接收缓冲区大小。

  • 发送窗口:发送方根据 rwnd 与拥塞窗口 cwnd 的最小值决定可发送数据量,防止接收端溢出。

5. 拥塞控制:防止网络过载

  • 慢启动(Slow Start):cwnd 指数增长,直到阈值 ssthresh。

  • 拥塞避免(Congestion Avoidance):cwnd 线性增长。

  • 快重传 + 快恢复:发生 3 个重复 ACK 时,ssthresh = cwnd/2,cwnd = ssthresh + 3 MSS,进入快恢复。

  • 超时重传:RTO 超时,ssthresh = cwnd/2,cwnd = 1 MSS,重新慢启动。

6. 数据完整性:校验和

  • 发送端计算首部+数据的 16 位反码和,接收端验证;若不一致则丢弃并要求重传。

7. 连接优雅关闭:四次挥手

  • FIN:主动方发送结束标志。

  • ACK:被动方确认。

  • FIN:被动方数据发送完毕后再发 FIN。

  • ACK:主动方确认,进入 TIME_WAIT(2MSL)确保最后一个 ACK 到达。