深蓝黑背景封面。左侧是共享总线冲突示意图:一条横贯画面的灰色粗总线标注「共享介质:所有站点共用同一条信道」,左侧站点 A 与右侧站点 B 各通过垂直接口挂在总线上;一个青色帧箭头从 A 的接口向右传播,一个紫色帧箭头从 B 的接口向左传播,两帧在总线中点相遇,中点画着一枚爆炸星形标注「冲突!」,下方小字说明「双方边发边听,检测到电平异常即知冲突」;再往下是两枚退避胶囊「A 随机退避 1 个时隙」「B 随机退避 0 个时隙」,配注「二进制指数退避后各自重发」。右侧大标题两行「CSMA/CD 是什么」「交换网络为何不用它了」,副标题「先听后发 · 边发边听 · 冲突退避」,小注「从共享总线到全双工交换的必然退场」。左上角标注「面试经典 · 网络」,右上角圆角胶囊标注「Day 04 · 12-01」。 图 1:本文封面,共享总线上的一次冲突与退避。

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料整理,与任何公司的当前招聘无关。CSMA/CD 是以太网半双工时代的介质访问控制协议,IEEE 802.3 标准里的经典设计。这道题考两个层次:一是这套机制本身怎么工作,二是它为什么在全双工交换式以太网里退出了舞台——后者才是真正见功底的地方。

一句话结论:CSMA/CD 用「先听后发、边发边听、冲突退避」让多个站点共享一条信道;当交换机把网络变成全双工点对点链路后,冲突在物理上不可能发生,它就被架空了。

机制本身:三个词五个动作。

载波监听多路访问/冲突检测(CSMA/CD)的完整流程是五步。一,载波监听:想发帧先听信道,忙就持续等。二,信道一空闲立即发送——这就是「多路访问」,大家都有平等的发送权。三,边发边听:发送的同时监测信道上的信号,电平异常说明别人的帧也在这条总线上,撞了。四,一旦检测到冲突,立即停止发当前帧,并补发一段阻塞(Jam)信号把冲突强化,确保全网所有站点都感知到。五,双方各自执行二进制指数退避:第 k 次冲突后在 0 到 2 的 k 次方减 1 个时隙里随机取一个数等待,冲突越多等待窗口越大,满 16 次仍冲突就放弃该帧、向上层报错。

为什么帧不能短于 64 字节:冲突有「时差」。

信号在介质上传播要时间,这是冲突检测成立的前提。最坏的剧情是:站点 A 刚把帧发出去、信号还没传到总线另一端的 B,B 听信道是空闲的也开发,两帧中途相撞,冲突信号再花一个传播时延回到 A——A 必须在帧还没发完的时候听到这次冲突,否则它以为发送成功,帧就丢了还没人知道。所以 IEEE 802.3 给半双工以太网定了争用期:2 倍端到端传播时延,对应 512 比特时间——10 Mbps 下就是 51.2 微秒——最短帧因此被钉死在 64 字节,不足的用填充字节补齐。

退避算法效果如何?跑个模拟看看。

二进制指数退避的精妙在于冲突越多、随机窗口越宽,双方再次撞上的概率指数级下降。用 20 万次双站冲突模拟验证(Node.js 22.15.0,node csma.js):

第 1 次尝试成功: 49.76%
第 2 次尝试成功: 37.72%
第 3 次尝试成功: 10.93%
第 4 次尝试成功: 1.50%
第 5 次尝试成功: 0.09%
平均需要 1.64 次尝试
16 次内未成功被丢弃: 0.0000%

一次冲突后,两个站点各在 {0, 1} 两个时隙里随机选,约一半的概率错开直接成功;即便再撞,窗口扩大到 4、8、16……五次尝试之内几乎必然分出先后,20 万次模拟里没有一帧被丢弃。这套机制在共享总线时代非常管用——但注意它的成本:信道相当一部分时间消耗在冲突、退避和等待上,站点越多效率越差。

为什么交换网络让它退场了?

答案不是「CSMA/CD 被打败了」,而是它的前提条件消失了。集线器时代的以太网,所有端口在同一个冲突域里,任意两台同时发就会撞,冲突检测必不可少。交换机把拓扑改成了每端口一条独立的点对点链路:每条链路就是一个只含两台设备的冲突域;更关键的是链路升级为全双工——收发各走各的通道,发送和接收在物理上永远不会撞。既然冲突不可能发生,载波监听和冲突检测就没有存在的必要,全双工链路两端的网卡直接关闭 CSMA/CD,以太网从此进入交换时代:没有冲突、没有退避、没有最短帧约束的束缚,带宽还能收发双向满速。

深蓝黑背景概念图,顶部小字「概念图 · CSMA/CD 工作机制」,主标题「先听后发、边发边听、冲突退避」。上半部分是五步横向流程:① 载波监听,信道忙就持续等待;② 信道空闲立即发送;③ 边发边听,在争用期 2τ(往返传播时延)内检测冲突;④ 一旦冲突就停发并补发 Jam 强化信号,让全网都知道;⑤ 按二进制指数退避随机等待后重传,最多 16 次后放弃上报。流程下方一行小字注明「最短帧 64 字节 = 512 比特时间,保证发完前一定能听到远端冲突」。下半部分左侧是冲突域对照图:上方集线器下挂三台主机,被一个大的紫色虚线圆整个圈住标注「一个冲突域:任意两台同时发就会撞」;下方交换机下挂三台主机,每条链路各套一个小的青色虚线圆标注「每端口一个冲突域」,旁边注明「全双工点对点链路,收发通道独立」。下半部分右侧是四步推导链:全双工交换链路 → 收发各走各的通道 → 物理上不可能冲突 → CSMA/CD 被直接关闭,以太网进入交换时代。底部总结条:「CSMA/CD 没有被打败,是被全双工交换架空了 —— 没有冲突,就不需要冲突检测」。 图 2:五步机制、争用期约束与冲突域的演变。

面试现场的答题结构。

先用三个词概括机制:先听后发(载波监听)、边发边听(冲突检测)、冲突退避(二进制指数退避加 Jam 信号)。追问细节就展开两处硬知识:最短帧 64 字节等于 512 比特时间的争用期,保证发完前能听到最远端的冲突;退避窗口随冲突次数指数扩大,16 次失败放弃。然后答退场原因,按推导链讲:交换机把共享介质切成每端口一条点对点链路,全双工让收发通道独立,冲突物理上不可能发生,CSMA/CD 被直接关闭。收尾可以加一句升华:它不是被淘汰的失败者,而是共享介质时代的最优解,只是介质本身变了。你抓包或者排查老设备时还见过半双工链路吗?欢迎聊聊。