🔌 第二章 用电信号传输TCP/IP数据
📄 一句话概括

重发超时值=平均 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 秒实验

  1. ping 同城与国外各一台主机,对比 RTT。
  2. 想想跨洋专线和拨号时代,超时值差多少量级。
  3. 用 ss -i 看一条连接的 rto 值(Linux)。

常见误区

  1. 以为超时值是写死的常数——动态调整。
  2. 以为重发只发生在超时——重复确认也触发(快重传)。
自测三问(点开对答案) 1. 重发超时值怎么定? —— 平均 RTT+余量,动态调整。 2. 定短了会怎样? —— 误判重发,塞满网络。 3. RTT 样本怎么来? —— 每个包从发出到 ACK 回来的间隔。

相关笔记