☰
局域网介质访问控制全解析:从ALOHA到CSMA的吞吐量与避坑指南
2026/10/4 14:36:12 网站建设 项目流程

简介:这份教学课件聚焦计算机网络原理中的局域网技术,适合计算机相关专业学生及准备网络基础考试的学习者。资源以单份PPT形式整理,大小3.44MB,内容系统梳理了介质访问控制(MAC)子层核心知识,包括静态与动态信道分配策略、纯ALOHA与时隙ALOHA协议、1-坚持/非坚持/p-坚持CSMA,以及令牌环、以太网等典型局域网技术,并对吞吐量、冲突概率等关键概念做了图示与公式辅助说明。课件结构层次分明,从信道分配基础到具体协议对比逐步展开,便于快速建立局域网技术整体框架。目前已有84人学习,可用于课堂讲解、考前复习或自学参考,尤其适合需要掌握MAC协议原理与局域网组网基础的学习者。

1. 局域网技术课件拆解:先弄懂介质访问控制,再看懂组网

局域网这块内容在《计算机网络原理》里被不少人当成“背协议名”的章节,实际上它真正的核心是一套数学模型——多个站点共享一条广播信道时,谁先发、谁后退、撞了怎么办。这份课件把重点压在介质访问控制子层(MAC),从静态分配讲到 ALOHA 再到 CSMA,每个协议都带吞吐量公式和适用条件,而不是简单罗列概念。适合正在准备考研、期末考的学生,也适合刚接手园区网维护、想补一补交换与共享介质底层逻辑的工程师。后面我按课件顺序把信道分配、ALOHA 的吞吐量边界、CSMA 的三种坚持策略逐层拆开,给出可复现的模拟脚本和参数经验,你看完可以直接用。

2. 信道分配的两种路线:静态策略为什么不适合突发流量

2.1 静态分配 FDM / TDM:适用边界非常窄

课件里把静态分配放在最前面,方案就两类:频分多路复用(FDM,波分复用 WDM 是它在光通信里的变体)和时分多路复用(TDM)。FDM 的原理是把可用频带切成若干子频带,每个用户独占一段;TDM 则是把时间轴切成固定长度的时隙,每个用户在属于自己的时隙里发送数据。

静态分配的优点和缺点是同一个来源——资源划分固定不变。它们适合用户数量少、数目基本固定、每个用户通信量都偏大的场景。典型例子是电话中继:一条物理链路上固定分给若干路电话,每一路随时有话可传,固定分配反而效率高。但换成局域网就暴露出问题了:站点数虽然固定,每个站点的发送需求却是突发的,绝大部分时间链路是空闲的。把频带或时隙固定分给每个站点,等于大量资源在空转。

我实际做网络规划时基本不会在局域网场景里考虑 FDM/TDM,除非是点对点的专线租用。课件把「无法灵活适应站点数及其通信量的变化」列为静态分配的主要缺点,这句话是整个第 8 章引出动态分配的楔子。

2.2 动态分配的两条路线:随机访问与控制访问

动态分配的逻辑很简单:站点有数据要发送时才占用信道,本质上属于异步时分复用。课件把它进一步分成两类——随机访问(争用)和控制访问。

随机访问的做法是:各个站点有数据就发送,冲突后再协调重发。它的优点是实现简单、延迟短,在负载轻的网络里表现很好——站点少、发送频率低,冲突概率非常低。缺点是信道利用率上不去,负载一重就开始频繁冲突,大量带宽被浪费在重传上。

控制访问则反过来,分为轮转和预约两类。轮转是每个节点轮流获得信道使用权,典型实现是令牌环;预约是先声明自己要发送,获得使用权之后才真正发数据。这两种方式不会发生冲突,负载重时信道利用率高,但负载轻时反而低——节点要等令牌轮到自己,或者等预约确认,这中间白白增加了延迟。

我在实际工程里选型时会先看流量特征:突发型流量优先考虑随机访问,持续型流量或者对实时性要求高的场景必须上控制访问。工业现场总线就是个典型例子,几乎所有实时控制网络都用轮询或令牌机制,没人敢用纯争用协议,因为冲突导致的延迟抖动在现场是无法接受的。

2.3 局域网数据链路层模型:LLC 与 MAC 的分工

课件在进入 8.1 节之前先给了一张局域网数据链路层模型图,把数据链路层拆成两个子层:逻辑链路控制(LLC)和介质访问控制(MAC)。LLC 向上层提供连接环境,MAC 对下层提供访问介质的方法。

