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