🌐 第五章 以太网与无线局域网
📄 一句话概括

介质是大家共用的,那谁能在什么时候说话?本节讲的 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),所有设备挂在同一根线上:

那怎么办?当年有两条路:

  1. 请一个裁判(令牌环就是这条路:令牌轮流传,拿到才能说,收 5.7)——秩序好,但要额外的机制与设备,扩展也麻烦
  2. 不要裁判,靠一套礼貌规矩自己协调——这就是 CSMA/CD

以太网选的是第 2 条。这套规矩的名字里,三部分各管一件事:

缩写 全称 大白话
MA Multiple Access 多路访问 前提:这条线路是大家共用的,不是一台一台轮着用
CS Carrier Sense 载波侦听 说之前先听:线路上有信号(载波)就等一等
CD Collision Detection 冲突检测 一边说一边听:听到和自己发的不一样 → 撞了,立刻停下来
💡 顺手把 5.2 那个名字答案填完

MAC = Media Access Control(媒体访问控制)——5.2 讲它是"Media 那段公用的介质 / Access 谁什么时候能用 / Control 定这套先后秩序"。CSMA/CD 就是这套"秩序"本身,而MAC 地址是这套秩序发给每张网卡的编号。所以"MAC 层"这个词的源头在这儿,不在地址那一头。

二、三步走:先听、边说边听、撞了就退(配图一)

第 1 步:先听后说(CS)

要发帧之前,先"听"一下线上有没有信号:

这一步是"礼貌",但它自己不够用,原因很关键:

两个人可能同时"听到空闲",然后同时开口。

信号在线上跑是要时间的(电信号大约每秒二十万公里,不是瞬间)。A 在这头判断"空闲"的同时,B 在那头也判断"空闲"——两边都没听到对方(因为对方还没开始发),于是同时开口 → 撞。

所以必须有第 2 步。

第 2 步:边说边听(CD)——这是 CD 相对早期方案的核心升级

发送的同时,网卡不停地比较两样东西:

自己发的到自己的接收端也有个回路,只要路上没有别人加进来的东西,两者就是一致的;一旦不一致,说明有人和自己同时发了 → 冲突。

为什么不"发完再看结果"?因为:

❗ 一句话记住 CD 的价值

CD 把"撞车的代价"从"一整帧白发了"压到了"刚开始就停"。 这是以太网当年打赢令牌环之外那些方案的重要原因之一——同一根线上,浪费越少、效率越高。

第 3 步:撞了就退避,然后从头再来

发现冲突后,两边都:

  1. 停下手里的帧(这帧作废,不往上交)
  2. 发完 Jam
  3. 各自随机等一段时间(退避,Backoff)
  4. 回到第 1 步,重新"先听后说"
❗ 为什么必须"随机"

如果两边都等一样长,那么等完之后又是同时开口,又是撞——会一直同步撞下去,死循环。 随机才可能错开。这也解释了为什么这套算法看起来"不精确",其实恰恰是它的精髓。

二进制指数退避(会认这一层就够了):

📝 一个"时隙"是多长?

时隙时间(slot time)= 2τ = 512 位时间(10 Mbps 下就是 51.2 微秒)。也就是说,退避的"最小等待单位"和下面要讲的"最小帧"是同一个数——因为这俩都由同一件事决定:信号跑完全长再回来要多久。

三、最硬的一块:冲突窗口与"最小帧 64"(配图二)

上面的规矩要成立,有一个物理前提,这也是本节最值钱的一段:

发送方必须在自己这一帧还没发完的时候,能听到最远处传回来的冲突信号。

否则:帧已经发完、网卡已经认为"我这帧成功了",撞车的信号才慢悠悠传回来——它已经没法补救,甚至根本不知道撞过。

于是推出一个硬约束(配图二的时间-距离图):

把当年以太网的参数代进去(10 Mbps、最大 2500 米):2τ 折算成 512 位 = 64 字节。这就是——

最小帧 64 字节的真正原因:让"发送时间"足够覆盖"最坏情况下的冲突往返时间"。

顺手就能填上前面几笔老账:

顺带两个由此而来的概念

① 冲突域(Collision Domain)

共享同一段介质、能彼此撞到的那一片范围。

② 网段长度与级联数量都有硬上限

因为 2τ 决定了"信号来回要多久",而距离越长、τ 越大 → 冲突窗口越大 → 最小帧还得更长才够。可帧长不能无限涨,那就只能限制距离。所以老以太网有一堆硬规矩,比如当年 10BASE5/2 时代的"5-4-3 规则":最多 5 段线、最多 4 个中继器、其中只有 3 段能接设备。

一句话:以太网的"线不能太长、集线器不能串太多"不是随口定的,是从 2τ 这个物理量算出来的。

