模块五 · 链路层和局域网
多路访问协议
链路层有个和网络层完全不同的难题 —— 多台设备共享同一条线路时,谁能在什么时候发? 没有规则就是一团乱撞。这一章讲三类解决思路,并用模拟复现两个经典的效率上限。
本章要解决的问题:链路层有个和网络层完全不同的难题 —— 多台设备共享同一条线路时,谁能在什么时候发? 没有规则就是一团乱撞。这一章讲三类解决思路,并用模拟复现两个经典的效率上限。
本章的证据来源:概念讲法参考教材§6.3,纸书301–311页(PDF320–330页),具体出处见章末。旧稿的命令与数值属于历史转述,相关附件未随当前项目提供,本次没有重新采集或运行原实验;模型计算、协议规则与观察不能互相替代。
先从一个例子理解概念
几台设备共享一个信道,都想发送。如果同时发送互相影响,就需要决定谁何时能用它;独享链路的情形则不同。
共享介质与碰撞
共享介质让多个发送者竞争同一传输资源;碰撞是同时发送导致相关接收失败的情形。不是所有以太网连接都处于这种共享、半双工场景。
多路访问协议
多路访问协议协调共享资源使用,可能划分时间或频率、随机竞争,也可能轮流授权。不同方法在负载、开销和等待时间上有取舍。
问题的由来:共享介质
前面几个模块讲的转发都是点对点的:一个包从 A 传到 B,中间没有别人插嘴。
但链路层面对的常常是"广播链路" —— 多台设备挂在同一段介质上:
┌──────┬──────┬──────┬──────┐
│ A │ B │ C │ D │
└──┬───┴──┬───┴──┬───┴──┬───┘
└──────┴──────┴──────┘
共享的同一条介质问题是物理性的:如果 A 和 B 同时发送,两个信号会在介质上叠加、互相破坏。这不是"效率降低",而是双方的数据都变成垃圾。
所以必须有一套规则:谁在什么时候可以发。这就是多路访问协议要解决的问题。
三类思路
所有多路访问协议可以归成三类:
| 思路 | 核心想法 | 代价 |
|---|---|---|
| 信道划分 | 把资源切开,各用一份 | 一方空闲时别人也用不上 |
| 随机接入 | 谁想发就发,撞了再处理 | 冲突会浪费带宽 |
| 轮流 | 排队,一个一个来 | 需要有人管理这个队列 |
下面逐个看。
第一类:信道划分
把共享的资源切成几份,每台设备固定分到一份。
| 方式 | 切什么 | 说明 |
|---|---|---|
| TDMA | 时间 | 时间切成周期性的帧,每帧里给每个站分配一个固定的时隙 |
| FDMA | 频率 | 频段切成几份,每台设备占一份 |
| CDMA | 编码 | 所有站同时用全部频段,靠不同的编码区分 |
前两种很直观,第三种(CDMA)值得说一句:它让所有站同时、同频段发送,靠正交的编码把不同站的数据分开。这看起来违反直觉 —— 但正因为所有站都能用全部资源,它在负载满时效率不降(而 TDMA/FDMA 在分到的份内没事可做时就是浪费)。
信道划分的共同优点是无冲突,共同缺点是在低负载时浪费:
分给你的时隙里如果你没数据要发,这个时隙就空着 —— 别人也不能用。负载越高,这种浪费越小;负载越低,浪费越明显。 所以信道划分适合稳定高负载的场景(比如电话网络,通话是持续占用的)。
第二类:随机接入 —— ALOHA 的两个版本
思路完全相反:不划分资源,谁有数据就发。撞了再说。
最早的实现是 ALOHA(上世纪 70 年代在夏威夷的无线网络上做的),有两个版本:
| 版本 | 规则 | 脆弱期 |
|---|---|---|
| 纯 ALOHA | 想发就发,不管别人 | 2 个帧时 |
| 时隙 ALOHA | 只能在时隙边界开始发 | 1 个时隙 |
"脆弱期"是理解这两个版本的关键概念:一个帧发出后,在哪个时间范围内出现别的帧会导致冲突。
纯 ALOHA:
别人的帧可以在「我这个帧开始前一整个帧时」到「结束后一整个帧时」
之间的任何时刻开始 —— 危险窗口 = 2 个帧时
时隙 ALOHA:
所有帧都对齐到时隙边界,所以我只需要担心「我这一个时隙」里
有没有别人 —— 危险窗口 = 1 个时隙危险窗口减半,成功率就应该翻倍。
实测:把这两个上限复现出来
理论值是:纯 ALOHA 最高 1/(2e) ≈ 18.4%,时隙 ALOHA 最高 1/e ≈ 36.8%。
这两个数字看起来很像"规定",所以我用同一套随机模型跑了一遍(每个数据点 20 万个时隙):
G 纯 ALOHA 时隙 ALOHA
--------------------------------------------
0.1 0.0826 0.0911
0.2 0.1336 0.1638
0.3 0.1657 0.2211
0.5 0.1830 0.3047 ← 纯 ALOHA 的峰值在这里
0.7 0.1728 0.3465
1.0 0.1354 0.3680 ← 时隙 ALOHA 的峰值在这里
1.5 0.0745 0.3359
2.0 0.0374 0.2681
3.0 0.0079 0.1497
模拟出的最高利用率:
纯 ALOHA :0.1830 (出现在 G = 0.5)
时隙 ALOHA :0.3680 (出现在 G = 1.0)
理论值对照:
纯 ALOHA :1/(2e) = 0.1839
时隙 ALOHA :1/e = 0.3679两个峰值都精确落到了理论值附近(差 0.001 以内),而且峰值出现的位置也正好是理论预测的 G = 0.5 和 G = 1.0。
两个数字都很低,这才是重点
注意最高也只有 18% 和 37%。 而且过了峰值之后急剧下降 —— 因为负载一高,冲突增多,带宽都浪费在撞车上。
这就是随机接入的根本局限:它适合低负载场景。 负载一高,效率崩得很快。
CSMA:先听后发
ALOHA 最明显的问题是"明知别人在发还要发"。CSMA 的改进就一条:发之前先听。
| 名称 | 含义 | 用在哪 |
|---|---|---|
| CSMA | 载波侦听多路访问 —— 发之前先听信道 | 基础机制 |
| CSMA/CD | 加"冲突检测" —— 边发边听,发现冲突立刻停 | 有线以太网(经典做法) |
| CSMA/CA | 加"冲突避免" —— 尽量别撞上 | 无线(Wi-Fi) |
为什么无线用"避免"而不是"检测"? 两个原因:
① 无线设备发的时候听不到别人。 自己的信号太强,会盖住别人发来的弱信号 —— 所以"边发边听"在无线里做不到。
② 存在"隐蔽站"问题。 A 和 C 都能和 B 通信,但 A 和 C 之间距离太远、互相听不到。于是 A 以为信道空闲就发,C 也以为空闲就发,在 B 那里撞车 —— 而 A 和 C 谁都不知道。
所以无线只能退而求其次:尽量用机制减少碰撞概率(比如先发一个很小的预约帧、随机退避等)。
一个必须说明的实验缺口
我给 CSMA 写了两版模拟,结果都不对 —— 吞吐在负载稍高时就掉到接近 0,说明我没有正确实现"载波侦听 + 随机退避"这套逻辑。
所以我删掉了那一列,没有给出 CSMA 的模拟数字。
为什么这么做:一个错误的数字会让"CSMA 比 ALOHA 好"这个结论看起来有实验支撑,实际却是假的。坏数据比没有数据更糟。 CSMA 的机制上面已经讲清楚了,但它的效率优势在本章没有得到本实验的验证 —— 这一点必须说清楚。
二进制指数退避:撞了之后等多久
随机接入里还有一个关键机制:冲突之后怎么重试。
最朴素的做法是"等一个固定时间再重试" —— 但这很糟糕:如果两个站同时撞车,它们会同时重试、再次撞车,如此反复。
正确的做法是随机化,而且让随机范围随冲突次数增长:
| 第 n 次连续冲突 | 从 {0, 1, ..., 2ⁿ−1} 里随机选一个时隙等待 |
|---|---|
| 1 | 选 0 或 1 |
| 2 | 选 0~3 |
| 3 | 选 0~7 |
| 10 | 选 0~1023 |
这就是二进制指数退避。
为什么是指数增长? 因为冲突次数多说明当前竞争激烈(有很多站在抢)。此时应该让重试时刻散布得更开,避免大家反复撞在一起。冲突少的时候范围小,重试快;冲突多的时候范围大,快速分散。
在真实的以太网里,连续冲突 16 次就会放弃并报错 —— 这通常是"网络里有严重问题"的信号(比如环路)。
第三类:轮流协议
思路是"排队":
| 方式 | 做法 |
|---|---|
| 轮询 | 有一个主节点,挨个问每台设备"你有要发的吗" |
| 令牌传递 | 一个叫"令牌"的特殊帧在设备间按顺序传,拿到令牌的才能发 |
优点:无冲突,而且不像信道划分那样在一方空闲时浪费(有数据才占用,没数据就跳过)。
缺点也很明确:
- 轮询有额外开销 —— 主节点问一圈本身要花时间(哪怕是"你没有数据"这个回答)
- 有单点故障 —— 轮询的主节点挂了,整个网络就停了
- 令牌丢失是个经典难题(需要额外的机制检测和重新生成令牌)
三类方法的取舍
| 信道划分 | 随机接入 | 轮流 | |
|---|---|---|---|
| 低负载时 | 浪费(分到的份用不上) | 好(想发就发) | 有轮询开销 |
| 高负载时 | 好(无冲突) | 差(碰撞急剧增加) | 好(有秩序) |
| 需要中心节点吗 | 不需要 | 不需要 | 需要(或需要令牌) |
| 典型场合 | 电话网络、蜂窝上行 | 以太网早期、Wi-Fi | 令牌环网、蓝牙 |
一句话总结这个取舍:
实测限制
| 想观察什么 | 情况 |
|---|---|
| 真实以太网的冲突率 | 现代交换式以太网全双工、无冲突(《交换机》那一章讲过),观察不到冲突 |
| 真实 Wi-Fi 的信道竞争 | 需要多台设备同时打流,本机是单机 |
| CSMA 的效率 | 模拟没做成功,本章不给出数字 |
| 本章数据 | 两个 ALOHA 结果是模拟实测;CSMA/退避/轮流部分只有标准依据 |
补充说明:本机连的是交换式以太网 + 无线,这两个环境里都已经看不到"共享介质争用"的原始形态了 ——
- 有线侧:交换机给每个端口独立带宽,全双工,根本不会冲突
- 无线侧:确实在争用介质,但驱动不暴露冲突计数器
所以本章讲的是"介质共享问题的原理与解法",而本机没有合适的观测点。 这也是这一章唯一一章几乎没有本机实测的原因。
常见误解
误解一:「ALOHA 效率低是因为它不考虑别人,所以只是个失败的早期方案」
它的价值在于给出了一个可分析的模型。 本章模拟精确复现了它的两个上限,而"危险窗口减半则效率翻倍"这个洞察,直接指导了后来所有随机接入协议的设计。能算清楚一个简单模型的极限,比只知道一个复杂协议的流程更有用。
误解二:「CSMA 先听后发就不会冲突了」
仍然会冲突。 原因是传播时延:A 发出信号后需要一点时间才能到达 B,如果 B 恰好在这段时间内也听了信道(那时还没听到 A 的信号),B 就会以为信道空闲而开始发送。所以"先听后发"只是大幅减少冲突,不能消除。
误解三:「无线也用 CSMA/CD 就行了」
做不到,有两个物理原因:① 无线设备发送时听不到别人(自己的信号太强);② 隐蔽站问题 —— 两个离得远的站互相听不到,却会在中间的接收方那里撞车。所以无线只能用 CSMA/CA(避免)。
误解四:「冲突后等一个固定时间再重试就行」
会造成反复碰撞。 如果两个站同时撞车,它们等同样长的时间后会同时重试、再次撞车。 二进制指数退避用随机化 + 逐次扩大范围来解决:冲突越频繁,说明竞争越激烈,重试时刻就散布得越开。
误解五:「交换式以太网里也需要处理冲突」
不需要。 交换机给每个端口独立的带宽,而且支持全双工(收发可以同时)—— 冲突在物理上就不会发生。这正是《以太网帧》那一章讲的"CSMA/CD 在现代网络里实际上已经不用了"的原因。
本章小结
| 结论 | 类型 |
|---|---|
| 广播链路的核心问题是同一时刻只能有一方发送 | 标准 |
| 三类思路:信道划分、随机接入、轮流 | 标准 |
| 信道划分无冲突,但低负载时浪费分到的资源 | 标准 |
| 纯 ALOHA 的脆弱期是 2 个帧时,时隙 ALOHA 是 1 个时隙 | 标准 |
| 理论上限:纯 ALOHA 1/(2e) ≈ 18.4%,时隙 ALOHA 1/e ≈ 36.8% | 标准 |
| 模拟实测:纯 ALOHA 峰值 0.1830(G=0.5),时隙 ALOHA 峰值 0.3680(G=1.0) | 模拟实测 |
| 两个模拟峰值与理论值吻合,且峰值位置也与理论预测一致 | 模拟实测 |
| 时隙 ALOHA 约为纯 ALOHA 的两倍,原因是危险窗口减半 | 推理 |
| 随机接入适合低负载,高负载时碰撞导致效率急剧下降 | 标准 |
| CSMA 用先听后发减少冲突,但传播时延使它无法消除冲突 | 标准 |
| 无线用 CSMA/CA 而非 CSMA/CD:发送时听不到,且有隐蔽站问题 | 标准 |
| 二进制指数退避让重试时刻随冲突次数指数级扩散 | 标准 |
| 以太网连续冲突 16 次即放弃并报错 | 标准 |
| 轮询与令牌传递无冲突且不浪费,但有开销与单点故障 | 标准 |
| CSMA 的模拟未做成功,故本章不给出 CSMA 的效率数字 | 实测限制 |
| 本机所处环境(交换式以太网 + 无线)已看不到共享介质争用的原始形态 | 实测限制 |
自测题
7 题 · 先自己答,再展开对照
为什么多台设备共享介质时必须有一套访问规则?
因为物理信号会叠加。 如果两台设备同时发送,两个信号在介质上会互相破坏 —— 不是效率降低,而是双方的数据都变成垃圾。
所以必须有规则决定"谁在什么时候可以发"。(注意这和第 4 模块的路径选择是不同的问题:那是"包往哪走",这是"这一刻谁能说话"。)纯 ALOHA 和时隙 ALOHA 的脆弱期分别是多少?为什么时隙版的效率约为纯版的两倍?
纯 ALOHA 的脆弱期是 2 个帧时,时隙 ALOHA 是 1 个时隙。
纯 ALOHA 里一个帧可能被"它开始前一整个帧时内"或"它结束后一整个帧时内"的任何帧撞上;切了时隙后所有帧对齐到边界,只需担心自己这一个时隙里有没有别人。
危险窗口减半 → 成功率翻倍 → 这就是 1/e 和 1/(2e) 的关系(本机模拟复现为 0.3680 和 0.1830)。信道划分协议在什么情况下效率低?为什么?
在低负载时效率低。 因为资源是预先切分的 —— 分给你的时隙(或频段)里如果你没有数据要发,这个份额就空着,别人也不能用。
负载越高这种浪费越小(总有数据要发),所以信道划分适合稳定高负载的场景(如电话网络)。CSMA 已经"先听后发"了,为什么还会冲突?
因为传播时延。 A 发出的信号需要一点时间才能传到 B。如果 B 恰好在这段时间内去听信道,它还没听到 A 的信号,就会以为信道空闲而开始发送 —— 于是冲突。
所以"先听后发"只是大幅减少冲突,不能消除它。 距离越远、传播时延越大,这个问题越明显。无线网络为什么不能像有线那样做"边发边听"的冲突检测?给出两个理由。
两个理由:
- 发送时听不到别人:无线设备自己的发送信号太强,会盖住别人发来的弱信号,所以"边发边听"在物理上做不到
- 隐蔽站问题:A 和 C 都能与 B 通信,但 A 和 C 相距太远、互相听不到。于是两者都以为信道空闲而发送,在 B 那里撞车,而 A 和 C 谁都不知道
所以无线只能用 CSMA/CA(冲突避免)—— 靠机制尽量降低碰撞概率,而不是靠检测。冲突之后为什么不能等一个固定时间再重试?
因为会反复碰撞。 如果两个站同时撞车,它们等同样长的时间后会同时重试、再次撞车,如此循环。
正确做法是二进制指数退避:从{0, ..., 2ⁿ−1}里随机选一个时隙等待(n 是连续冲突次数)。随机化让重试时刻错开,指数增长让竞争激烈时散布得更开。以太网帧最小长度 64 字节和本章讲的冲突检测有什么关系?
关系很直接:最小帧长是为了让 CSMA/CD 能工作。
发送方必须在自己发完之前还能听到冲突信号,否则它以为发成功了,实际上帧已经被撞坏。这就要求帧的发送时间不小于一个往返传播时间。
在 10 Mbps 以太网上,"往返传播时间"对应的就是 64 字节的发送时间。数据不足 46 字节时要填充 —— 填充的存在完全是为了这个机制,而不是出于协议美学。
参考资料与适用范围
- 《计算机网络:自顶向下方法(原书第8版)》§6.3,纸书301–311页(PDF320–330页):本章概念与机制的对应教学章节,引用时需保留模型与版本条件。
- 教材作者配套教学资源入口:网站目前显示的教材版本与用户提供的第8版可能不同,页码以本章列出的中文第8版为准。
修订核对日期:2026-10-13。本次补充概念入口与教材出处;旧稿的具体数值为历史观察,未重新实测。相关脚本和完整日志未随当前项目提供,不能仅凭转述断言实验已复核,也不据此断言数据造假。