这个分层设计的核心目的是解耦。以太网、令牌环、无线局域网共享介质的方式完全不同,但上层网络层协议不需要感知这些差异。LLC 负责把下层差异消化掉,MAC 则专注于解决「多个站点怎么访问共享介质」这一个核心问题。理解这一点,你就明白为什么网卡驱动里既有 MAC 地址的封装,又有 LLC 层的逻辑链路处理。

这层模型其实是整章的主线——后面讲的所有协议都属于 MAC 子层,都是解决「多站点共享信道」这个问题的不同方案。课件把它放在最前面当铺垫,实际上它是理解 ALOHA 和 CSMA 共同背景的框架。

3. ALOHA 协议吞吐量拆解:两次跃迁背后的数学逻辑

3.1 纯 ALOHA:最早的争用协议与易破坏区

ALOHA 的起源课件里有交代:20 世纪 70 年代,美国夏威夷大学用它把分散在各个岛屿上的远程终端连接到本部主机。这是无线广播信道上最早采用争用协议的网络,思路也最朴素——每个站点只要有数据就发,通过监听信道发现冲突,若冲突则等待一段随机时间后重发。

纯 ALOHA 的吞吐量上限是 0.184,这个数字需要理解它的来历。课件给出公式 S = G·e^(-2G),当 G = 0.5 时 S 取最大值 1/(2e) ≈ 0.184。这里 S 表示吞吐量,即在帧的发送时间 T0 内成功发送的平均帧数;G 表示网络负载,即 T0 内总共发送的平均帧数(包含成功的帧和因冲突失败的帧)。

关键就在帧的易破坏区。一个帧在信道上的脆弱时间窗是 2T0 而不是 T0——因为这个帧开始发送之前的 T0 时间内,如果有其他站点开始发送,两个帧就会重叠;开始发送之后的 T0 时间内同样不能有别人发。所以一个帧成功发送的概率是 e^(-2G),这就是公式里 2G 的由来。

我第一次接触这个结论时觉得有点反直觉:明明一个帧只占 T0 的传输时间,为什么脆弱窗口要算成两倍?后来想明白了——广播信道没有中心调度,任何站点都可能在任何时刻发帧,你的帧还没发完,别人的帧就可能叠上来。这也是为什么课件会在吞吐量曲线图上标注「不稳定区域」。

3.2 时隙 ALOHA:把易破坏区缩短一半

时隙 ALOHA 的改进说穿了就一点:把信道时间切分为离散的时间片(slot),每个时间片长度刚好能传一个帧,站点只能在时间片开始的瞬间发送。代价是需要全局时钟同步。

这个改动直接把易破坏区从 2T0 压缩到 T0——因为所有站点都对齐到同一套时间片边界,帧与帧之间要么完整错开,要么在一个时间片内完全冲突,不会出现「从半路插入」的情况。公式从 S = G·e^(-2G) 变成 S = G·e^(-G),当 G = 1 时 S 取最大值 1/e ≈ 0.368,正好是纯 ALOHA 的两倍。

课件里那句「与纯 ALOHA 相比信道的利用率提高一倍」,指的就是这个 0.368 对 0.184 的关系。这个「时间片对齐」的思路对后续协议影响深远——以太网的冲突检测、无线网络里的时隙预约,本质都是对发送时机做某种限制来降低冲突概率。

这里有一个值得注意的代价:时隙 ALOHA 要求全局时钟同步,这在有中心节点的蜂窝网络里容易做到,但在完全自组织的临时网络中很难实现。同步本身就是成本,课件没有展开讲,但实际选型时必须考虑。

3.3 用 Python 复现吞吐量曲线

公式看着简单,不如自己跑一遍。这里给出一个模拟纯 ALOHA 和时隙 ALOHA 吞吐量的脚本,可以直接复现课件里的曲线:

import numpy as np def throughput_pure_aloha(G): """纯 ALOHA 吞吐量:S = G * exp(-2G)""" return G * np.exp(-2 * G) def throughput_slotted_aloha(G): """时隙 ALOHA 吞吐量:S = G * exp(-G)""" return G * np.exp(-G) # 负载从 0.01 扫描到 5,观察吞吐量变化趋势 G_values = np.linspace(0.01, 5, 200) pure_values = throughput_pure_aloha(G_values) slotted_values = throughput_slotted_aloha(G_values) # 输出理论峰值点 peak_pure = throughput_pure_aloha(0.5) # 理论峰值对应 G=0.5 peak_slotted = throughput_slotted_aloha(1.0) # 理论峰值对应 G=1.0 print(f"纯 ALOHA 峰值吞吐量: {peak_pure:.3f} (G=0.5)") print(f"时隙 ALOHA 峰值吞吐量: {peak_slotted:.3f} (G=1.0)")