四、今天它还在跑吗:多数时候已经"关掉了"

前面说过,交换机给每个口独享带宽,双绞线收发各一对线(收 5.5):

所以今天绝大多数场景下:

CSMA/CD 是"装了但没在跑"的状态。 它只在半双工环境里还真的在干活——老式集线器、某些老设备、以及个别被手工配成半双工的口。

全双工 vs 半双工对照:

半双工(Half Duplex) 全双工(Full Duplex)
能否同时收发 不能,轮流说 能,各说各的
会不会撞 会(同一介质共用) 不会(物理上分离的两条通道)
要不要 CSMA/CD 要 不要(被关闭)
典型场景 老集线器时代、早起以太网 今天的一切:交换机每个口、双绞线、光纤
带宽感受 10 Mbps 要两个人分 10 Mbps 各用各的(所以全双工一来速度就像翻倍)
💡 为什么"能全双工"这件事这么重要

半双工时代,10 Mbps 是全楼共享的,人一多就慢;全双工 + 交换机让每个口独享 10 Mbps 且能同时收发。所以那次升级不只是"线变快了",而是规则本身被改写了——CSMA/CD 从"必须"变成了"用不上"。

五、那为什么还要学它

因为它的影子天天在你眼前,而且它是理解以太网设计选择的钥匙:

  1. 最小帧 64 与填充(收 5.6)——只要以太网还在跑,这条规矩就还在
  2. 半双工选项——网卡高级属性里那一栏,源头在这
  3. 退避思想——Wi-Fi 的 CSMA/CA、以及各种"抢不到的等一会儿再来"的机制,都是它的亲戚
  4. "冲突域"这个词——网络图、资料、老教材里到处是
  5. 解释历史与故障:
  6. "老网络为什么要用交换机分段?"——切冲突域,人少了就不容易撞
  7. "双工不匹配为什么是经典故障?"——一端配全双工、一端配半双工:全双工那边发了不听,半双工那边一边发一边听,看到的是持续的冲突,于是大量丢帧、CRC 错误、速度断崖(这是本节最常被引用的现实症状)
  8. 和无线对照(收 5.1):
有线(CSMA/CD) 无线(CSMA/CA)
能不能"边说边听" 能(收发是分开的线路) 不能(自己发的声音会盖住别人的)
撞了怎么知道 当场听到波形不对 只能等对方回确认;没有确认就当撞了
策略 检测:撞了立刻补救 避免:先听、随机等待、尽量别撞
一句话 有线是"撞了再补救" 无线是"尽力别撞"
❗ 为什么无线做不了 CD

无线设备没法在自己说话的时候听清别人——自己的发射功率远大于远处传来的微弱信号,等于你在喊的时候根本听不见旁边的人也在喊。物理上做不到,所以只能改成"避开"(CSMA/CA)。这不是偷懒,是电磁波的性质决定的。

六、Demo57:亲手看"抢线与不抢线"

目标:不用真的接一根总线,也能确认"今天你的网卡是全双工、根本不需要 CSMA/CD",并且亲手验证"最小帧 64"这条由它推出来的规矩。

  1. 看速率与状态(PowerShell):Get-NetAdapter | Format-Table Name,Status,LinkSpeed 记下你这张网卡的名字(通常是"以太网"或"WLAN",可能带编号)和 LinkSpeed(如 1 Gbps)。
  2. 看"速度和双工"当前是自动协商还是被锁死: Get-NetAdapterAdvancedProperty -Name "以太网" | Where-Object {$_.DisplayName -like "*双工*"} | Format-List DisplayName,DisplayValue,ValidDisplayValues
  3. 正常应是 Auto Negotiation(自动协商)
  4. ValidDisplayValues 会列出可选值——你会在里面看到"半双工":这就是 CSMA/CD 还留着的那扇门
  5. 如果哪一步报"找不到网卡",先在第 1 步的输出里把名字抄对(可能叫 以太网 2)
  6. 验证最小帧 64(收 5.6 的算法,这里换个方式确认): ping -l 1 127.0.0.1 1 字节数据 + ICMP 头 8 + IP 头 20 = 29 字节 < 46 → 网卡填充到 46 → 加帧头 14 + FCS 4 = 64 字节。 (想眼见为实就开 Wireshark 抓这个回环包,看长度正好 64。)
  7. 看网卡有没有在"报怨":netstat -e 看 "错误"(Errors) 一列。在全双工的今天,这个数应该极小甚至为 0;如果它一直涨,说明线、口或双工配置有问题——这正是"冲突/坏帧"留下的痕迹。
  8. 抓包里找 runt 帧(核心现场之一):Wireshark 抓一段,过滤器里翻有没有小于 64 字节的帧(截断帧,runt)。 → 抓不到:正常。因为今天全双工,没人抢线,根本不会产生撞车残片。 → 半双工 + 集线器的年代,这类残片是日常现象。(收 5.6:"今天全双工基本抓不到 runt")
  9. (可选、谨慎)把双工改成半双工,看症状: 把第 2 步里那个值从"自动协商"改成 100 Mbps 半双工,保持十几秒,观察:网速骤降、netstat -e 的错误计数开始涨、抓包出现大量 CRC/冲突痕迹——因为对端交换机很可能仍是全双工,形成了典型的双工不匹配。 做完立刻改回"Auto Negotiation"。

    这一步的三条底线 ① 远程连接、服务器、公司配发的电脑不要做(可能直接断网,且企业策略常把它锁死,看到灰掉不能改是正常的);② 改的一瞬间网络会瞬断,正在跑的工作先保存;③ 必须改回自动协商——留着半双工,你会以为"网坏了"。

  10. (更省事的替代) 不真改,只在第 2 步里看那栏的当前值与可选项,把"改了会怎样"用本节的机理推一遍——结论是一样的,风险是 0。
  11. 顺带认一个"冲突域"的实物:看交换机上一排口,每个口是一个独立的冲突域;如果哪天见到一台集线器(而不是交换机),那它所有口共用同一个冲突域——这就是两者最本质的差别(收 5.2、5.7)。

