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

前面几节反复提到"交换机一边干活一边学",本节把这件"学"的事拆到底——一帧进来之后,MAC 地址表到底在哪一刻、被写进了什么、怎么写的。核心只有三句话:① 登记发生在最前面(收到帧头就先登记,比任何转发决策都早);② 登记只看源 MAC,不看目的 MAC(目的地址恰恰是"我不知道才要查"的那个,而"这个号从哪个口进来"是这一帧唯一能提供的位置信息);③ 登记有三种情形——表里没有就新增一行,表里有且端口相同就只重置寿命,表里有但端口变了就改写端口(这叫 MAC 地址漂移,设备换口和无线漫游时正常,同一个 MAC 在两个口来回跳就要警惕环路)。理解了这一节,就能顺手解释一堆日常现象:为什么"设备插上不说话表里就没有它"、为什么"活跃设备永远不会被老化"、为什么"被丢弃的帧也会被学习"、为什么"同一个 MAC 在两台交换机上对应不同的口",以及为什么排障时要同时看主机的 ARP 表(记 IP → MAC)和交换机的 MAC 表(记 MAC → 端口)这两张完全不同的表。

📝 本节和前面几节的关系

5.9 · 5.10 · 5.11 是二层交换机的三块操作(学习 · 转发 · 泛洪),本节回到第一块,把 5.9 里只写了两行的"学习"动作完整拆开——它其实是整个机制的地基:没有登记,就没有那张表;没有那张表,交换机就只是个会到处广播的集线器。

  • 5.9 创建以太网网络(二层交换机):讲了"先学源、再查目的"和"老化"。本节把"学"这一步的时间点、字段、三种分支全部展开
  • 5.10 二层交换机的操作(二层交换机的数据传输):一帧的旅程第 ② 步"读帧头:学习源 MAC ↔ 入端口"——本节就是这一步的放大镜,并解释它为什么排在转发之前
  • 5.11 二层交换机的操作(Unknown单播数据帧、泛洪):那里说"泛洪的同时源 MAC 照样被学会"、"单向流量会让表项老化掉"——本节讲清这是怎么发生的
  • 5.4 接口是哪个(MAC地址):MAC 是扁平、无结构的号——正因为它不带任何位置含义,交换机才只能靠"从哪个口收到"来推断它在哪,这是本节所有行为的根
  • 5.6 数据的格式(以太网的数据帧格式):帧头的前 12 字节就是目的 MAC + 源 MAC——登记要读的正是后 6 字节,这也是"读到哪儿就能开始转发"的物理依据
  • 3.16 将 IP 地址与MAC地址对应(ARP):主机的 ARP 表也是"自己学"的,但它记 IP → MAC;交换机的 MAC 表记 MAC → 端口——本节末尾专门做了一张对照表
  • 5.3 以太网标准(IEEE802委员会):802.1Q VLAN——真实交换机的表项里还有一列"VLAN",因为同一个 MAC 可以出现在不同的 VLAN 里
  • 2.2 用于构建网络的设备(网络设备):交换机在链路层、只看帧头,所以它的"知识"全部来自帧头那 12 个字节

一、先定位置:登记是"读帧头"里的第一件事

5.10 讲过一帧在交换机内部的旅程:帧进端口 → 存进队列 → 读帧头 → 查目的 MAC → 经交换结构到出队列 → 发出。

本节盯住的是第三步"读帧头"——它里面其实藏着两个动作,而且顺序不能反:

  1. 登记:拿源 MAC 和入端口,写进 MAC 地址表(或刷新已有表项)
  2. 查表:拿目的 MAC 去表里找,"该送哪个口"
❗ 记住这一刀

同一帧里读了两个地址,用途完全不同: - 源 MAC 用来"记"——它是"这条路通向谁"的证据 - 目的 MAC 用来"查"——它是"我要找谁"的问题

一个是写表,一个是读表;一个是登记这个动作的输入,另一个是转发决策的输入。