逻辑说明:脚本用 numpy 在负载区间内均匀取 200 个点,分别计算两种协议在每个负载点的归一化吞吐量,然后输出理论峰值对应的 G 值。运行结果应显示 0.184 和 0.368,和课件曲线一致。

参数说明:np.linspace(0.01, 5, 200)表示从负载 0.01 扫到 5,取 200 个样本点。扫描范围之所以到 5,是为了展示过载后吞吐量下滑的区间。实际设计网络时,我会把工作负载压在峰值点左侧——比如时隙 ALOHA 把 G 控制在 0.5 以内,留出冲突重传的余量。

自己跑一遍比背公式更容易建立直觉:G 从零增到峰值的过程中,吞吐量上升越来越慢,说明新增的负载大部分被冲突消耗了;越过峰值后,吞吐量不升反降,这就是负载过重系统崩溃的数学表现。

4. CSMA 三种坚持策略:1-坚持、非坚持、p-坚持的取舍

4.1 1-坚持 CSMA:死等信道带来的冲突放大

ALOHA 最大的问题是站点完全不管别人在不在发,撞了才知道。CSMA 的核心改进是「先听再说」——发送前先监听信道。1-坚持策略的具体行为是:站点在发送数据前先监听信道,若信道忙则坚持监听直至发现空闲,一旦空闲立即以概率 1 发送数据;发现冲突后随机等待一段时间,然后重新开始监听。

「1-坚持」这个名字里的 1 指信道空闲时发送的概率为 1,不犹豫。好处是信道一释放,等待的站点能立刻抢占,消息传递延迟低。坏处是:多个同时等待的站点会同时听到信道空闲、同时发送,冲突反而被放大。特别是在两个站点都盯着信道等释放的场景下,释放瞬间几乎必然发生碰撞。

课件点出影响性能的两个因素:信号传播延迟和 1-坚持的策略本身。传播延迟大意味着站点听到「信道空闲」时,远端站点可能已经发送了,产生隐蔽终端问题。所以课件原话是「该协议适合于规模较小和负载较轻的网络」,这句话限定了它的适用场景。

4.2 非坚持 CSMA:用延迟换信道利用率

非坚持 CSMA 的机制和 1-坚持完全相反:发送前先监听信道,若信道忙则放弃监听,等待一个随机时间后再监听;若信道空闲则发送数据。

这种「忙就退让」的策略减少了冲突——不同站点退避的随机时间不同,不会扎堆去抢信道释放瞬间。信道利用率高于 1-坚持 CSMA,这是课件的判断。但代价是延迟特性变差:一个站点可能退避计时还没结束信道就已经空闲了,白白浪费了可用的发送窗口。

我在工程上把非坚持理解成「悲观主义」策略:默认信道很挤,主动让路。它在站点数量多、负载偏重的共享信道里表现更好。但要注意一个问题:随机退避时间的取值范围如果设置不合理,可能出现长时间没人发送的情况。课件没有展开退避时间的设置细节,实际实现时这是很关键的一个参数。

4.3 p-坚持 CSMA:折衷方案里的 p 值如何定

p-坚持 CSMA 适用于时分信道。它的行为是:发送前监听信道,信道忙则等到下一个时间片再监听;信道空闲则以概率 p 发送数据,以概率 1-p 将发送推迟到下一个时间片。下一个时间片执行相同的操作,直到发送成功或检测到信道忙。

这个策略是在 1-坚持和非坚持之间取折衷。p 偏大会像 1-坚持,延迟低但冲突概率高;p 偏小会像非坚持,冲突少但延迟大。课件把话说得很克制:「影响协议性能的关键在于 p 的选择」,但没有给出选 p 的指导。

我一般用这样的估算方法:先估计同时活跃的站点数 N,把 p 设成 1/N 量级。这样在一个时间片内,期望发送的站点数约为 N × p = 1,能平衡成功率和冲突率。举个例子,如果网络里大约有 10 个活跃站点,p 取 0.1 左右比较合理;站点越少 p 可以越大,站点越多 p 必须越小。拿到初始值后再做一轮实测微调,观察吞吐量和延迟曲线。

三种策略的行为差异和适用场景放在一起对比更直观:

