← 返回题目列表

TCP 超时重传、快速重传和 SACK 是怎么工作的?

高频 困难 第 16 / 30 题 更新于 2026/07/30
TCP重传RTO快速重传SACK

简化版

TCP 发现丢包主要靠两类信号:RTO 超时和重复 ACK。超时重传更保守,适合没有足够反馈时兜底;快速重传在收到多个重复 ACK 后提前补包;SACK 则告诉发送方哪些非连续区间已经收到,减少重复重传。

详细版

TCP 重传机制可以这样回答:

  1. 每个已发送未确认的数据都在重传队列里,发送方根据 RTT 估算 RTO。
  2. RTO 到期仍未收到确认,就重传最早未确认的报文段,并通常进行退避。
  3. 如果接收方连续收到乱序数据,会重复确认缺口前的 ACK;发送方收到 3 个重复 ACK,通常触发快速重传。
  4. 快速恢复会配合拥塞控制调整 cwnd,避免把偶发丢包直接当成严重超时。
  5. SACK 通过 TCP 选项携带已收到的非连续区间,让发送方只补真正缺失的段。

面试要强调:超时重传是兜底,快速重传是基于重复 ACK 的提前恢复,SACK 是更精确的丢包定位能力。

完整版教学

一、TCP 为什么不能只靠超时重传

网络丢包后,如果发送方只能等 RTO 到期,恢复速度会很慢。假设 RTT 是 40ms,RTO 被估算成 200ms,一个包在第 10ms 丢失,发送方可能要到 210ms 才重传,这期间连接吞吐会明显下降。

但超时重传又不能取消,因为有时 ACK 全丢了,或者窗口里后续数据不够,发送方收不到重复 ACK 信号,只能靠定时器兜底。所以 TCP 同时需要“保守兜底”和“快速发现”两套机制。

丢包恢复信号:
1. 没有 ACK 回来 -> 等 RTO -> 超时重传
2. 后续包到了但中间缺口没到 -> 重复 ACK -> 快速重传
3. SACK 告诉已到区间 -> 精确补缺口

记忆钩子:RTO 是没有线索时的闹钟,重复 ACK 是接收方在提醒“中间有洞”,SACK 是把洞的位置标出来。

二、RTO 如何根据 RTT 动态估算

RTO 不能写死。网络 RTT 会随链路、排队、跨地域访问变化而变化。RTO 太短会误判丢包,造成重复流量;RTO 太长会让真丢包恢复很慢。

TCP 会根据测量到的 RTT 估算平滑 RTT 和波动范围,形成更稳的 RTO。面试不需要死背所有细节,但要讲清楚“基于 RTT 动态估算,并为波动留余量”。

简化理解:
SRTT = 平滑后的往返时延
RTTVAR = RTT 波动程度
RTO  = SRTT + 波动余量

例如近几次 RTT 在 45ms~55ms,RTO 可以相对贴近;如果 RTT 在 40ms~180ms 抖动,RTO 就需要放大,否则很容易误重传。

三、快速重传为什么常用 3 个重复 ACK

当接收方收到乱序段时,会继续确认“我期望的下一个字节”。如果 3001~4000 丢了,但 4001~50005001~60006001~7000 都到了,接收方会多次回 ACK=3001。发送方看到多个重复 ACK,就能推断中间缺口大概率丢了。

发送: [1001-2000] [2001-3000] [3001-4000] [4001-5000] [5001-6000]
接收:     ok          ok          lost          ok          ok
ACK :   2001        3001         3001        3001        3001

用 3 个重复 ACK 是经验折中:太少容易把乱序误判成丢包;太多又恢复太慢。实际实现会结合拥塞控制和其他算法,但面试回答到这个层次通常够用。

四、SACK 如何减少无效重传

累计 ACK 只能说“缺口前都收到了”,不能告诉发送方缺口后的哪些段已经收到。SACK 通过 TCP 选项把已收到的非连续区间带回去,让发送方更精确地补洞。

机制能表达什么缺点
累计 ACK某序号之前连续收到看不到缺口后的已收区间
重复 ACK暗示中间可能有缺口无法精确描述多个缺口
SACK描述非连续已收区间依赖双方支持 TCP 选项

比如接收方已收到 1001~30005001~7000,缺 3001~5000。累计 ACK 只能回 ACK=3001,SACK 可以额外带上 5001~7000,发送方就不会傻傻重传后面已经到达的区间。

五、重传和拥塞控制为什么绑定

丢包常常意味着网络拥塞,所以 TCP 不能只补包,还要调整发送速率。超时通常被视为较严重的拥塞信号,发送方会更明显地降低拥塞窗口;快速重传说明仍有后续包到达,网络未必完全堵死,所以快速恢复会相对温和。

丢包信号强度:
RTO 超时       -> 反馈少,偏严重,恢复更保守
3 duplicate ACK -> 仍有包到达,偏轻,快速恢复
SACK 信息      -> 更精确,减少无用重传

这也是为什么“可靠传输”和“拥塞控制”不能完全割裂。重传补的是正确性,拥塞控制管的是继续发送的速度。

六、线上抓包时怎么判断发生了什么

抓包或看指标时,重复 ACK、重传、RTO、SACK 块是很关键的线索。若看到大量超时重传,说明 ACK 反馈不足或链路抖动明显;若看到快速重传,说明后续包仍在流动但中间有缺口;若有 SACK,通常能更准确看到哪些段乱序或丢失。

抓包现象可能含义常见处理
多个 Duplicate ACK中间段丢失或乱序看是否触发快速重传
Retransmission after RTOACK 等不到查丢包、RTT 抖动、队列拥塞
SACK blocks接收方收到非连续区间判断缺口位置
大量重传但吞吐低网络或对端处理异常看 cwnd、rwnd、链路质量

面试回答可以补一句:重传本身不是错误,异常的是重传率过高以及伴随 RTT 飙升、吞吐下降。

七、常见误区与追问

  • 误区:TCP 丢包一定要等超时。 如果后续包到达并产生重复 ACK,发送方可以快速重传。
  • 误区:重复 ACK 一定代表丢包。 乱序也会造成重复 ACK,所以通常用多个重复 ACK 降低误判。
  • 误区:SACK 会改变 ACK 的累计语义。 SACK 是补充信息,累计 ACK 仍然表示连续收到的位置。
  • 追问:RTO 为什么要动态计算? 因为 RTT 随网络变化,固定 RTO 会在不同链路上过慢或误重传。
  • 追问:快速恢复和快速重传是什么关系? 快速重传负责补缺失段,快速恢复负责在丢包后调整拥塞窗口。
  • 追问:超时重传为什么通常更严重? 因为发送方连足够的 ACK 反馈都没有收到,说明网络或对端反馈可能更差。

八、加强记忆

TCP 重传按“发现信号”记最稳:没有反馈靠 RTO,有多个重复 ACK 靠快速重传,有 SACK 就精确补洞。答题时再补上“重传后还要配合拥塞控制降速”,就能把可靠性、性能和网络稳定性连在一起。