时间点有多早? 帧头里最前面就是目的 MAC 6 字节 + 源 MAC 6 字节,一共 12 字节(收 5.6)。也就是说:

📝 顺便说清一个"为什么这么设计"

登记不需要任何协议、不需要管理员配置、不需要设备配合。 设备什么都不用做,只要发一次帧,交换机就从帧头里把这笔信息"顺手捡"到了。 这是二层网络"插上就通、零配置"(收 2.4)的底层原因——信息是白捡的,代价只是那张表要自己维护(老化与容量)。

二、登记什么:一行表项里有四个字段

表里的一行长这样(不同厂商的列名和顺序略有差别):

字段 例子 说明
MAC 地址 00:1A:2B:3C:4D:5E 从帧里读到的源 MAC
出端口(接口) Gi0/3 这一帧从哪个口进来——不是"它想去哪个口"
类型 dynamic / static 动态=学来的、会老化;静态=管理员手工写、不老化
寿命(老化计时器) 剩余约 300 秒 每次再收到这个源 MAC 就重置,走完就删除
(有 VLAN 时)VLAN VLAN 10 802.1Q 环境下表项按 VLAN 分开,同一个 MAC 可存在于多个 VLAN
💡 "动态表项"与"静态表项"的区别,值得单独记
  • 动态(dynamic):占表的绝大多数,全靠学,会老化。交换机重启就清空
  • 静态(static):管理员手工写,永不老化。用途是"某设备必须固定挂在某个口"(服务器、打印机、上行口),或防止地址漂移被利用(顺手也是端口安全的一种做法)
  • 风险:静态表项写错了,它会一直把流量送到错的口,而且不会像动态那样"过五分钟自己纠正"

三、为什么只看源 MAC,不看目的 MAC

这是本节最该想通的一点。理由有三层:

① 目的地址恰恰是"不知道"的那一方。 表的作用是回答"知道它在哪吗"——如果知道,就不用查了。把"我想送去哪"写进表,等于把问题当答案。

② 源 MAC 与入端口组合起来,才是位置信息。 MAC 地址本身扁平、无结构、不带任何位置含义(收 5.4),所以"这个号在哪儿"不可能从地址本身推出来。唯一的证据就是:它自己发出的帧,从哪个口进来了。

③ 这个信息只在"收到这一帧的那一刻"存在。 帧收完、转走,这个信息就没了——所以登记必须当场做、且在转发之前做。这也是 5.9 那句"顺序不能反:先学源、再查目的"的真正原因:不是习惯问题,而是过了这一帧,位置信息就丢了。

⚠️ 直接推论:**不说话的设备,永远不会被登记**
  • 一台设备只要从不发帧,交换机就永远学不到它 → 发给它的帧永远是未知单播 → 泛洪(收 5.11)
  • 反过来,广播帧、组播帧同样会让交换机登记发送方——因为源 MAC 仍然是那台设备自己的单播地址。这就是 5.11 讲的"泛洪的同时源 MAC 照样被学会",也是"ARP 请求一发出、交换机就认识你了"的原因(收 3.16)
  • 还有一条容易被忽略:被丢弃的帧也会被登记。如果查出来的目的口正好是入端口,这帧会被过滤丢掉(收 5.9),但登记早就做完了——因为学习与转发是两件独立的事,学习在前,丢在后

四、登记时的三种情形:新增、刷新、漂移

拿到"源 MAC + 入端口"之后,交换机在表里找一遍,会落到三种情形之一(见上面第二张图):

情形 表里的情况 交换机的动作
① 新增 表里没有这个源 MAC 加一行:MAC + 端口 + 当前时间戳,寿命倒计时开始
② 刷新 表里有,且端口相同 只把寿命重置,内容不变——这就是"活跃设备永远不会被老化"的原因
③ 漂移 表里有,但端口不同 改写端口——这叫 MAC 地址漂移(MAC address move / flapping)

情形③ 为什么值得警惕

"改写端口"这个动作本身很简单,但它意味着同一个 MAC 出现在了两个不同的口上。可能的原因分三类:

原因 是否正常 如何判断
设备换了口:换网线、换工位、换交换机端口 ✅ 完全正常 只发生一次,之后端口稳定
无线漫游:终端从 AP1 切到 AP2,上行交换机的表项跟着改 ✅ 正常 伴随信号强度变化,端口在 AP 上联口之间切换
环路:同一帧从两个口绕回来,表项在两个口反复来回跳 ❌ 异常 同一个 MAC 在两口之间高频交替,抓包能看到重复帧、网络时通时断——这是 STP 该出来干活的典型信号(收 5.7·5.10)
MAC 欺骗:有人伪造别人的 MAC 抢流量 ❌ 恶意 漂移日志里出现不属于本网段的 MAC,或与端口安全告警同时出现(收 5.9)
❗ 一句话判据

漂移一次是搬家,漂移不停是出事。 交换机上一般有漂移计数或日志(MAC move / flapping 告警),值随时间猛涨就要去查环路(先看 STP 状态)、查无线漫游、查端口安全。

五、哪些帧会被登记,哪些不会

帧的情况 会不会登记 说明
合法帧(长度合规、FCS 通过) 会 正常路径
广播帧 / 组播帧 会(登记的是源 MAC) 源 MAC 仍是发送方的单播地址;ARP 请求就让交换机学到了发送方
源 MAC 是组播地址或全 F 不会(非法帧) 源地址按定义必须是单播(收 5.4 的 I/G 位);这类帧本身就是伪造痕迹
坏帧(FCS 错、冲突残片 runt) 看实现 ⚠️ 标准没规定死:有的芯片先登记后校验(会学到一个坏帧的源),有的校验通过才登记
被过滤丢掉的帧(目的口=入端口) 会 学习在前、丢弃在后,两件事互相独立
帧经过多台交换机 每台都登记一遍 每台只记"从哪个口来",所以同一个 MAC 在不同交换机上的端口不同(下一台记的是上联口)
⚠️ "先学后校验"这件事有安全含义

如果某台交换机是"先登记、后校验",那么攻击者只要狂发源 MAC 不断变化的坏帧,就能把表灌满——这正好是 5.9·5.11 讲过的 MAC 泛洪攻击的一种实现方式。 所以规范做法是:端口安全(限制每口可学的 MAC 数)+ 风暴控制(收 5.9·5.11)。

六、登记之后:这张表怎么被"养"

登记只是开始,表还需要保养,否则不是"记错"就是"记不下":

保养动作 机制 出问题时
老化(aging) 每个动态表项有寿命(常见默认约 300 秒),每次再收到同源 MAC 就重置;走完就删 设备长期不说话 → 表项消失 → 再通信时又泛洪(收 5.11 的"单向流量"故障)
容量(capacity) 表有条数上限(家用几 K、机房几十万,收 5.9) 满了之后新号学不进去 → 新出现的都会泛洪;被灌满还会退化成集线器
静态兜底 对手工指定的表项永不老化 静态表项写错 → 流量永远送错口,而且不会自愈
💡 老化时间是个要权衡的旋钮
  • 调短:表更新鲜,设备换口后纠正得快;但泛洪变多(表里老是没有它)
  • 调长:泛洪少;但表占得久,设备换了口可能短暂把帧送到旧口(不过一次漂移就会纠正)
  • 默认值(约 300 秒)是多年经验折中的结果——够长到覆盖"正常的通信间隔",够短到几十分钟内自动清理掉走掉的设备

七、两张"自己学"的表:MAC 表 vs ARP 表

这两个东西特别容易混,因为它们都是自动学的、都会老化、都能拿命令看。但完全是两回事:

维度 主机的 ARP 表 交换机的 MAC 地址表
记什么 IP → MAC MAC → 端口
谁维护 每台主机各自维护 每台交换机各自维护
怎么学 收到 ARP 应答(有时也学请求里的源)就记 收到任何合法帧就记源 MAC
为什么会变 对端换了网卡、IP 被重新分配 设备换了口、无线漫游、环路、MAC 欺骗
查不到时 发 ARP 广播问一圈(收 3.16) 泛洪(收 5.11)
查看命令 arp -a、Get-NetNeighbor(主机侧) show mac address-table、display mac-address(交换机侧);家用路由器在管理页的「已连接设备」
清空命令 netsh interface ip delete arpcache clear mac address-table dynamic
❗ 排障时的用法差别
  • 主机上 arp -a 看到的表,只能说明"这台电脑自己记住了谁"
  • 交换机上看到的表,才说明"这台交换机把哪个 MAC 挂在哪个口"
  • 两者都要分别看:ARP 表正常但交换机表里没有对方 → 发给对方的帧会泛洪;交换机表里有对方但 ARP 表没记录 → 你这台电脑会先发一次 ARP 广播才知道往哪发
  • 5.11 那个"主机侧一切正常、网络上却在泛洪"的故障,就是这两张表不同步造成的

八、动手 Demo:亲眼看一次登记

🧪 Demo61:让 MAC 表在眼前长出来

目标:观察"设备一说话,交换机就记下它"的过程,并亲手制造一次端口变化(漂移)。

第 1 步:先看"交换机侧"能看什么 - 家用路由器:管理页里的「已连接设备」「DHCP 客户端列表」「终端管理」——这就是简化版的 MAC 表(IP / MAC / 接在哪个口或哪段) - 网管型交换机:登录后执行 show mac address-table show mac address-table dynamic show mac address-table count (华为 / H3C 设备用 display mac-address) - 记一下现在有几条、都是谁。

第 2 步:拿到本机的 MAC,去表里找自己

Get-NetAdapter -Physical | Format-Table Name, Status, MacAddress, LinkSpeed

把有线网卡那一行的 MAC 抄下来,回到交换机表里搜它—— 你能看到自己"挂在哪个口"。这就是交换机对你的全部认知。

第 3 步:制造"新设备报到" 让一台手机重新连一次 Wi-Fi(或把一台电脑的网线拔掉再插上)。 它一连上就会发DHCP 请求(广播)+ ARP + 各种组播/广播(收 3.23·3.16)—— 几十秒内,交换机的表里 / 路由器设备列表里就会出现它。 ⚠️ 注意:设备不说话就不登记。如果它刚连上还没发任何帧,可能出现"设备明明连着、表里却没有"。

第 4 步:亲手做一次"端口漂移"(推荐,很直观) 把一台设备(电脑、打印机都行,只要能换网口)从交换机的1 口换到 3 口: - 换之前:表里显示它在 1 口 - 换之后(它一发帧):表里变成 3 口 这就是"情形③ 改写端口"。它只发生一次,属于正常搬家。

第 5 步:观察"刷新" 让一台设备持续 ping 另一台(保持活跃),盯住交换机表: 只要它一直在说话,那条表项的寿命就会一直被重置,永远不会消失。 对比:停掉 ping,放个几分钟再看,它可能已经被老化删掉了(默认约 300 秒,收 5.9)。

第 6 步:看自己"挂在上联口"的样子(有多台交换机时) 去上一级交换机(或汇聚交换机)上看表: 下面那台交换机下面所有设备的 MAC,在它眼里都挂在同一个"上联口"上。 这就是"每个 MAC 在不同交换机上对应不同的口"——每台只记"从哪个口来"。

第 7 步:找一次"漂移告警"(有条件就试) 网管型交换机上常有漂移计数 / 日志:

show mac address-table move    (不同厂商命令名不同,也常叫 flapping)

正常情况应该是 0 或极少量。如果数字一直涨—— 先查环路(看 STP 里那个口是不是 Blocking,收 5.10)、再查无线漫游、再考虑端口安全。

