📄 一句话概括
重发超时值=平均 RTT 加余量、持续动态调整——定短了误判重发塞网络,定长了真丢了干等。
📝 本节和前面几节的关系
2.3.3 依赖【没等到 ACK 就重发】;本篇回答等多久才动手。
一、两难的定价
超时定短:包只是慢,被冤枉重发,冗余包塞满线路; 定长:真丢了白白等待。最优解跟着实际 RTT 走。
二、动态测量
协议栈对每个包计时:发出到 ACK 回来的间隔即 RTT 样本; 超时值=平均 RTT+偏差余量,慢启动阶段没样本就先用默认值。
三、动手 Demo:等待时间跟着 RTT 走
不同线路的不同等待:
for a, b, c in [('同城机房','1 ms','几毫秒级'),
('跨国','160 ms','几百毫秒级')]:
print('%-6s RTT=%-6s 超时≈%s' % (a, b, c))
实跑输出:
--------------------------------------------------------------------
等待时间跟着 RTT 走
--------------------------------------------------------------------
ACK 没回来等多久重发?看平均往返时间:
线路 RTT 超时定多少
-----------------------------------
同城机房 1 ms 几毫秒级
跨国 160 ms 几百毫秒级
-----------------------------------
定短了:包只是慢,被误判丢了->无谓重发塞满网络;
定长了:真丢了干等,浪费带宽。
协议栈持续测 RTT,超时值=平均往返+余量,动态调整。
⭐ 2026 现状:BBR 等新拥塞算法直接以带宽与 RTT 建模, 思路升级但【跟着实测走】的精神一脉相承。
30 秒实验
- ping 同城与国外各一台主机,对比 RTT。
- 想想跨洋专线和拨号时代,超时值差多少量级。
- 用 ss -i 看一条连接的 rto 值(Linux)。
常见误区
- 以为超时值是写死的常数——动态调整。
- 以为重发只发生在超时——重复确认也触发(快重传)。
自测三问(点开对答案)
1. 重发超时值怎么定? —— 平均 RTT+余量,动态调整。 2. 定短了会怎样? —— 误判重发,塞满网络。 3. RTT 样本怎么来? —— 每个包从发出到 ACK 回来的间隔。- ☐ 下一节(2.3.5 使用窗口有效管理ACK号)
相关笔记
- 使用窗口有效管理ACK号 —— 从【等】到【滑】
- 使用ACK号确认网络包已收到 —— 对账本体
- 🔌 网络是怎样连接的 · 索引