七、30 秒实验

八、常见误区

  1. "CSMA/CD 现在还在天天跑。" —— 全双工环境下已经被关闭(自动协商时双方会通告"不需要 CD")。只有半双工(老集线器、个别手工配置)里才真的在跑。
  2. "只要先听后说就够了。" —— 不够。两个人可能同时听到"空闲"然后同时开口,必须有 CD 与退避才能收敛。
  3. "冲突会丢数据。" —— 冲突发生在链路层的一帧上,CD 的目标是尽早发现、立刻停,浪费的是几微秒;数据的可靠到达是上层(TCP)的事(收 3.18)。别把"这一帧没发成功"和"数据丢了"混为一谈。
  4. "退避随便等一会儿就行。" —— 必须随机,否则下一轮又是同时开口;而且撞得越多等得越久(二进制指数退避),这是全网自动收敛的关键。
  5. "最小帧 64 是为了效率。" —— 恰恰相反,它是为了保住可靠性(听得见撞车),代价是多发了一些没用的字节(收 5.6 的填充)。
  6. "加个中继器/集线器就能把线拉更长。" —— 它们扩大同一个冲突域,让 2τ 变大、冲突概率上升。老以太网对段数和级联数量有硬上限(5-4-3 规则),不是随口定的。
  7. "冲突域和广播域是一回事。" —— 冲突域=能撞到彼此的范围;广播域=广播帧能到达的范围(收 3.9)。交换机切冲突域,但默认不切广播域(要划 VLAN 才切,收 5.3 的 802.1Q)。
  8. "交换机时代就不用懂 CSMA/CD 了。" —— 最小帧 64、填充、半双工选项、退避思想、冲突域这个词、双工不匹配故障——全都源自它。
  9. "无线用的也是 CSMA/CD。" —— 无线是 CSMA/CA(避免):自己发的会盖住别人的,没法边说边听(收 5.1)。
  10. "出现冲突就是坏掉了。" —— 在共享介质环境里,冲突是正常工作的一部分(规矩就是为管理它而设计的),负载不高时以太网仍能跑到很高的利用率;只有在全双工网络里,冲突理论上不该出现,出现就说明配置或硬件有问题。
  11. "双工不匹配只是慢一点。" —— 一方全双工、一方半双工会造成持续冲突、大量 CRC 错误、吞吐断崖式下降,是经典故障。所以今天一律用自动协商,不要手工锁速率与双工。

九、动手自测

❓ 自测一下
  1. CSMA/CD 三个字母各是什么?连起来说的是什么意思?
  2. 为什么光"先听后说(CS)"不够,还要"边说边听(CD)"?
  3. 检测到冲突之后,双方按什么顺序做事?Jam 信号是干什么用的?
  4. 退避为什么必须"随机"?"二进制指数"又是指什么?
  5. 一个"时隙时间"有多长(用位或时间表示)?它和最小帧有什么关系?
  6. 请把"最小帧 64 字节"的推导说一遍(从物理约束出发)。
  7. 上层只发 1 个字节时,为什么要填充?填充是谁加的、接收方怎么处理?(收 5.6)
  8. 冲突域和广播域分别是什么?交换机在这两件事上各做了什么?
  9. 为什么今天"CSMA/CD 装了但没在跑"?物质基础是什么(收 5.5)?
  10. 无线为什么不能做冲突检测,只能做冲突避免?

答案: ① 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)。

十、下一步学什么

相关笔记