第 8 步(可选,安全前提下):故意制造一次环路 用一根网线把同一台交换机的两个普通口对接起来(只在自己家的设备上做,做完立刻拔掉)—— 你会看到端口灯疯狂闪烁、网络变卡,表里出现同一 MAC 在两个口之间来回跳。 这就是漂移 + 广播风暴的现场(收 5.7)。拔线即可恢复。(如果设备支持,先开 STP 会看到其中一个口被 Blocking,什么都不会发生——那正是 STP 的价值。)

第 9 步:清表再看它长回来

clear mac address-table dynamic        (Cisco 风格)

清空之后,什么流量都不做——表会一直是空的; 然后随便 ping 一台设备、或让手机发个消息,表项立刻开始一条条长回来。 这一步最能说明:这张表完全是"用流量喂出来的",没有任何一张表是管理员配的。

⚠️ 关于第 8 步的提醒

环路实验会瞬间让整个局域网变卡甚至瘫痪(广播风暴)。只在自己家、能立刻拔线的环境下做;办公室、宿舍、公司网络不要做。 现在很多家用交换机也内建了 STP 或环路检测,你可能看不到明显现象——那说明它工作正常,属于好事。

九、30 秒实验:让表"长一条出来"

🧪 "谁说话,表里就有谁"
  1. 打开家用路由器的管理页,找到「已连接设备」列表,数一下现在有几台
  2. 拿起一台已连 Wi-Fi 的手机,关掉 Wi-Fi 再打开(或点一下"重新连接")
  3. 盯着那个列表看 10~30 秒

你会看到手机重新出现在列表里(也可能短暂消失再回来,因为老化的那条被删掉、新的又学了进来)。

这个动作里没有任何人做配置。 手机只是"发了几个帧",交换机就把它记下来了——这就是"登记": 设备自己报到,交换机顺手登记,全程零配置。

反过来验证一遍:把手机的 Wi-Fi 关掉,放几分钟再看列表——它会消失(老化删除)。 一关一开,正好把"新增 / 老化"两件事都看完了。

十、常见误区

⚠️ 别踩这些
  1. 以为交换机登记的是"目的 MAC"。 只登记源 MAC。目的地址是用来查的,不是用来记的。
  2. 以为登记要跑某种协议、或需要设备配合。 不需要。信息是白捡的——设备什么都不用做,只要发一帧。
  3. 以为顺序无所谓。 必须"先登记、后查表":过了这一帧,"它在哪个口"这个信息就永远拿不到了。
  4. 以为设备插上就一直有表项。 不说话就不登记;不说话久了还会被老化删掉(收 5.11 的"单向流量泛洪")。
  5. 以为被丢弃的帧不会被学习。 过滤(目的口=入端口)的帧同样会被登记——学习在前、丢弃在后。
  6. 以为表项只会"加"或"刷新"。 还会改写端口(漂移)——这正是设备换口、无线漫游被自动适应的机制。
  7. 以为 MAC 漂移一定是故障。 搬一次家(换口)是正常的;在同一个 MAC 上反复来回跳才是问题(环路 / 欺骗)。
  8. 以为坏帧的源一定不登记。 取决于厂商实现:有的先登记后校验。这也是"灌表攻击"的一种实现方式。
  9. 把交换机的 MAC 表当成主机的 ARP 表。 一张记 MAC → 端口(在交换机里),一张记 IP → MAC(在你电脑里)——名字像,内容完全不同。
  10. 以为全网的交换机的表是一样的。 每台独立登记:同一个 MAC,在接入交换机上对应终端口,在汇聚交换机上对应上联口。
  11. 以为静态表项"更安全所以越多越好"。 静态写错会永远送错口且不会自愈;一般只给"必须固定位置的设备"用。
  12. 以为表越大越好。 容量是有上限的(收 5.9);真正的关键不是表多大,而是表里的信息够不够新够不够全。

十一、动手自测