策略信道忙时行为信道空闲时行为冲突概率延迟特性适用场景
1-坚持坚持监听直到空闲立即发送较高较低小规模、轻负载网络
非坚持放弃监听,随机退避后重试立即发送较低较高站点多、负载重的共享信道
p-坚持等下一个时间片再监听以概率 p 发送取决于 p取决于 p时分信道,需调 p 参数

需要强调一个容易混淆的点:以太网实际用的是 CSMA/CD,可以理解成 1-坚持 CSMA 加碰撞检测和二进制指数退避的变体,不适合直接用「哪一坚持」来归类。它的「坚持」是为了快速抢占信道,而冲突解决靠的是「检测到碰撞后立即停止发送 + 截断二进制指数退避」。先把三种无 CD 的 CSMA 策略搞清楚,再去看以太网,脉络会清晰很多。

4.4 用模拟脚本看清 p 值对冲突率的影响

调 p 值不能只靠公式,我写了一个简单的 Python 模拟脚本。场景是 N 个活跃站点,每个时间片开始时各自独立以概率 p 决定是否发送,统计成功、冲突和空闲的时间片比例:

import random def simulate_p_persistent(active_stations, p, slots=10000, seed=42): """模拟 N 个站点的 p-坚持访问,统计成功/冲突/空闲时间片占比""" random.seed(seed) success = 0 collision = 0 idle = 0 for _ in range(slots): # 每个站点独立决定是否发送,统计发送者数量 senders = sum(1 for _ in range(active_stations) if random.random() < p) if senders == 0: idle += 1 # 无人发送,时隙空闲 elif senders == 1: success += 1 # 刚好一个站点发送,发送成功 else: collision += 1 # 两个及以上站点同时发送,冲突 return { "idle_ratio": idle / slots, "success_ratio": success / slots, "collision_ratio": collision / slots, } # 固定 10 个活跃站点,对比不同 p 值的表现 for p in [0.05, 0.1, 0.2, 0.5]: result = simulate_p_persistent(active_stations=10, p=p) print(f"p={p}: 空闲={result['idle_ratio']:.3f}, " f"成功={result['success_ratio']:.3f}, 冲突={result['collision_ratio']:.3f}")

逻辑说明:每个时间片模拟 N 个活跃站点各自做一次独立随机试验,发送者数量为 0 记为空闲、恰好 1 个记为成功、2 个及以上记为冲突,迭代 10000 个时间片后统计三类事件的比例。

参数说明:active_stations=10表示同时有 10 个活跃站点;p 从 0.05 扫到 0.5。运行结果会验证一个规律:p 增大时冲突比例明显上升,空闲比例下降,而成功率在 p=0.1 附近出现峰值——这就是 1/N 原则的实证。

这个脚本可以继续扩展,比如给冲突站点加退避重传机制,观察重传对网络稳定性的影响。但课程层面先看这一版就够了,它能把「p 值怎么调」从抽象公式变成可见的数据。

5. 局域网技术避坑:五个亲身踩过的理解误区

5.1 把 0.184 当实际可用带宽直接算容量

现象:拿着纯 ALOHA 的吞吐量上限 0.184 去估算链路容量,得出「10Mbps 链路最多跑 1.84Mbps」的结论。实际用模拟工具测试,发现吞吐量并没有低到这么离谱。

原因:0.184 是理论归一化最大吞吐量,对应「只发送定长帧、负载恰好处于 G=0.5」的理想条件。真实系统里帧有前导码、帧间间隔、控制字段等额外开销,而且链路负载不可能精确稳定在峰值点。归一化吞吐量不等于带宽利用率。

解决:把 0.184 当成「信道能承载的净数据比例上限」来理解。估算实际吞吐量时,先根据帧长算开销占比,再用 S ×(1 - 开销占比)做一次换算。比如 1518 字节的以太网帧,前导码和帧间间隔大约占 7% 左右,净效率还要再打折扣。

5.2 时隙 ALOHA 的同步被做成了全网高精度硬同步

现象:实现时隙 ALOHA 时,照课件「要求全局时钟同步」一句字面执行,给每个节点上了高精度时钟同步方案,成本高到离谱。

原因:课件里「全局时钟同步」说的只是时隙边界对齐,不是所有站点要精确到纳秒级时间同步。时隙 ALOHA 真正需要的是每个站点在时隙边界处统一行动,这个精度要求通常在微秒级。

解决:采用中心信标同步——主站周期性地广播时隙边界信号,从站收到信标后对齐自己的发送时刻。这种做法的同步成本和复杂度远低于全网硬同步,也更符合 ALOHA 最早在无线广播场景里的实际部署方式。

