← 网络基础学习第 41 / 55 章进阶40 分钟

模块五 · 链路层和局域网

多路访问协议

链路层有个和网络层完全不同的难题 —— 多台设备共享同一条线路时,谁能在什么时候发? 没有规则就是一团乱撞。这一章讲三类解决思路,并用模拟复现两个经典的效率上限。

本章要解决的问题:链路层有个和网络层完全不同的难题 —— 多台设备共享同一条线路时,谁能在什么时候发? 没有规则就是一团乱撞。这一章讲三类解决思路,并用模拟复现两个经典的效率上限。

本章的证据来源:概念讲法参考教材§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 题 · 先自己答,再展开对照

  1. 为什么多台设备共享介质时必须有一套访问规则?
    因为物理信号会叠加。 如果两台设备同时发送,两个信号在介质上会互相破坏 —— 不是效率降低,而是双方的数据都变成垃圾。
    所以必须有规则决定"谁在什么时候可以发"。(注意这和第 4 模块的路径选择是不同的问题:那是"包往哪走",这是"这一刻谁能说话"。)
  2. 纯 ALOHA 和时隙 ALOHA 的脆弱期分别是多少?为什么时隙版的效率约为纯版的两倍?
    纯 ALOHA 的脆弱期是 2 个帧时,时隙 ALOHA 是 1 个时隙。
    纯 ALOHA 里一个帧可能被"它开始前一整个帧时内"或"它结束后一整个帧时内"的任何帧撞上;切了时隙后所有帧对齐到边界,只需担心自己这一个时隙里有没有别人。
    危险窗口减半 → 成功率翻倍 → 这就是 1/e 和 1/(2e) 的关系(本机模拟复现为 0.3680 和 0.1830)。
  3. 信道划分协议在什么情况下效率低?为什么?
    在低负载时效率低。 因为资源是预先切分的 —— 分给你的时隙(或频段)里如果你没有数据要发,这个份额就空着,别人也不能用。
    负载越高这种浪费越小(总有数据要发),所以信道划分适合稳定高负载的场景(如电话网络)。
  4. CSMA 已经"先听后发"了,为什么还会冲突?
    因为传播时延。 A 发出的信号需要一点时间才能传到 B。如果 B 恰好在这段时间内去听信道,它还没听到 A 的信号,就会以为信道空闲而开始发送 —— 于是冲突。
    所以"先听后发"只是大幅减少冲突,不能消除它。 距离越远、传播时延越大,这个问题越明显。
  5. 无线网络为什么不能像有线那样做"边发边听"的冲突检测?给出两个理由。
    两个理由:
    - 发送时听不到别人:无线设备自己的发送信号太强,会盖住别人发来的弱信号,所以"边发边听"在物理上做不到
    - 隐蔽站问题:A 和 C 都能与 B 通信,但 A 和 C 相距太远、互相听不到。于是两者都以为信道空闲而发送,在 B 那里撞车,而 A 和 C 谁都不知道
    所以无线只能用 CSMA/CA(冲突避免)—— 靠机制尽量降低碰撞概率,而不是靠检测。
  6. 冲突之后为什么不能等一个固定时间再重试?
    因为会反复碰撞。 如果两个站同时撞车,它们等同样长的时间后会同时重试、再次撞车,如此循环。
    正确做法是二进制指数退避:从 {0, ..., 2ⁿ−1} 里随机选一个时隙等待(n 是连续冲突次数)。随机化让重试时刻错开,指数增长让竞争激烈时散布得更开。
  7. 以太网帧最小长度 64 字节和本章讲的冲突检测有什么关系?
    关系很直接:最小帧长是为了让 CSMA/CD 能工作。
    发送方必须在自己发完之前还能听到冲突信号,否则它以为发成功了,实际上帧已经被撞坏。这就要求帧的发送时间不小于一个往返传播时间。
    在 10 Mbps 以太网上,"往返传播时间"对应的就是 64 字节的发送时间。数据不足 46 字节时要填充 —— 填充的存在完全是为了这个机制,而不是出于协议美学。

参考资料与适用范围

  • 《计算机网络:自顶向下方法(原书第8版)》§6.3,纸书301–311页(PDF320–330页):本章概念与机制的对应教学章节,引用时需保留模型与版本条件。
  • 教材作者配套教学资源入口:网站目前显示的教材版本与用户提供的第8版可能不同,页码以本章列出的中文第8版为准。

修订核对日期:2026-10-13。本次补充概念入口与教材出处;旧稿的具体数值为历史观察,未重新实测。相关脚本和完整日志未随当前项目提供,不能仅凭转述断言实验已复核,也不据此断言数据造假。

正文源自 m5-08-多路访问协议.md · 共 14 节 · 7 道自测题