本节摘要:共享介质上多个站点如何轮流发言,是链路层最像"社会规则"的部分。本节讲清 CSMA/CD 的侦听、冲突检测与指数退避全过程,二进制退避的数学直觉,以及无线网络改用 CSMA/CA 的原因——空气里发着信号的同时听不见冲突。
信封备好,数据包在链路层的第二道关卡是排队发言。回顾 2.2 节的集线器案例:所有设备共享一根介质,两个人同时开口就撞车。怎么把"撞车率"压到可接受?这就是介质访问控制(MAC,注意与 MAC 地址的 MAC 缩写撞车,前者是 Medium Access Control)要解的问题。
经典以太网的规则叫载波侦听多路访问/冲突检测,流程四步:
CSMA/CD 完整流程: 1. 载波侦听:想发帧前先听介质,有人发就持续等待 2. 空闲即发:介质静默超过帧间间隙(96 比特时间)就立即发送 3. 边发边听:发送的同时仍在监测——两人几乎同时起跑的冲突 表现为电压叠加超出正常范围,立刻可被察觉 4. 冲突处理: a. 马上停发普通数据,改发 32 比特拥塞信号(jam), 确保所有参与者都得知发生了冲突 b. 按二进制指数退避等待后回到第 1 步 c. 重传 16 次仍失败则放弃,向高层报错 帧间间隙 96 比特时间的用意:给刚收完帧的网卡留出 处理时间,也保证低速设备的公平接入机会。
二进制指数退避的精妙在于惩罚重犯、自我收敛:第 n 次冲突后,在 0 到 2^n − 1 个"时隙"里随机挑一个等待(上限 1023)。头两次冲突的可选等待极短——网络只是偶尔挤一下,别反应过度;连续冲突说明真堵了,随机范围指数扩大,把发言者迅速摊开。数学上这类似"自适应的多路退让",不需要任何中央调度。
为什么最小帧要 64 字节?冲突检测的前提是"还没发完就发现撞了"。10 Mbps 以太网信号往返最大时间 51.2 微秒,恰好等于 64 字节的发送时间(64 × 8 ÷ 10^7 = 51.2 μs)。帧比这短,发完了冲突信号还没回来,发送方误以为平安无事。最小帧长是冲突检测机制的物理约束,不是协议洁癖。
Wi-Fi 用的是 CSMA/CA(冲突避免)。原因是空气里的物理限制,两个:
其一,自己说话听不见别人。无线发射时本机信号强度远超接收到的任何远端信号,边发边检等于在烟花旁边听耳语。其二,隐藏站点问题:A 和 C 都能看见 B,但隔着障碍互相看不见——A 发信给 B 时 C 侦听介质觉得空闲,开口就撞,双方还都检测不到。
隐藏站点示意(距离/障碍导致): A ······· B ······· C A、C 互不在通信范围内 A → B 发送中:C 载波侦听听不到 A(隐藏站点) C 判定空闲 → 也向 B 发送 → 在 B 处碰撞 A、C 双方都无法检测到这次碰撞 → 数据静默丢失 CSMA/CA 的补救: - 请求发送/清除发送(RTS/CTS)机制:C 发送前先小声申请 (RTS),B 广播 CTS 批准并"劝退"周围所有人, 大帧的冲突被前置到极短的 RTS 阶段 - 帧间间隔分优先级:短帧、确认帧间隔更短, 高优先级流量天然抢到发言权 - 每个单播帧都要求确认(ACK):收不到就当作已冲突, 由发送方退避重传——用"事后确认"替代"事中检测"
对比两代机制的哲学差异很有味道:有线的策略是"撞了立刻知道,惩罚性退让",无线的策略是"尽量别撞,撞了靠没收到回执推断"。后者代价更高(每帧都要确认),但这是空气这种共享介质的无奈。
背景:某开放办公区,午后时段视频会议频繁卡顿,早晨正常。IT 只看到"无线信号满格",无从下手。
操作:先看信道占用,再测延迟分布。
# 扫描周边 Wi-Fi(信道列) $ sudo iwlist wlan0 scan | grep -E "Channel|ESSID" | head -30 Channel:01 ESSID:"office-5G" Channel:06 ESSID:"office-2.4G" Channel:06 ESSID:"mobile-hotspot-A" Channel:11 ESSID:"meeting-room" Channel:11 ESSID:"mobile-hotspot-B" Channel:11 ESSID:"printer-direct" 解读:2.4GHz 只有 1/6/11 三个互不重叠信道, 本区至少 4 个网络挤在 6 和 11 上。午后手机热点增多, 共享同一信道的设备数翻倍——CSMA/CA 的退避竞争加剧, 等待时延飙升。信号满格与信道拥挤并不矛盾: 满格说明"听得清",拥挤说明"说不上话"。 处置:办公网迁到 5GHz(信道多、干扰少), 行政手段限制个人热点,会议终端改有线接入。 次日同时段复测,会议丢帧率从 3.1% 降到 0.2%。 变式:家庭场景同样的思路——路由器放房屋中心(减少隐藏站点)、 固定信道避开邻居、双频分开 SSID,都是 CSMA/CA 原理的直接应用。
💡 关键直觉:交换式以太网(全双工、每口独享)早已没有冲突,CSMA/CD 名义退休;但无线网络永远是共享介质,CSMA/CA 与退避逻辑至今每天都在影响你的手机。理解"空气是看不见的集线器",Wi-Fi 的所有怪脾气都能解释。
全双工交换式以太网还有 CSMA/CD 吗? 没有。全双工链路收发各用一对线(或不同波长),物理上不可能冲突,网卡驱动里 CSMA/CD 逻辑形同虚设。但半双工模式下(某些老旧介质、以及调试误配时)它仍会启用——这也是"链路协商成半双工导致性能暴跌"这一经典故障的原理根源。
Wi-Fi 为什么不能用 RTS/CTS 一劳永逸? RTS/CTS 本身也是帧,同样要竞争介质,且每个包多两个控制帧的开销在轻负载时纯属浪费。实际实现是按包长阈值启用:小包直接发,大包才走申请批准流程。
秩序有了,下一节看这套秩序如何被交换机工程化,以及 VLAN 怎么把一栋楼隔成多个院子。