❓ 点开自我检查(先自己答,再看答案)
  1. 交换机的"登记"发生在一帧旅程的哪一步?为什么必须在那一步?
  2. 登记时用的是目的 MAC 还是源 MAC?为什么?
  3. 一行表项里通常有哪几个字段?
  4. 登记有哪三种情形?分别对应什么动作?
  5. 什么叫 MAC 地址漂移?哪些原因正常、哪些不正常?
  6. 什么情况下交换机学不到一台设备?
  7. 广播帧和组播帧会被登记吗?登记的是谁?
  8. 被过滤丢掉的帧,它的源 MAC 会被登记吗?为什么?
  9. 为什么同一个 MAC 在不同交换机上"对应的端口"不一样?
  10. 动态表项和静态表项有什么区别?各自的风险是什么?
  11. 主机的 ARP 表和交换机的 MAC 表,分别记什么、怎么查看?
  12. 老化时间调长调短各有什么代价?

答案: ① 发生在"读帧头"这一步,而且排在查目的 MAC 之前(收 5.10)。因为"这个 MAC 在哪个口"这个信息只能从这一帧的来路得知——帧一转发走,这个信息就消失了,所以必须当场记下。 ② 用源 MAC。目的 MAC 是"我要找谁",正是不知道才要查的那个;而源 MAC 加上"它从哪个口进来",才构成位置信息(MAC 地址扁平无结构,位置推不出来,只能靠"从哪来"来判断,收 5.4)。 ③ MAC 地址(源 MAC)、出端口(入端口)、类型(动态 / 静态)、寿命(老化计时器);有 VLAN 时还会有一列 VLAN(收 5.3)。 ④ 新增(表里没有 → 加一行)/刷新(表里有且端口相同 → 只重置寿命)/漂移(表里有但端口不同 → 改写端口)。 ⑤ MAC 地址漂移=同一个 MAC 的表项在两个(或更多)端口之间变化(MAC move)。正常:设备换了端口(换网线、换工位)、无线漫游(终端从 AP1 切到 AP2);不正常:环路(同一帧从两个口绕回来,表项高频来回跳,是 STP 该工作的信号,收 5.7·5.10)、MAC 欺骗(伪造别人 MAC 抢流量)。 ⑥ 只要它从不发帧就学不到——交换机只能从"收到的帧的源地址"来学。所以"不说话"的设备和长期只有下行没有上行的流量,都会让表里没有它(收 5.11 的"单向流量长期泛洪")。 ⑦ 会被登记,而且登记的是发送方自己的源 MAC(源地址按定义必须是单播,收 5.4)。这就是"ARP 请求一广播出去,交换机就认得发送方了"的原因(收 3.16)。 ⑧ 会。学习与转发是两件独立的事:登记排在前面,过滤(目的口=入端口而丢弃,收 5.9)发生在后面,所以帧虽然被丢了,源 MAC 早已登记。 ⑨ 因为每台交换机各自独立学习,各自只记"从哪个口收到过它"。对接入交换机来说是"终端接的那个口",对上一级汇聚交换机来说则是"往下那台交换机的上联口"——同一个 MAC,越往上走,对应的端口越"靠上游"。 ⑩ 动态表项是学来的、会老化(常见默认约 300 秒)、重启即清空;静态表项是管理员手工写的、永不老化。动态的风险是"信息会过期"(老化后重新泛洪);静态的风险是"写错了会一直送错口,而且不会自愈"。 ⑪ ARP 表记 IP → MAC,由每台主机自己维护,靠收 ARP 应答学习(收 3.16),主机侧用 arp -a / Get-NetNeighbor 查看;MAC 地址表记 MAC → 端口,由交换机维护,靠任何合法帧的源 MAC 学习,交换机侧用 show mac address-table / display mac-address 查看(家用路由器在管理页「已连接设备」)。两张表不同步时就会出现"主机侧正常、网络上却在泛洪"(收 5.11)。 ⑫ 调短:表更新鲜、设备换口后纠正得快,但泛洪会变多(表里经常没有它);调长:泛洪变少,但表项占得久、设备已换口时可能先把帧送到旧口(不过一次漂移就纠正)。默认的约 300 秒是折中值。

十二、下一步学什么

相关笔记