一、四种时延
一个分组从一台路由器到下一台路由器,会经历四种时延。任何网络性能题的第一步,都是把这四项分清楚。
┌──────────────── 路由器 A ────────────────┐
分组到达 →│ [1.处理] → [2.排队 …队列…] → [3.传输] │ →→→ [4.传播] →→→ 路由器 B
└──────────────────────────────────────────┘
1️⃣ 节点处理时延 d_proc
检查分组头部、校验比特差错、决定输出端口所花的时间。
- 典型值:微秒级或更低
- 现代路由器由专用硬件完成,通常可忽略
2️⃣ 排队时延 d_queue
分组在输出队列里等待前面的分组被发送完的时间。
- 典型值:微秒到毫秒,且方差极大
- 这是四项中唯一随网络负载变化的一项
- 它是本讲的重点,第三节详讲
3️⃣ 传输时延 d_trans
把分组的所有比特推到链路上所需的时间。
d_trans = L / R
L = 分组长度(bit)
R = 链路带宽(bps)
- 与链路速率和分组长度有关
- 与距离完全无关
4️⃣ 传播时延 d_prop
一个比特从链路这一端走到另一端所需的时间。
d_prop = d / s
d = 链路物理长度(m)
s = 信号传播速度(≈ 2×10⁸ m/s,约 2/3 光速)
- 与距离有关
- 与链路速率、分组长度完全无关
⭐ 传输 vs 传播:全课最容易混的一对
这个区分每年都有大量学生在期中考试上丢分。
| 传输时延 d_trans | 传播时延 d_prop | |
|---|---|---|
| 物理含义 | 把比特推出去要多久 | 比特在路上飞多久 |
| 决定因素 | L 和 R | d 和 s |
| 加宽带宽会怎样 | 变小 | 不变 |
| 拉长距离会怎样 | 不变 | 变大 |
| 类比 | 收费站放行一队车要多久 | 一辆车开完这段高速要多久 |
收费站类比(KR 教材的经典比喻):一个车队 10 辆车,收费站每辆车放行 12 秒,两个收费站相隔 100 km,车速 100 km/h。
- 「传输时延」= 收费站放完 10 辆车 = 120 秒
- 「传播时延」= 一辆车开 100 km = 1 小时
📌 记忆锚点:**带宽决定「快不快」,距离决定「远不远」。加带宽治不了远。**从北京到纽约的单向传播时延约 60 ms,你把带宽提到 1 Tbps 也还是 60 ms。
节点总时延
d_node = d_proc + d_queue + d_trans + d_prop
二、排队时延与流量强度
排队时延是唯一「有脾气」的一项。它的行为不是线性的,而是在某个点突然爆炸。
2.1 流量强度(Traffic Intensity)
定义三个量:
- R = 链路带宽(bps)
- L = 分组长度(bit)
- a = 分组平均到达速率(分组/秒)
那么比特到达速率 = L·a,而链路的比特服务速率 = R。二者之比称为流量强度:
流量强度 = L·a / R
2.2 三种情形
| 流量强度 | 会发生什么 |
|---|---|
| La/R ≈ 0 | 到达很稀疏,几乎不排队,平均排队时延 ≈ 0 |
| La/R → 1 | 到达速率逼近服务速率,排队时延急剧上升 |
| La/R > 1 | 到达超过服务能力,队列无限增长 → 缓冲区溢出 → 丢包 |
平均排队时延
↑
│ │
│ ╱│
│ ╱ │
│ ╱ │
│ ╱ │
│ ╱ │
│ ──── │
└────────────────────────────┴──→ La/R
0 0.5 0.8 1.0
2.3 这条曲线的工程含义
⚠️ **它不是线性的。**在 La/R = 0.5 时排队时延很小,到 0.9 时已经很大,到 0.95 时可能是 0.9 时的好几倍。
对 M/M/1 排队模型(到达为泊松过程,服务时间指数分布),平均排队时延有闭式解:
E[排队时延] = ρ / (μ(1−ρ)) 其中 ρ = La/R 为利用率
分母里的 (1−ρ) 就是那条渐近线。ρ 从 0.9 到 0.99,(1−ρ) 从 0.1 变成 0.01,时延放大 10 倍。
📌 实际工程结论:运营商通常把骨干链路利用率控制在 50%–70%。这不是浪费——是为突发留出余量。把利用率推到 95% 会让时延和抖动变得不可接受。
🎯 这条曲线解释了后面很多事:为什么 TCP 要主动降速(第 15 讲)、为什么大缓冲区反而有害(bufferbloat,第 16 讲)、为什么数据中心网络追求低利用率。
三、端到端时延与 traceroute
3.1 端到端时延公式
N−1 台路由器、N 条链路的路径上:
d_端到端 = N × (d_proc + d_trans + d_prop + d_queue)
(若各跳参数不同,则逐跳累加。)
3.2 traceroute 的原理
traceroute(Windows 上叫 tracert)能测出到目的地路径上每一跳的时延。它的实现极其巧妙:
向目的地发送 TTL = 1, 2, 3, … 的探测分组。TTL 归零时,那台路由器会回送一个 ICMP「超时」报文。收到它,就知道了第 n 跳是谁、往返用了多久。
每个 TTL 发 3 个探测包,所以输出里每行有三个时间。
$ traceroute www.example.com
1 192.168.1.1 1.234 ms 1.102 ms 1.089 ms ← 家里的路由器
2 10.20.0.1 11.4 ms 9.8 ms 10.2 ms ← ISP 接入
3 * * * ← 该路由器不回 ICMP
4 72.14.234.1 24.7 ms 25.1 ms 24.3 ms
...
* * * 不代表丢包或故障,通常只是那台路由器被配置为不响应或对 ICMP 限速。这是学生最常见的误读。
(ICMP 的完整机制在第 22 讲。)
3.3 端系统内部的时延
课程讨论的时延还有一部分在主机里,容易被忘:
- 接入共享介质的时延:WiFi 要等信道空闲(第 25 讲的 CSMA/CA)
- 发送方缓存时延:TCP 因为拥塞控制或流量控制而不能立刻发(第 14、16 讲)
四、丢包
前面说过,队列容量有限。队列满时到达的分组被丢弃。
丢包之后会发生什么,取决于上层:
| 上层协议 | 丢包后 |
|---|---|
| UDP | 什么都不做,数据永久丢失 |
| TCP | 由前一跳节点或源端重传(第 13 讲) |
📌 **性能度量应当同时看时延和丢包率。**只报时延的测量是不完整的:一条零丢包但排队严重的链路,和一条低时延但 5% 丢包的链路,对 TCP 应用来说后者往往更糟(因为丢包会触发拥塞控制降速)。
五、吞吐量(Throughput)
5.1 定义
吞吐量 = 单位时间内接收方收到的比特数(bps)。区分两种:
- 瞬时吞吐量:某一时刻的速率(你下载时进度条旁边跳动的数字)
- 平均吞吐量:传完 F 比特用了 T 秒,则平均吞吐量 = F/T
5.2 瓶颈链路
考虑一条经过多段链路的路径,各段速率为 R₁, R₂, …, Rₙ:
服务器 ──R₁──→ ──R₂──→ ──R₃──→ 客户端
端到端吞吐量 = min(R₁, R₂, …, Rₙ)
速率最小的那条链路叫瓶颈链路(bottleneck link)。
这是水管类比:一串粗细不同的水管串联,流量由最细的那一段决定。把其他段加粗毫无用处。
5.3 有竞争时的吞吐量
真实情况更复杂。设 10 个客户端同时从 10 台服务器下载,共享一条中间的骨干链路 R:
每个连接的吞吐量 = min(R_接入, R_服务器, R/10)
📌 实际观察:家庭宽带用户的瓶颈绝大多数时候在接入链路(你家那条线),而不是在核心网。核心网通常是过度配置的。这也是为什么升级家庭宽带确实有效,而抱怨「互联网太慢」通常抱怨错了对象。
5.4 带宽时延积(Bandwidth-Delay Product)
这是本讲最重要的一个量,也是第 12–14 讲的基础。
BDP = 带宽 R × 往返时延 RTT (单位:bit)
它的物理意义是:在任一时刻,这条「管道」里最多能容纳多少比特。
想象一根水管:带宽是管子的粗细,RTT 是管子的长度,BDP 是管子的容积。
例:跨太平洋链路,R = 1 Gbps,RTT = 150 ms
BDP = 1×10⁹ bps × 0.15 s = 1.5×10⁸ bit = 18.75 MB
⚠️ 这意味着什么:如果发送方采用「发一个包、等一个确认」的停等方式(第 11 讲的 rdt3.0),每 150 ms 只能发 1 个包(约 1500 字节)。实际吞吐量:
1500 B × 8 / 0.15 s = 80 kbps
在一条 1 Gbps 的链路上,只用到了 0.008%。
这就是为什么必须有流水线和滑动窗口——发送方必须始终保持「在途」数据量接近 BDP,才能填满管道。第 12 讲会把这一点变成公式,第 14 讲会看到 TCP 的接收窗口字段只有 16 位(最大 64 KB),在高 BDP 链路上不够用,因此需要窗口缩放选项。
🎯 把这句话背下来:要跑满一条链路,在途数据量必须 ≥ 带宽时延积。
六、例题(Worked Example)
题目:主机 A 通过两条链路向主机 B 发送一个 1 MB(= 8×10⁶ bit)的文件,中间有一台路由器 R。
- 链路 A→R:速率 10 Mbps,长度 200 km
- 链路 R→B:速率 100 Mbps,长度 20 km
- 信号传播速度 2×10⁸ m/s,分组大小 10,000 bit,处理与排队时延忽略
求:(a) 每条链路的传播时延;(b) 端到端吞吐量;(c) 传完整个文件的总时间。
解答:
(a) 传播时延与速率无关:
d_prop(A→R) = 200,000 m ÷ 2×10⁸ m/s = 1 ms
d_prop(R→B) = 20,000 m ÷ 2×10⁸ m/s = 0.1 ms
总传播时延 = 1.1 ms
(b) 端到端吞吐量 = min(10 Mbps, 100 Mbps) = 10 Mbps,瓶颈在第一条链路。
(c) 分组数 P = 8×10⁶ ÷ 10⁴ = 800 个。
第一跳传输时延 L/R₁ = 10⁴ / 10⁷ = 1 ms;第二跳 L/R₂ = 10⁴ / 10⁸ = 0.1 ms。
由于第二跳更快,它永远不是瓶颈,整个流水线的节奏由第一跳的 1 ms 决定:
最后一个分组离开 A 的时刻 = 800 × 1 ms = 800 ms
它再经过 1 ms 传播 + 0.1 ms 传输 + 0.1 ms 传播
总时间 ≈ 800 + 1 + 0.1 + 0.1 = 801.2 ms
验证:8×10⁶ bit ÷ 10 Mbps = 800 ms,加上一点点管道填充时间,与瓶颈链路的估算完全一致 ✅。
📌 这个验证方法很有用:大文件传输的总时间 ≈ 文件大小 ÷ 瓶颈带宽 + 一个 RTT 量级的修正项。考试时可以用它检查答案是否离谱。
七、随堂自测
- 把一条链路的带宽从 100 Mbps 提升到 1 Gbps,四种时延分别怎么变?
- 某链路 R = 2 Mbps,分组长 2000 bit,平均到达率 a = 800 分组/秒。流量强度是多少?这条链路健康吗?如果到达率涨到 1000 分组/秒会怎样?
- traceroute 输出中某一跳显示
* * *,而后面的跳都正常,说明这一跳坏了吗? - 一条 100 Mbps、RTT 20 ms 的链路,带宽时延积是多少字节?如果发送方的窗口只有 8 KB,能达到的最大吞吐量是多少?利用率多少?
- 「我的网速是 500 Mbps,但从这个网站下载只有 2 MB/s。」给出三种可能的解释。
八、本讲要点回顾
- 四种时延:处理、排队、传输、传播。
- 传输时延 = L/R(看带宽和包长);传播时延 = d/s(看距离)。二者永远不要混。
- 排队时延随流量强度 La/R 非线性上升,逼近 1 时爆炸。工程上把利用率压在 50–70%。
- 丢包发生在队列溢出时。
- 端到端吞吐量 = 瓶颈链路速率。
- 带宽时延积 = R × RTT 是管道容量。在途数据量必须 ≥ BDP 才能跑满链路——这是整个滑动窗口机制存在的理由。
九、自测答案
1. 传输时延变为 1/10(L/R 中 R 变大 10 倍);传播时延完全不变(只与距离和介质有关);处理时延基本不变;排队时延减小(因为服务速率 R 提高,流量强度 La/R 下降)。
2. 流量强度 = L·a/R = 2000×800 / 2×10⁶ = 0.8。这条链路已经不太健康:0.8 处于排队时延曲线开始陡峭上升的区域,抖动会明显。若 a = 1000,则 La/R = 1.0,队列理论上无限增长,实际表现为持续丢包和极高时延——链路饱和。
3. **不能说明它坏了。**极大概率是这台路由器被配置为不回送 ICMP 超时报文,或对 ICMP 做了速率限制。判据很明确:如果后续跳数正常返回,说明分组确实穿过了这一跳——它只是不肯自报家门。
4. BDP = 100×10⁶ bps × 0.02 s = 2×10⁶ bit = 250,000 字节 ≈ 250 KB。窗口 8 KB 时,每 RTT 只能发 8 KB:吞吐量 = 8192×8 / 0.02 = 3.28 Mbps,利用率 = 3.28/100 ≈ 3.3%。这正是需要 TCP 窗口缩放选项的原因(第 14 讲)。
5. ① 瓶颈不在你家:服务器上行带宽或路径中某段链路更窄;② 单位混淆:500 Mbps = 62.5 MB/s,2 MB/s = 16 Mbps,确实慢,但注意 b 与 B 差 8 倍;③ TCP 窗口受限:高 RTT 下单条连接受 BDP 限制(这也是下载工具用多连接的原因);④ 服务器端限速、CDN 节点较远、或路径存在丢包导致 TCP 拥塞窗口无法增长。