1. TCP 重传概述

TCP(Transmission Control Protocol)是现代网络通信的基础协议之一,负责在应用程序和设备之间可靠地传输数据。为了保证数据传输的可靠性,TCP 引入了重传机制(Retransmission),用于在网络丢包时重新发送未被确认的数据。

本文将深入讲解 TCP 重传的原理、触发条件及其背后的技术逻辑,适合有一定网络编程经验的开发者参考。

2. TCP 重传的定义与原理

TCP 是一种面向连接的、可靠的、基于字节流的协议。它通过将数据拆分为TCP 段(Segment),封装在 IP 数据包中进行传输。

与 UDP 不同,TCP 会确保所有数据都能正确送达。当某个数据段在网络中丢失时,接收方不会收到该段,也就无法发送对应的 ACK(确认应答)。发送方通过两种机制检测到丢包并进行重传:

超时重传(Retransmission on Timeout)
快速重传(Fast Retransmission,基于三个重复 ACK)

在连接建立阶段,TCP 使用经典的三次握手建立连接,如下图所示:

3-way handshake

连接建立后,发送方开始传输数据。如果某个段未被确认,就会触发重传机制。

3. 网络丢包的常见原因

网络传输过程中,数据包丢失是常见现象,主要原因包括:

  • 信道噪声:随机丢包,可能由电磁干扰、信号衰减等引起
  • 信道干扰:如 Wi-Fi 网络中多个设备竞争信道,造成结构化或周期性丢包
  • 链路中断:如移动网络掉线,造成一段时间内全部丢包
  • 冲突重传:在共享信道中使用 CSMA/CD 或 CSMA/CA 协议时,发生冲突导致丢包
  • 拥塞丢包:路由器缓冲区溢出,导致丢弃新到达的数据包
  • 实现错误:如网卡故障、驱动 bug、软件异常等

丢包率和模式取决于物理层和链路层的设计,不同网络环境表现差异较大。

4. TCP 重传的触发时机

TCP 重传主要在以下两种情况下发生:

4.1 超时重传(Retransmission After Timeout)

发送方每发送一个 TCP 段后,都会启动一个定时器。如果在定时器到期前没有收到 ACK,则认为该段丢失,触发重传。

流程如下:

  1. 发送段,启动定时器
  2. 收到 ACK → 停止定时器
  3. 定时器到期未收到 ACK → 重传段,重置定时器

示意图如下:

Retransmission after Time Out Timer expiry

4.2 快速重传(Fast Retransmission)

当发送方连续收到三个重复的 ACK(Duplicate ACK)时,立即重传对应段,而不必等待定时器到期。

工作流程示例:

假设发送方发送了段 1~5,其中段 2 丢失,接收方的行为如下:

  • 收到段 1 → 发送 ACK 2(期待段 2)
  • 收到段 3 → 发送 ACK 2(重复 ACK)
  • 收到段 4 → 发送 ACK 2(重复 ACK)
  • 收到段 5 → 发送 ACK 2(重复 ACK)

发送方收到三个 ACK 2 后,立即重传段 2。

重传后接收方收到段 2,此时它已经收到了段 3~5,因此直接返回 ACK 6。

示意图如下:

Retransmission after receiving 3 duplicate ACKs

⚠️ 注意:这种机制依赖于接收方的“冗余 ACK”行为,也被称为快速重传(Fast Retransmit)算法

5. 总结

TCP 的重传机制是其可靠传输的核心保障之一。本文总结了以下关键点:

机制 触发条件 特点
超时重传 定时器到期 简单可靠,但响应慢
快速重传 收到三个重复 ACK 反应快,但依赖接收端行为

通过这两种机制,TCP 能在不可靠的网络环境中实现可靠的数据传输,提升整体网络通信的稳定性和性能。

建议:在实际开发中,理解 TCP 重传机制有助于分析网络延迟、优化通信性能,尤其是在高丢包率或高延迟的网络环境下。


如需进一步了解 TCP 的流量控制和拥塞控制机制,可继续阅读相关文章。


原始标题:Retransmission Rules for TCP

« 上一篇: Gibbs 采样简介
» 下一篇: 3Sum 问题解析