5.3 非坚持 CSMA 的退避时间设成固定值

现象:实现了非坚持 CSMA,测下来冲突率居高不下,而且重传失败的概率很大,网络在重负载下近似瘫痪。

原因:退避时间如果是固定值,多个冲突过的站点会再次在同一时刻监听——同一时刻退避结束、同一时刻重新发送,陷入同步冲突的循环。教科书只说了「等待一个随机时间」,没有强调随机值必须是变化的。

解决:把退避时间设成随机范围,并随重传次数扩大取值范围。常见做法是每次重传把退避窗口翻倍,比如第一次重传退避窗口取 0~100 个时间片,第二次取 0~200,以此类推,和以太网的截断二进制指数退避思路一致。这一条即使是非坚持 CSMA 也应该参考。

5.4 在重负载园区网里硬套 1-坚持 CSMA

现象:一个楼宇内 200 多台设备共享同一冲突域,网络高峰时段广播帧满天飞,实际吞吐量骤降,延迟严重抖动。

原因:1-坚持 CSMA 的适用范围是「规模较小、负载较轻」。200 台设备的广播域明显超出设计目标,冲突域过大导致节点频繁重传,重传又加剧信道占用,形成恶性循环。

解决:缩小冲突域。用交换机把网络划分成多个独立的冲突域,每个交换机端口对应一个冲突域,或者直接换用带冲突避免机制的协议。这也是为什么现代局域网都建立在交换式以太网上,共享式以太网只存在于实验室和古董集线器环境里。

5.5 p-坚持的 p 值固定不变

现象:照着课件设置了 p 参数后,低峰期大量时隙空闲,高峰期冲突频发,网络体验时好时坏。

原因:p 值的最优解依赖活跃站点数 N,而 N 是动态变化的。固定 p 只能在某一类负载下表现良好,负载一波动就偏离最优工作点。

解决:把 p 值做成自适应的——节点根据最近一段时间观测到的信道繁忙程度动态调整发送概率。信道忙则降低 p,信道空闲则适当提高。实现方式通常是用滑动窗口统计信道占用率,再映射到 p 值。这在无线局域网协议里已经是标配机制,有线共享介质场景同样适用。

这五个坑里,第 2、3、5 条属于实现细节问题,第 1、4 条属于选型和计算层面。课件本身讲的是协议逻辑,没有义务覆盖实现陷阱,所以我把这几个亲身踩过的坑记下来供你参考。

6. 把课件里的公式变成可复现的实验:三条验证路径

如果只看不练,吞吐量曲线的感觉很快就淡了。我建议按这三条路径把课件结论跑一遍,成本都很低。

第一条是数值验证。跑第 3 章的 Python 脚本,确认纯 ALOHA 和时隙 ALOHA 的峰值分别出现在 G=0.5 和 G=1.0,数值为 0.184 和 0.368。再把第 4 章的 p-坚持模拟脚本跑一遍,把 p 从 0.05 调到 0.5,观察冲突比率的上升趋势。这一步能帮你建立「负载-冲突-吞吐量」三者之间的数量关系。

第二条是协议观察。用 Wireshark 抓包验证 CSMA/CD 的行为——把一个集线器接进测试网络,用两台主机同时发起持续下载,观察抓包里重传帧的出现频率和退避行为。没有集线器也没关系,用 Mininet 模拟一条共享链路,同样能触发冲突和重传。抓包时重点看以太网帧头里的类型字段和重传间隔,这比看课本上的拓扑图直观得多。

第三条是教学顺序的重排。如果你和我一样要用这份课件讲课或组内分享,建议不要按原章节顺序过,而是按这个顺序讲:先给局域网数据链路层模型说明 LLC 与 MAC 的分工,再讲静态分配的局限引出动态分配,接着用纯 ALOHA 算出争用协议的吞吐量下限,再用时隙 ALOHA 展示对齐发送时机的效果,最后把三种 CSMA 放进同一个坐标系里对比。这个顺序的好处是每一步的改进都能对上一步的问题——学生先知道问题有多严重,才能理解方案好在哪。

从第一次在课堂上讲这章到现在,我养成了一个习惯:接手任何带共享介质的网络项目时,先做一遍「共享介质 vs 交换介质」的判断,把可能存在的冲突域列成清单,再决定要不要启用广播抑制、风暴控制这些安全手段。这个动作用不了十分钟,但已经不止一次避免了下班后被广播风暴召回机房的尴尬。如果你也用这份课件自学或者备课,我建议把这个判断流程加进你自己的检查清单,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询