电路交换先建一条独占通路,分组交换不建通路、一包一包扔。 分组交换赢在效率与共享,电路交换赢在可预测——今天的网络靠 QoS 折中。
1.7.1 讲的是「传之前握不握手」,这一节讲「底下那条路怎么用」。 1.3.5 已经算过分组的头开销,这里算的是时延。
一、两种思路
一个像打电话,一个像寄信:
| 对比项 | 电路交换 | 分组交换 |
|---|---|---|
| 建通路 | 先建,独占 | 不建,共享 |
| 带宽 | 恒定,空闲也占着 | 按需,谁有包谁用 |
| 时延 | 恒定 | 随排队长度变 |
| 故障 | 全断 | 可绕路 |
第一行决定了一切:建通路的时候就把沿途的时隙或频段占住了, 所以传输过程中不需要任何地址信息——路已经修好了,顺着走就行。 这也是电路交换的头部可以极小的原因。 第四行是分组交换被设计出来的初衷:ARPANET 的目标就是「部分节点被毁,剩下的还能通」, 而独占通路的电路交换做不到这一点——路一断,通话就断。 分组交换的每个包独立选路,天然能绕。
二、三笔账
用同一组假设算三次(1 Mbps 链路、4 段、每段传播 5 毫秒、建连一个往返):
第一笔:一个人传 1 MB。
| 方式 | 多了什么 | 总时延 ms |
|---|---|---|
| 电路交换 | 建连 10 毫秒 | 8404 |
| 分组交换 | 存储转发 24 毫秒 | 8236 |
这一笔分组交换反而快了 168 毫秒:因为它省掉了建连,而存储转发只多花 24 毫秒。 所以「电路交换时延一定更低」这个印象是不准的——建连的成本往往比存储转发更贵。 第二笔:十个人各传 100 KB,共用一条链路。
| 方式 | 建连次数 | 总时延 ms |
|---|---|---|
| 电路交换 | 10 次 | 8342 |
| 分组交换 | 0 次 | 8044 |
差距拉大到 298 毫秒:电路交换要建十次连、而且一次只服务一个人, 分组交换让十个人的包交错跑,谁有空谁上。 这就是「共享」带来的效率。 第三笔才是关键:时延抖动的来源不同。
| 方式 | 时延由什么决定 | 负载翻倍后 |
|---|---|---|
| 电路交换 | 带宽独占,恒定 | 不变 |
| 分组交换 | 排队长度,随负载涨 | 可能翻几倍 |
第二行那个「可能翻几倍」是分组交换的代价:链路利用率越高,队列越长,时延越不可预测。 这就是为什么语音电话当年坚持用电路交换——通话不怕慢几百毫秒,怕的是忽快忽慢。 三笔账合起来的结论:分组交换赢在效率与共享,电路交换赢在可预测。 今天的网络用折中办法兼顾两头: 给不同流量打标记、排队时优先放行实时语音——这就是 QoS(5.8.3 会讲)。
三、分组交换的代价落在谁身上
代价不会消失,只会转移:
| 代价 | 转移给谁 | 表现 |
|---|---|---|
| 排队时延 | 应用自己 | 时快时慢 |
| 丢包 | 上层协议 | TCP 重传、UDP 丢弃 |
| 乱序 | 接收端 | 要缓冲重排 |
第一行是实时应用最头疼的:分组交换不保证时延,而语音、游戏恰恰对时延最敏感。 所以这类应用要自己做抖动缓冲——先攒一小段再播,用延迟换平滑。 这就是为什么 VoIP 会有「几十毫秒的固有延迟」。 第二行解释了 TCP 为什么那么复杂:因为底下那层不保证,所有保证都得在上面重建。 序号、确认、重传、拥塞控制,全是为了「在不保证的网络上做出保证」。 第三行常被忽略的是「缓冲」的代价:重排要占内存、要等,等多久不确定, 所以乱序严重时延迟会突然变大——表现就是「大部分时候很快,偶尔卡一下」。
四、动手 Demo:电路交换与分组交换,时延差在哪
用同一组假设参数算三笔账:单流、十人共享、时延抖动。 参数是假设的,算式是真的——这样才看得清差异从哪来。
BW = 1e6 # 1 Mbps
SEG = 4 # 经过 4 段链路
PROP = 0.005 # 每段传播 5 毫秒
RTT = 0.010 # 建连一个往返 10 毫秒
def circuit(nbytes, nflows):
tx = nbytes * 8 / BW
return (tx + PROP * SEG + RTT) * nflows * 1000
def packet(nbytes, nflows):
tx = nbytes * 8 / BW
return (tx + PROP * SEG + PROP * (SEG - 1)) * nflows * 1000
one = 1024 * 1024
print('单流 1 MB 电路 %.0f ms 分组 %.0f ms'
% (circuit(one, 1), packet(one, 1)))
ten = 100 * 1024
print('十人 100 KB 电路 %.0f ms 分组 %.0f ms'
% (circuit(ten, 10), packet(ten, 10)))
print('建连占比:%.1f%%' % (RTT / (one * 8 / BW) * 100))
实跑输出:
--------------------------------------------------------------------
电路交换与分组交换,时延差在哪
--------------------------------------------------------------------
**电路交换先建一条独占通路,再传;分组交换不建通路,一包一包扔。**
**下面用同一组假设参数算三笔账**:**1 Mbps 链路、4 段、每段传播 5 毫秒、建连一个往返。**
**第一笔:一个人传 1 MB。**
方式 建连 多了什么 总时延ms
------------------------------------------------------------------------
电路交换 **一个往返** **建连 10 毫秒** 8404
分组交换 没有 **每段存储转发 3×8=24 毫秒** 8236
**这一笔分组交换快了 168 毫秒**,**因为它省掉了建连,而存储转发只多花 24 毫秒。**
**所以「电路交换时延更低」这个印象是不准的**——**建连的成本往往比存储转发更贵。**
**第二笔:十个人各传 100 KB,共用一条 1 Mbps 链路。**
方式 建连次数 链路怎么用 总时延ms
-------------------------------------------------------------
电路交换 **10 次** **一次只服务一个人** 8342
分组交换 0 次 **十个人的包交错跑** 8044
**这一笔差距拉大到 298 毫秒**,省的是十次建连加上十次串行。
**第三笔才是关键:时延抖动的来源不同。**
方式 时延由什么决定 负载翻倍后
-------------------------------------------------------
电路交换 **带宽独占,恒定** **不变**
分组交换 **排队长度,随负载涨** **可能翻几倍**
**第二行那个「可能翻几倍」是分组交换的代价**:**链路利用率越高,队列越长,时延越不可预测。**
**这就是为什么语音电话当年坚持用电路交换**——**通话不怕慢几百毫秒,怕的是忽快忽慢。**
**三笔账合起来的结论**:**分组交换赢在效率与共享,电路交换赢在可预测。**
**今天的网络用一个折中办法兼顾两头**:
**给不同流量打标记、排队时优先放行实时语音**——**这就是 QoS(5.8.3 会讲)。**
单流那一笔:电路 8404、分组 8236,分组反而快 168 毫秒,因为它省掉了建连的 10 毫秒, 而存储转发只多花 24 毫秒。 十人那一笔:电路 8342、分组 8044,分组快 298 毫秒,省的是十次建连加十次串行。 这两笔都说明「电路交换时延更低」是错的:建连的成本常常比存储转发更贵。 但电路的时延是恒定的,分组的不恒定——这才是真正的差别,也是最后一行要算「抖动」的原因。 注意这三笔账的参数是假设的(1 Mbps、4 段、5 毫秒): 现实里的链路由几十段组成、带宽也高得多,所以绝对值不能当真,能当真的是「差值的方向」。
30 秒实验
- 把
SEG改成 10,看分组交换那一列的存储转发开销涨多少——跳数越多,分组越吃亏。 - 把
BW改成 1 Gbps,看建连那 10 毫秒占多大比例——带宽越大,建连的相对成本越高。 - 想一下:为什么视频网站不怕时延抖动,直播连麦却很怕?
常见误区
- 以为电路交换时延一定更低。 建连要一个往返,短传输时这笔开销比存储转发更贵, 分组反而更快。
- 以为分组交换只是「省线路」。 它真正的代价是时延不可预测,负载一高队列就长, 实时业务受不了。
- 以为「共享」没有成本。 成本转移给了应用与上层协议:抖动缓冲、重传、乱序重排, 全得自己补。
自测三问(点开对答案)
1. 为什么单流传输时分组交换反而更快? —— **因为它省掉了建连的一个往返,而存储转发只多花 24 毫秒。**建连的成本往往比存储转发更贵。 2. 分组交换最大的代价是什么? —— **时延不可预测**:排队长度随负载涨,负载翻倍时延可能翻几倍。电路交换带宽独占,时延恒定。 3. 今天的网络怎么兼顾效率与可预测? —— **靠 QoS**:给不同流量打标记,排队时优先放行实时语音。既不放弃共享,也不让实时业务被挤死。下一节换第三个角度:按接收端数量分——单播、广播、组播。
- ☐ (本节完,下一节 1.7.3 根据接收端数量分类)