介质是大家共用的,那谁能在什么时候说话?本节讲的 CSMA/CD(载波侦听多路访问 / 冲突检测) 就是这条"礼貌规矩":① 说话前先听(CS)——线上有人就等;② 没人就发,但边说边听(CD)——比对"我发的"和"线上实际跑的";③ 一听到不一致就立刻停、发一串堵塞信号通知所有人,然后各自随机等一段时间,回到第①步重来。 这套规矩只在"介质共用"的环境里有意义(总线型、集线器,收 5.7),而今天交换机每口独享、收发各一对线、全双工,物理上不可能撞,所以它其实已经被关掉了。但它留下的遗产天天在眼前:最小帧 64 字节、填充字段(收 5.6)、网卡里的"半双工"选项、Wi-Fi 那套 CSMA/CA(收 5.1)——全是它的影子。
5.1 第一次提到"有线是撞了再补救(检测),无线是尽力别撞(避免)";5.2 讲三代形态时说过"靠 CSMA/CD 抢线",还从它倒推出了最小帧 64;5.7 说"集线器的物理拓扑是星型、逻辑是总线"。三处都点到它,但都没展开。本节就是它的正式主场。
- 5.7 如何连接(网络拓扑):拓扑决定"介质是不是被共用"——共用才需要 CSMA/CD。星型+交换机把这个前提消灭了,这套规矩自然就退休了
- 5.2 负责传输数据的以太网(以太网概要):三代形态、MAC = Media Access Control 的名字答案(谁什么时候能用这条线路)、最小帧 64 与"碰撞检测"的关系。本节把那条线索补完
- 5.6 数据的格式(以太网的数据帧格式):填充字段为什么存在、帧长下限 64 是怎么来的——答案全在本节的"冲突窗口"里
- 5.5 常用的网络接口和线缆:双绞线收发各一对(百兆用 1·2·3·6 两对、千兆四对同时收发)——这正是全双工的物质基础,也是 CSMA/CD 退场的原因
- 5.1 在同一网络中传输数据(以太网、无线局域网(Wi-Fi)):无线为什么只能"避免"不能"检测";本节把两者的对照补全
- 5.3 以太网标准(IEEE802 委员会):这些规矩都写在 IEEE 802.3 里;本节讲的是它最核心的一段工作机制
- 3.18 对应用程序的数据进行可靠传输(TCP):TCP 的重传是"数据没收到",CSMA/CD 的退避重发是"这一帧刚才没发成功"——两码事,别混
- 3.9 接收方是1个还是多个:本节要分清冲突域(能撞到彼此的范围)和广播域(广播帧能到的范围)
- 2.2 用于构建网络的设备(网络设备):集线器是物理层设备、只把信号放大复制 → 所有口在一个冲突域里;交换机认得目的 MAC → 每口一个冲突域
一、问题从哪儿来:一屋子人开会,没有主持人
总线型与集线器时代(收 5.7),所有设备挂在同一根线上:
- 线上跑的只是一串电压变化,没有一个"中央裁判"告诉你"现在轮到你了"
- 两个人同时开口 → 两个信号在线上叠加,谁的话都听不清 → 这就是冲突(collision)
- 而冲突的代价是双份的:两边的帧都作废,都得重发,线路被白白占用
那怎么办?当年有两条路:
- 请一个裁判(令牌环就是这条路:令牌轮流传,拿到才能说,收 5.7)——秩序好,但要额外的机制与设备,扩展也麻烦
- 不要裁判,靠一套礼貌规矩自己协调——这就是 CSMA/CD
以太网选的是第 2 条。这套规矩的名字里,三部分各管一件事:
| 缩写 | 全称 | 大白话 |
|---|---|---|
| MA | Multiple Access 多路访问 | 前提:这条线路是大家共用的,不是一台一台轮着用 |
| CS | Carrier Sense 载波侦听 | 说之前先听:线路上有信号(载波)就等一等 |
| CD | Collision Detection 冲突检测 | 一边说一边听:听到和自己发的不一样 → 撞了,立刻停下来 |
MAC = Media Access Control(媒体访问控制)——5.2 讲它是"Media 那段公用的介质 / Access 谁什么时候能用 / Control 定这套先后秩序"。CSMA/CD 就是这套"秩序"本身,而MAC 地址是这套秩序发给每张网卡的编号。所以"MAC 层"这个词的源头在这儿,不在地址那一头。
二、三步走:先听、边说边听、撞了就退(配图一)
第 1 步:先听后说(CS)
要发帧之前,先"听"一下线上有没有信号:
- 空闲 → 可以发
- 有信号 → 别人在说,等;等它说完再听一次
这一步是"礼貌",但它自己不够用,原因很关键:
两个人可能同时"听到空闲",然后同时开口。
信号在线上跑是要时间的(电信号大约每秒二十万公里,不是瞬间)。A 在这头判断"空闲"的同时,B 在那头也判断"空闲"——两边都没听到对方(因为对方还没开始发),于是同时开口 → 撞。
所以必须有第 2 步。
第 2 步:边说边听(CD)——这是 CD 相对早期方案的核心升级
发送的同时,网卡不停地比较两样东西:
- 我刚刚送出去的信号
- 线路上此刻实际跑的波形
自己发的到自己的接收端也有个回路,只要路上没有别人加进来的东西,两者就是一致的;一旦不一致,说明有人和自己同时发了 → 冲突。
为什么不"发完再看结果"?因为:
- 早发现,早停手:可能只发了前几十个字节就发现了,剩下的一大段就不用白发了
- 早通知别人:立刻发一串 Jam(堵塞信号,32 位),把线"搅浑",让所有在场的设备都知道"刚才撞了、谁都别当真"
CD 把"撞车的代价"从"一整帧白发了"压到了"刚开始就停"。 这是以太网当年打赢令牌环之外那些方案的重要原因之一——同一根线上,浪费越少、效率越高。
第 3 步:撞了就退避,然后从头再来
发现冲突后,两边都:
- 停下手里的帧(这帧作废,不往上交)
- 发完 Jam
- 各自随机等一段时间(退避,Backoff)
- 回到第 1 步,重新"先听后说"
如果两边都等一样长,那么等完之后又是同时开口,又是撞——会一直同步撞下去,死循环。 随机才可能错开。这也解释了为什么这套算法看起来"不精确",其实恰恰是它的精髓。
二进制指数退避(会认这一层就够了):
- 第 1 次撞:从 0 或 1 个"时隙"里随机挑一个等
- 第 2 次撞:从 0~3 里挑
- 第 n 次撞:从 0 ~ 2ⁿ−1 里挑(到一定次数后封顶)
- 撞得越多,等得越久、可选范围越大——这样重负荷时全网自动"收敛",不会一直挤在一起
- 传统以太网规定:连续 16 次都没成功 → 放弃这一帧,报错(网卡上会体现为错误计数,见 Demo57)
时隙时间(slot time)= 2τ = 512 位时间(10 Mbps 下就是 51.2 微秒)。也就是说,退避的"最小等待单位"和下面要讲的"最小帧"是同一个数——因为这俩都由同一件事决定:信号跑完全长再回来要多久。
三、最硬的一块:冲突窗口与"最小帧 64"(配图二)
上面的规矩要成立,有一个物理前提,这也是本节最值钱的一段:
发送方必须在自己这一帧还没发完的时候,能听到最远处传回来的冲突信号。
否则:帧已经发完、网卡已经认为"我这帧成功了",撞车的信号才慢悠悠传回来——它已经没法补救,甚至根本不知道撞过。
于是推出一个硬约束(配图二的时间-距离图):
- 设信号从线路一头跑到另一头需要 τ(单程传播时延)
- 最坏情况:最远的两端(A 端与 B 端)几乎同时开火
- A 要察觉这次撞车,最早也要等冲突信号从最远端传回来——也就是 2τ 之后
- 所以:一帧的发送时间 ≥ 2τ
把当年以太网的参数代进去(10 Mbps、最大 2500 米):2τ 折算成 512 位 = 64 字节。这就是——
最小帧 64 字节的真正原因:让"发送时间"足够覆盖"最坏情况下的冲突往返时间"。
顺手就能填上前面几笔老账:
- 5.6 的填充字段:上层只发 1 个字节时,发送时间太短,撞车还没传回来帧就发完了 → 发送方网卡补一串 0,把帧撑到 46 字节数据(合计 64 字节)。填充不是浪费,是保住"听得见撞车"这个能力
- 5.6 那句"我只 ping 1 个字节,线上却跑了 64 字节":正是这条规矩的直接后果
- 5.2 的"最小帧 64 是从撞车要听得见倒推出来的":本节把这条推导完整走了一遍
顺带两个由此而来的概念
① 冲突域(Collision Domain)
共享同一段介质、能彼此撞到的那一片范围。
- 一根总线、一台集线器下的所有口 → 同一个冲突域(收 5.7 的"逻辑总线")
- 交换机的每个口 → 各自一个冲突域(因为不再有任何人跟它抢)
- 冲突域是"能不能互相撞"的范围;广播域是"广播帧能到哪儿"的范围(收 3.9)——两个概念不一样,后面会专门对照
② 网段长度与级联数量都有硬上限
因为 2τ 决定了"信号来回要多久",而距离越长、τ 越大 → 冲突窗口越大 → 最小帧还得更长才够。可帧长不能无限涨,那就只能限制距离。所以老以太网有一堆硬规矩,比如当年 10BASE5/2 时代的"5-4-3 规则":最多 5 段线、最多 4 个中继器、其中只有 3 段能接设备。
一句话:以太网的"线不能太长、集线器不能串太多"不是随口定的,是从 2τ 这个物理量算出来的。
四、今天它还在跑吗:多数时候已经"关掉了"
前面说过,交换机给每个口独享带宽,双绞线收发各一对线(收 5.5):
- 我发我的、你收你的,两个方向互不干扰
- 这叫全双工(Full Duplex):可以同时收发,物理上不可能撞
- 既然不可能撞,"先听""边说边听""退避"就全都成了多余动作 → 网卡与交换机在自动协商时就会通告"我这边不需要 CSMA/CD",这套机制被关闭
所以今天绝大多数场景下:
CSMA/CD 是"装了但没在跑"的状态。 它只在半双工环境里还真的在干活——老式集线器、某些老设备、以及个别被手工配成半双工的口。
全双工 vs 半双工对照:
| 半双工(Half Duplex) | 全双工(Full Duplex) | |
|---|---|---|
| 能否同时收发 | 不能,轮流说 | 能,各说各的 |
| 会不会撞 | 会(同一介质共用) | 不会(物理上分离的两条通道) |
| 要不要 CSMA/CD | 要 | 不要(被关闭) |
| 典型场景 | 老集线器时代、早起以太网 | 今天的一切:交换机每个口、双绞线、光纤 |
| 带宽感受 | 10 Mbps 要两个人分 | 10 Mbps 各用各的(所以全双工一来速度就像翻倍) |
半双工时代,10 Mbps 是全楼共享的,人一多就慢;全双工 + 交换机让每个口独享 10 Mbps 且能同时收发。所以那次升级不只是"线变快了",而是规则本身被改写了——CSMA/CD 从"必须"变成了"用不上"。
五、那为什么还要学它
因为它的影子天天在你眼前,而且它是理解以太网设计选择的钥匙:
- 最小帧 64 与填充(收 5.6)——只要以太网还在跑,这条规矩就还在
- 半双工选项——网卡高级属性里那一栏,源头在这
- 退避思想——Wi-Fi 的 CSMA/CA、以及各种"抢不到的等一会儿再来"的机制,都是它的亲戚
- "冲突域"这个词——网络图、资料、老教材里到处是
- 解释历史与故障:
- "老网络为什么要用交换机分段?"——切冲突域,人少了就不容易撞
- "双工不匹配为什么是经典故障?"——一端配全双工、一端配半双工:全双工那边发了不听,半双工那边一边发一边听,看到的是持续的冲突,于是大量丢帧、CRC 错误、速度断崖(这是本节最常被引用的现实症状)
- 和无线对照(收 5.1):
| 有线(CSMA/CD) | 无线(CSMA/CA) | |
|---|---|---|
| 能不能"边说边听" | 能(收发是分开的线路) | 不能(自己发的声音会盖住别人的) |
| 撞了怎么知道 | 当场听到波形不对 | 只能等对方回确认;没有确认就当撞了 |
| 策略 | 检测:撞了立刻补救 | 避免:先听、随机等待、尽量别撞 |
| 一句话 | 有线是"撞了再补救" | 无线是"尽力别撞" |
无线设备没法在自己说话的时候听清别人——自己的发射功率远大于远处传来的微弱信号,等于你在喊的时候根本听不见旁边的人也在喊。物理上做不到,所以只能改成"避开"(CSMA/CA)。这不是偷懒,是电磁波的性质决定的。
六、Demo57:亲手看"抢线与不抢线"
目标:不用真的接一根总线,也能确认"今天你的网卡是全双工、根本不需要 CSMA/CD",并且亲手验证"最小帧 64"这条由它推出来的规矩。
- 看速率与状态(PowerShell):
Get-NetAdapter | Format-Table Name,Status,LinkSpeed记下你这张网卡的名字(通常是"以太网"或"WLAN",可能带编号)和LinkSpeed(如1 Gbps)。 - 看"速度和双工"当前是自动协商还是被锁死:
Get-NetAdapterAdvancedProperty -Name "以太网" | Where-Object {$_.DisplayName -like "*双工*"} | Format-List DisplayName,DisplayValue,ValidDisplayValues - 正常应是 Auto Negotiation(自动协商)
ValidDisplayValues会列出可选值——你会在里面看到"半双工":这就是 CSMA/CD 还留着的那扇门- 如果哪一步报"找不到网卡",先在第 1 步的输出里把名字抄对(可能叫
以太网 2) - 验证最小帧 64(收 5.6 的算法,这里换个方式确认):
ping -l 1 127.0.0.11 字节数据 + ICMP 头 8 + IP 头 20 = 29 字节 < 46 → 网卡填充到 46 → 加帧头 14 + FCS 4 = 64 字节。 (想眼见为实就开 Wireshark 抓这个回环包,看长度正好 64。) - 看网卡有没有在"报怨":
netstat -e看 "错误"(Errors) 一列。在全双工的今天,这个数应该极小甚至为 0;如果它一直涨,说明线、口或双工配置有问题——这正是"冲突/坏帧"留下的痕迹。 - 抓包里找 runt 帧(核心现场之一):Wireshark 抓一段,过滤器里翻有没有小于 64 字节的帧(截断帧,runt)。 → 抓不到:正常。因为今天全双工,没人抢线,根本不会产生撞车残片。 → 半双工 + 集线器的年代,这类残片是日常现象。(收 5.6:"今天全双工基本抓不到 runt")
- (可选、谨慎)把双工改成半双工,看症状:
把第 2 步里那个值从"自动协商"改成
100 Mbps 半双工,保持十几秒,观察:网速骤降、netstat -e的错误计数开始涨、抓包出现大量 CRC/冲突痕迹——因为对端交换机很可能仍是全双工,形成了典型的双工不匹配。 做完立刻改回"Auto Negotiation"。这一步的三条底线 ① 远程连接、服务器、公司配发的电脑不要做(可能直接断网,且企业策略常把它锁死,看到灰掉不能改是正常的);② 改的一瞬间网络会瞬断,正在跑的工作先保存;③ 必须改回自动协商——留着半双工,你会以为"网坏了"。
- (更省事的替代) 不真改,只在第 2 步里看那栏的当前值与可选项,把"改了会怎样"用本节的机理推一遍——结论是一样的,风险是 0。
- 顺带认一个"冲突域"的实物:看交换机上一排口,每个口是一个独立的冲突域;如果哪天见到一台集线器(而不是交换机),那它所有口共用同一个冲突域——这就是两者最本质的差别(收 5.2、5.7)。
七、30 秒实验
- 看双工:一条
Get-NetAdapter | Format-Table Name,LinkSpeed——你的网卡跑在全双工,所以"根本不会撞"。 - 算一次 64:
ping -l 1 127.0.0.1,然后把14 + 46 + 4 = 64在心里过一遍——你刚发的那 1 个字节,被填充撑成了 64。 - 找一个 runt:Wireshark 抓 30 秒找小于 64 字节的帧。找不到,就是"介质不再共用"的最好证据。
八、常见误区
- "CSMA/CD 现在还在天天跑。" —— 全双工环境下已经被关闭(自动协商时双方会通告"不需要 CD")。只有半双工(老集线器、个别手工配置)里才真的在跑。
- "只要先听后说就够了。" —— 不够。两个人可能同时听到"空闲"然后同时开口,必须有 CD 与退避才能收敛。
- "冲突会丢数据。" —— 冲突发生在链路层的一帧上,CD 的目标是尽早发现、立刻停,浪费的是几微秒;数据的可靠到达是上层(TCP)的事(收 3.18)。别把"这一帧没发成功"和"数据丢了"混为一谈。
- "退避随便等一会儿就行。" —— 必须随机,否则下一轮又是同时开口;而且撞得越多等得越久(二进制指数退避),这是全网自动收敛的关键。
- "最小帧 64 是为了效率。" —— 恰恰相反,它是为了保住可靠性(听得见撞车),代价是多发了一些没用的字节(收 5.6 的填充)。
- "加个中继器/集线器就能把线拉更长。" —— 它们扩大同一个冲突域,让 2τ 变大、冲突概率上升。老以太网对段数和级联数量有硬上限(5-4-3 规则),不是随口定的。
- "冲突域和广播域是一回事。" —— 冲突域=能撞到彼此的范围;广播域=广播帧能到达的范围(收 3.9)。交换机切冲突域,但默认不切广播域(要划 VLAN 才切,收 5.3 的 802.1Q)。
- "交换机时代就不用懂 CSMA/CD 了。" —— 最小帧 64、填充、半双工选项、退避思想、冲突域这个词、双工不匹配故障——全都源自它。
- "无线用的也是 CSMA/CD。" —— 无线是 CSMA/CA(避免):自己发的会盖住别人的,没法边说边听(收 5.1)。
- "出现冲突就是坏掉了。" —— 在共享介质环境里,冲突是正常工作的一部分(规矩就是为管理它而设计的),负载不高时以太网仍能跑到很高的利用率;只有在全双工网络里,冲突理论上不该出现,出现就说明配置或硬件有问题。
- "双工不匹配只是慢一点。" —— 一方全双工、一方半双工会造成持续冲突、大量 CRC 错误、吞吐断崖式下降,是经典故障。所以今天一律用自动协商,不要手工锁速率与双工。
九、动手自测
- CSMA/CD 三个字母各是什么?连起来说的是什么意思?
- 为什么光"先听后说(CS)"不够,还要"边说边听(CD)"?
- 检测到冲突之后,双方按什么顺序做事?Jam 信号是干什么用的?
- 退避为什么必须"随机"?"二进制指数"又是指什么?
- 一个"时隙时间"有多长(用位或时间表示)?它和最小帧有什么关系?
- 请把"最小帧 64 字节"的推导说一遍(从物理约束出发)。
- 上层只发 1 个字节时,为什么要填充?填充是谁加的、接收方怎么处理?(收 5.6)
- 冲突域和广播域分别是什么?交换机在这两件事上各做了什么?
- 为什么今天"CSMA/CD 装了但没在跑"?物质基础是什么(收 5.5)?
- 无线为什么不能做冲突检测,只能做冲突避免?
答案: ① CS = Carrier Sense 载波侦听 / MA = Multiple Access 多路访问 / CD = Collision Detection 冲突检测——"多人共用一条线路时,靠先听、边说边听、撞了退避来轮流使用它"。 ② 因为信号传播需要时间:两头可能同时听到"空闲"然后同时开口,谁都还没听到对方——只靠听无法避免同时开口,必须有"发出去之后冲突能被我察觉"的机制。 ③ 停发(这帧作废)→ 发 Jam(32 位堵塞信号)让全场都知道"撞了、别当真"→ 各自随机退避一段时间 → 回到"先听"重来。 ④ 必须随机,否则双方又同时开口、再次相撞(同步撞车会一直持续);"二进制指数"指撞第 n 次就从 0 ~ 2ⁿ−1 个时隙里随机挑,撞得越多范围越大、等得越久,从而让全网自动错开;传统以太网连续 16 次失败就放弃这一帧。 ⑤ 2τ = 512 位时间 = 10 Mbps 下的 51.2 微秒。它与最小帧是同一个数:都是"信号跑完全长再回来"这段时间折算出来的。 ⑥ 发送方必须在自己这一帧发完之前听到最远处传回的冲突信号(否则帧已发完、无法补救)→ 所以一帧的发送时间 ≥ 2τ;按 10 Mbps、2500 米的参数折算 2τ = 512 位 = 64 字节 → 这就是最小帧。 ⑦ 因为1 字节的数据太短、发送时间不足以覆盖 2τ,撞车还没回来帧就发完了 → 发送方网卡补 0 撑到数据区 46 字节(合计 64);接收方靠帧长 + IP 头的总长度判断出哪些是填充,剥掉再往上交。 ⑧ 冲突域=能彼此撞到的范围(介质共用的范围),广播域=广播帧能到达的范围。交换机切冲突域(每口一个),但默认不切广播域(所有口仍在同一个广播域,除非划 VLAN)。 ⑨ 因为交换机每口独享带宽、双绞线收发各一对线(收 5.5),可以同时收发(全双工),物理上不可能撞——没有冲突,检测机制就没有存在意义,于是自动协商时双方通告"不需要 CSMA/CD",它被关闭。 ⑩ 因为无线设备自己发射时听不见远处更弱的信号(自己的功率盖住了别人),"边说边听"在物理上做不到,所以只能改成先听 + 随机等待 + 靠确认判断有没有撞(CSMA/CA,收 5.1)。
十、下一步学什么
- ☑ 5.9 创建以太网网络(二层交换机) —— 已学完:本节最后那句"复杂度换到了'交换机怎么转发'",下一节就把它讲透了——MAC 地址表怎么学出来、命中就定向转发、查不到就泛洪、以及为什么交换机切冲突域却不切广播域。见 创建以太网网络(二层交换机)。
相关笔记
- 创建以太网网络(二层交换机) —— 下一节:本节留下"复杂度换到了交换机怎么转发",那里把它展开(MAC 地址表、泛洪、过滤、透明转发)
- 如何连接(网络拓扑) —— 上一节:拓扑决定"介质是否共用";共用才有本节这套抢线规矩
- 负责传输数据的以太网(以太网概要) —— 三代形态、MAC = Media Access Control 的名字答案、最小帧 64 的初识;本节把它完整推导一遍
- 数据的格式(以太网的数据帧格式) —— 填充字段与帧长下限 64;本节给出"为什么要填 46 字节"的物理原因
- 常用的网络接口和线缆是什么(RJ-45接口与UTP线缆) —— 收发各一对线(百兆 4 根 / 千兆 8 根);全双工的物质基础,也是 CSMA/CD 退场的原因
- 在同一网络中传输数据(以太网、无线局域网(Wi-Fi)) —— "有线撞了再补救、无线尽力别撞"的首次出现;本节补全对照表
- 以太网标准(IEEE802委员会) —— 这些规矩写在 IEEE 802.3 里;VLAN(802.1Q)才是切广播域的手段
- 用于构建网络的设备(网络设备) —— 集线器(一个冲突域)与交换机(每口一个冲突域)的本质差别
- 接收方是1个还是多个(单播、广播、组播) —— 广播域的概念;与本节"冲突域"要分清
- 对应用程序的数据进行可靠传输(TCP) —— 端到端的重传;与本节"这一帧没发成功"的分工区别