TCP的超时重传机制与RTT计算
·
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 重传策略类型
- 保守策略:仅依赖超时重传
- 积极策略:结合快速重传和超时重传
- 自适应策略:动态调整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如何变化?
采用指数退避:
- 首次重传:RTO = 2 × 原RTO
- 后续重传:RTO = 4 × 原RTO
- 上限通常为60s
5. 实践建议
-
Wireshark分析:抓包观察Seq/Ack号和RTT变化
-
Linux参数调整:
sysctl -w net.ipv4.tcp_rto_min=200ms sysctl -w net.ipv4.tcp_rto_max=120s -
监控指标:
/proc/net/snmp中的TCP重传统计ss -ti命令查看每个连接的RTT/RTO
面试要点:理解TCP通过动态RTO计算实现可靠传输,同时兼顾网络效率。现代TCP实现结合了超时重传、快速重传和SACK等多种机制。
扩展阅读
- RFC6298 - Computing TCP’s Retransmission Timer
- TCP/IP详解 卷1:协议(第21章)
- Linux内核源码:
net/ipv4/tcp_input.c中的tcp_rtt_estimator函数
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)