本文目录导读:
超时重传机制是 TCP(传输控制协议)保证可靠传输的核心机制之一,它的作用是:当发送方发送一个数据段后,会启动一个定时器;如果在规定时间内没有收到对方的确认应答(ACK),就认为数据丢失或出错,于是重新发送该数据段。
下面我们来详细拆解这个机制。
核心流程
- 发送数据并启动定时器:发送方将数据包交给 IP 层发出,同时为该数据包启动一个重传定时器。
- 等待确认(ACK):发送方等待接收方发回的确认 ACK。
- 超时触发:
- 如果定时器到期,仍未收到 ACK:发送方认为数据包在网络中丢失或被损坏(导致校验失败被丢弃),于是立即重传该数据包,并且通常会将定时器的超时时间加倍(指数退避)。
- 如果按时收到 ACK:发送方取消/关闭该定时器,正常发送下一个数据包。
关键问题:超时时间(RTO)如何确定?
超时时间(Retransmission Timeout,简称 RTO)是超时重传机制的核心,如果设得太短,正常的网络延迟也会导致误判,引发大量不必要的重传(空耗带宽);如果设得太长,检测到丢包的时间就很长,传输效率低下。
TCP 采用了一种动态估算的方法,主要基于 RTT(Round-Trip Time,往返时间)。
- RTT:数据包从发送到收到对应 ACK 所经历的时间。
- RTO 的计算并不是简单的 RTT 平均值,经典的算法(如 Jacobson/ Karels 算法)会综合考虑 RTT 的平滑平均值(SRTT) 和 RTT 的偏差(RTTVAR) 来得到一个比较保守且能适应网络波动的值。
- 公式大致为:
RTO = SRTT + max(G, K * RTTVAR) - G 是时钟粒度,K 是常量(通常为 4)。
- 公式大致为:
- 动态调整:网络状况是变化的,TCP 会持续采样新的 RTT 值,不断修正 SRTT 和 RTTVAR,从而动态调整 RTO。
超时重传存在的问题
虽然超时重传保证了可靠性,但它有一个明显的缺点:效率低下。
- 必须等待超时:发送方必须傻等一个完整的 RTT(甚至更长,因为 RTO 通常略大于平均 RTT)才能确认包丢失,然后才开始重传。
- RTO 具有保守性:为了避免不必要的重传,RTO 通常设置得比实际 RTT 大不少(1.5-2 倍)。
这意味着在一次丢包发生后,网络会空转一个完整的 RTT 时间,降低了吞吐量。
改进方案:快速重传
为了弥补超时重传的效率损失,TCP 引入了快速重传(Fast Retransmit) 机制,它不是依靠定时器,而是依靠重复 ACK 来触发。
- 工作原理:
- 接收方收到数据后,如果发现收到的数据段序号不连续(比如收到了 1、2、3,然后直接收到了 5),它会立即发送一个 重复的 ACK,报告它期望收到的下一个序号(这里是 4)。
- 发送方连续收到 3 个或以上 的相同 ACK(即重复 ACK),就会推断出该序号(如 4)对应的数据包已经丢失。不需要等待超时,立刻重传该数据包。
- 优势:避免了等待 RTO 造成的空闲时间,能够快速恢复数据传输。
| 特性 | 说明 |
|---|---|
| 核心作用 | 确保发送方能检测到数据包的丢失并恢复传输,实现可靠交付。 |
| 触发条件 | 定时器到期且未收到对应 ACK。 |
| 关键参数 | RTO(超时重传时间),基于网络当前 RTT(往返时间)动态计算。 |
| 主要问题 | 效率较低,需要等待一个完整的超时周期,会造成吞吐量下降。 |
| 改进配合 | 通常与 快速重传 一起工作,快速重传处理部分丢包,超时重传处理更严重或无法检测的丢包(如 ACK 丢失严重时、网络完全中断时),作为可靠的保底方案。 |
你可以把超时重传理解为一个“保底”机制:当其他快速检测手段(如快速重传)都失效时,它能确保数据最终被重传,而快速重传则是一个“提速”机制,通过重复 ACK 提前感知丢包,避免傻等定时器,两者共同构成了 TCP 丢包恢复的完整体系。
标签: RTO