TCP的超时重传机制与RTT计算

1. TCP超时重传机制概述

TCP(传输控制协议)作为可靠的传输层协议,通过超时重传(Retransmission Timeout, RTO)机制保证数据可靠传输。当发送方在一定时间内未收到接收方的ACK确认时,会触发重传机制。
go专栏:https://duoke360.com/tutorial/path/golang

核心原理:发送方为每个发出的数据包设置定时器,若在RTO时间内未收到ACK,则判定数据包丢失并重传

1.1 重传触发条件

  • 超时未确认:数据包发送后超过RTO时间未收到ACK
  • 快速重传:收到3个重复ACK(Duplicate ACK)时立即重传
  • 选择性确认(SACK):通过SACK选项明确告知丢失的数据段

1.2 重传策略类型

  1. 保守策略:仅依赖超时重传
  2. 积极策略:结合快速重传和超时重传
  3. 自适应策略:动态调整RTO(现代TCP实现采用)

2. RTT测量与计算

**RTT(Round-Trip Time)**是衡量网络性能的关键指标,指数据包从发送到收到ACK的时间间隔。

2.1 基本RTT测量

SRTT = (1 - α) * SRTT + α * RTT_{sample}

其中:

  • SRTT(Smoothed RTT):平滑RTT值
  • α通常取1/8(0.125)
  • RTTₛₐₘₚₗₑ为最新测量的RTT值

2.2 RTTVAR计算

**RTTVAR(RTT Variation)**反映RTT的波动程度:

RTTVAR = (1 - β) * RTTVAR + β * |SRTT - RTT_{sample}|

β通常取1/4(0.25)

2.3 RTO计算公式

基于RFC6298标准:

RTO = SRTT + max(G, K * RTTVAR)

其中:

  • G为时钟粒度(通常1ms)
  • K通常取4

关键点:RTO必须不小于1秒,首次计算时初始RTO=1秒

3. 高级优化机制

3.1 Karn算法

解决重传二义性问题:

  • 不测量重传数据包的RTT
  • 重传后采用退避策略:RTO = γ * RTO
    (γ通常取2,称为"指数退避")

3.2 时间戳选项

通过TCP Timestamp选项实现:

  • 更精确的RTT测量
  • 每个ACK可计算RTT(不限于特定数据包)
  • 避免重传二义性问题

3.3 Linux实现优化

现代Linux内核(TCP CUBIC)改进:

// 内核中的RTO计算示例(简化)
if (srtt != 0) {
    rto = srtt + max(usec_rtt, mdev);
    rto = max_t(u32, rto, TCP_RTO_MIN);
}

其中mdev为平均偏差

4. 面试常见问题与解答

Q1: 为什么不能直接用最近一次的RTT作为RTO?

因为网络存在波动,单次RTT不能反映整体状况。通过平滑计算(SRTT)和考虑波动(RTTVAR)能更准确预测超时时间。

Q2: 快速重传为什么设置3个重复ACK阈值?

  • 1-2个重复ACK可能是网络乱序
  • 3个重复ACK能较可靠判断丢包
  • 平衡响应速度和误判概率

Q3: 重传后RTO如何变化?

采用指数退避:

  1. 首次重传:RTO = 2 × 原RTO
  2. 后续重传:RTO = 4 × 原RTO
  3. 上限通常为60s

5. 实践建议

  1. Wireshark分析:抓包观察Seq/Ack号和RTT变化

  2. Linux参数调整:

    sysctl -w net.ipv4.tcp_rto_min=200ms
    sysctl -w net.ipv4.tcp_rto_max=120s
    
  3. 监控指标:

    • /proc/net/snmp中的TCP重传统计
    • ss -ti命令查看每个连接的RTT/RTO

面试要点:理解TCP通过动态RTO计算实现可靠传输,同时兼顾网络效率。现代TCP实现结合了超时重传、快速重传和SACK等多种机制。

扩展阅读

  1. RFC6298 - Computing TCP’s Retransmission Timer
  2. TCP/IP详解 卷1:协议(第21章)
  3. Linux内核源码:net/ipv4/tcp_input.c中的tcp_rtt_estimator函数
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