5.12 讲的是"一帧发出之后,表里被写进了什么";本节把镜头翻到另一侧,回答更要紧的三个问题:这件事由谁执行、执行几次、新登记的到底是谁。答案只有三句:① 登记只能由"收到帧的那台设备"完成——表项的两个字段,一个(源 MAC)来自发送方写在帧头里,另一个(入端口)只有接收侧观测得到,发送方根本不知道自己的帧会从对方的哪个口进来;② 一次发送 = 链路上多次接收——沿途每台交换机各收到一次、各登记一行,所以同一个 MAC 在不同交换机上对应不同的口;③ "收下帧"和"被登记"是两回事——"收下"的门槛是"目的 MAC 得是我",而登记只看源 MAC、哪怕这帧根本不是给你的;反过来,收到帧的那一方不会因此进表,被登记的永远是发送方。于是有了本节最实用的一句结论:让别人在表里"住下来"的唯一办法是自己开口说话——只收不发的设备,永远找不到。
5.9 讲"凭一张表决定往哪送",5.10 讲"内部怎么把帧搬过去",5.11 讲"不认识路时怎么办",5.12 讲"这张表是怎么长出来的"。本节是 5.12 的翻转镜头:同一件事(登记),从发送方那一侧看和从接收侧看,看到的完全不一样。
- 5.12 二层交换机的操作(以太帧发送后的MAC地址表的登记):讲了登记读什么字段、三种情形、坏帧学不学。本节接着问:这些动作用的是谁提供的信息、由谁执行
- 5.6 数据的格式(以太网的数据帧格式):帧头里只有目的 MAC + 源 MAC,没有任何字段描述"收信人在哪"——这就是"知道要给谁 ≠ 知道他在哪"的物理原因
- 5.4 接口是哪个(MAC地址):源 MAC 是网卡自己填的,也就是发送方唯一的"报到凭据"——所以改 MAC 就等于拿别人的号报到
- 5.11 二层交换机的操作(Unknown单播数据帧、泛洪):那里说"单向流量会让表项老化掉",本节讲清为什么单向流量注定学不到收信方
- 5.9 创建以太网网络(二层交换机):三件事"学习 / 查表转发 / 泛洪"——本节把"学习"这一件从接收侧的时间轴上重新摆一遍
- 3.16 将IP地址与MAC地址对应(ARP):第一次 ping 的四帧往返,正是"两端各自报到、表才配齐"的最好例证
- 2.2 用于构建网络的设备(网络设备):交换机与网卡都在链路层看帧头,但一个为了"送"、一个为了"收",看法完全不同
- 5.7 如何连接(网络拓扑):拓扑上的"形状"决定了这一帧会被几台设备接收——链上每多一台交换机,就多一次登记
一、先把问题问清楚:登记这件事由谁执行
5.12 说清了表里写什么:源 MAC + 入端口。现在把它们拆成"谁提供的":
| 表项的两个字段 | 谁提供 | 怎么得到 |
|---|---|---|
| 源 MAC(如 A) | 发送方 | 网卡在发送时把它填进帧头(收 5.4·5.6) |
| 入端口(如 Gi0/1) | 接收侧 | 只有收到这个帧的那台设备才知道它从哪个口进来了 |
发送方握着"我是谁",但它永远拿不到"我在你这里算哪个口"。 它只知道自己的网卡把帧交出去了;帧之后从谁的哪个口进来、路上拐了几个弯,它一概不知道(那是转发路径的事,收 5.10)。
所以:发送帧只是"提供了原料",真正执行登记的是收到帧的那台设备。 这就是教材把这一段拆成"发送后"与"接收后"两节的原因——同一件事的两端。
5.12 的"发送后",说的是时间——一台设备发出帧之后,沿途交换机的表发生了变化。 而动作始终只发生在接收侧。两边合起来才是完整一句话: "A 发出帧"这个动作,把"交换机 1 收到帧"这个动作触发了——表是在后者里被改的。
二、一次发送 = 链路上多次接收
把上面那张图的场景排成一张表:A 发一个"目的 MAC = C"的帧,中间经过两台交换机。
| 谁 | 发生了什么 | 表里的结果 |
|---|---|---|
| 终端 A | 把 源 MAC = A、目的 MAC = C 写进帧头,发出 |
无(主机不维护 MAC 表) |
| 交换机 1 | 收到 → 登记 A ↔ 口 1 → 拿目的 MAC 查表送出 | 新增或刷新一行 |
| 交换机 2 | 收到 → 登记 A ↔ 口 27 → 拿目的 MAC 查表送出 | 新增或刷新一行 |
| 终端 C | 取帧头比对目的 MAC:是我的 → 收下、往上交给 IP 层 | 无(同一台主机不维护 MAC 表) |
三句要点:
- 每台交换机各登记一行。同一个 A,在接入交换机上对应"终端接的那个口",在汇聚交换机上对应"往下那台交换机的上联口"(收 5.11·5.12)。
- 登记的永远是同一个号:A(发送方)。从第一跳到最后一跳,被反复写进去的都是发信人。
- C 全程不产生任何登记。它收到了一封"写着它名字的信",但交换机对这个动作一无所知——交换机只看了这封信的发信人。
家里那台路由器/交换机"登记"你的时候,你根本没意识到; 而你在公司发一个文件到另一个网段,从你电脑到对方电脑之间的每一台二层设备都各记了一笔"你这个 MAC,从我的某个口来"。 越往上走,对应的口越"靠上游"——这也是为什么按 MAC 定位物理位置要靠接入层的表(收 5.12)。
三、"接收"这个词在链路上有两个意思
这是本节最容易踩混的地方:同一个"接收",在交换机和在终端网卡上,含义完全不同。
| 维度 | 交换机(接收侧设备) | 终端网卡(收信人) |
|---|---|---|
| "接收"的范围 | 全部收下,不管这帧是给谁的 | 只收给它的(目的 MAC = 本机 / 广播 / 组播) |
| 依据哪个字段 | 源 MAC 用来登记、目的 MAC 用来查表 | 只看目的 MAC(收 5.6) |
| 收下之后做什么 | 登记 → 转发 / 过滤 / 泛洪 | 交给驱动 → IP 层 → 应用 |
| 会不会登记 | 会(这就是本节的主题) | 不会(主机没有 MAC 表) |
| 不是给自己的帧怎么办 | 照收、照登记、照转发 | 直接丢掉,连驱动都到不了 |
泛洪时,交换机会把帧从除入端口外的所有口送出——每一个口上的设备,都得先把整帧收下来、看一眼目的 MAC、发现不是给自己的、再丢掉(收 5.11)。 所以"打扰所有设备"不是修辞:它们真的都收了一遍,只是白收了。
顺着看,链路上其实有三道"按名字挑人"的关卡:
- 交换机按目的 MAC 挑口——这道口上没有它,就不往这送(收 5.9)
- 网卡按目的 MAC 决定收不收——不是给我的就丢
- 主机的 IP 层按目的 IP 决定上不上交——MAC 是我的但 IP 不是我的?照样不交上去(收 3.7)
信封上的名字被逐层核对:帧头写着"给谁的 MAC"、IP 头写着"给谁的 IP",两道名字都不对就出不去。
四、核心推论:收到帧的一方不会进表
把第二节的表再想一遍,会得出一个相当反直觉的结论:
交换机非常清楚这帧是发给 C 的(目的 MAC 就是 C), 可它依然不知道 C 在哪个口——因为帧头里根本没有"收信人在哪"这个字段(收 5.6)。
于是有了一条清晰的界线:
| 交换机知道的 | 交换机不知道的 |
|---|---|
| 这帧要给谁(目的 MAC 写在帧里) | 那个"谁"现在在哪个口 |
| 发信人在哪(因为它刚发过帧) | 收信人在哪(它什么都没说) |
前者写在帧里,是发送方告诉它的; 后者必须靠目的方自己发帧才可能知道。
所以 C 的第一次回话(ARP 应答 / TCP 的 ACK / ping 的回包)一发出, 交换机才第一次登记 C——而且登记的端口,正是 C 那根线的口。
这条推论直接解释了两个日常现象:
- 一次双向通信之后,两端才都进表。A ping C 成功后,A 和 C 都在表里了——因为两个方向都有帧经过。
- 单向流量注定学不到收信方:只有 A→C 的流(监控推流、日志上传),C 从不回话 → 表里永远没有 C → 表项一老化就开始泛洪,而且永不自愈(收 5.11 的经典故障)。
你 ping 一台开着防火墙、不回 ICMP 的设备(收 2.4 那个坑)—— 它其实收到了你的请求,只是不回。 结果:它永远不进表 → 之后每次发给它的帧都是未知单播泛洪。 所以"ping 不通"和"它不在表里"经常同时出现,但它们不是同一件事。
五、走一遍第一次 ping:四帧把表填满
把"接收侧登记"放到一个真实流程里看。A 第一次 ping 同网段的 C:
| 顺序 | 谁发出什么 | 帧的类型 | 交换机登记了谁 |
|---|---|---|---|
| 1 | A → ARP 请求("谁是 C 的 IP?") | 广播(全 F) | 登记 A ← A 报到 |
| 2 | C → ARP 应答("是我,我的 MAC 是…") | 单播给 A | 登记 C ← C 第一次进表 |
| 3 | A → ICMP 请求 | 单播给 C(此时候选口已知) | 刷新 A |
| 4 | C → ICMP 应答 | 单播给 A | 刷新 C |
四帧之后,A 和 C 都"住"在表里了。
- 第 2 帧是转折点:C 在此之前"对交换机不存在",从这一帧起它有了位置。任何"我一开口,对方才认识我"的现象,根子都在这。
- 第 3 帧为什么能定向送出:因为第 2 帧已经让交换机学到了 C。"泛洪只发生在第一次"的机制根,就是对方先说了话(收 5.11)。
- "第一个 ping 包慢":慢在第 1 帧——ARP 广播 + 泛洪 + 等应答(收 5.11)。
- 反过来,如果 C 的 ARP 缓存还有效、但交换机的表已经老化:A 直接发单播数据帧,目的 MAC 写法没错,交换机却查不到 → 出门即未知单播泛洪。主机侧一切正常,网络上却在泛洪——所以查泛洪要看交换机,不看电脑(收 5.11)。
六、报到凭据:源 MAC 与 MAC 欺骗
回到"谁提供原料"这件事上——发送方唯一的凭据就是自己填进帧头的源 MAC(收 5.4·5.6)。
- 它是"自报家门",没有任何验证:交换机不会去核实"这个号真是你的吗"
- 所以改了网卡 MAC(MAC 欺骗)= 拿着别人的号报到:交换机把"别人的号"记到你的口上
- 后果:真正的那个设备的 MAC 从此指向你的口 → 发给它的帧被送到你这里(截流);同时表里那条 MAC 在两个口之间跳 → 漂移告警(收 5.12)
- 正规对策:端口安全(限制每口可学的 MAC、绑定)、802.1X(先认证再放行)、动态 ARP 检测(收 5.3·5.9)
二层"插上就通、零配置"的另一面,就是"谁说的话都信"。 所有基于 MAC 的机制(表、VLAN、端口安全)都建立在这个前提上; 想真正可信,得往上层走(认证、加密)——这也正是端口隔离与 802.1X 存在的理由。
七、动手 Demo:把"接收"和"登记"分开看
目标:分清"帧到了线路上"、"设备收下了"、"交换机登记了"这三件不同的事。
第 1 步:先把"表"找出来
- 家用路由器管理页 →「已连接设备」/「终端管理」:这就是简化版的 MAC 表,通常还有"最近活跃时间"一列(就是登记/刷新的时间戳)
- 网管型交换机:show mac address-table / show mac address-table count(数一下现在几条)
第 2 步:拿到本机 MAC,去表里找自己
Get-NetAdapter -Physical | Format-Table Name, Status, MacAddress, LinkSpeed
抄下有线网卡的 MAC,回表里搜它——看自己挂在哪个口/哪一段。这就是交换机对你的全部认知。
第 3 步:证明"不是给我的帧,我的网卡根本不接收" 打开 Wireshark,不加任何过滤器,看几秒: - 默认情况下你只能看到"给你的"帧:本机上下行、广播、组播(收 5.6) - 看不到的:同网段别人之间的单播、泛洪出去但不是给你的那些帧——它们在网卡层就被丢掉了,连驱动都到不了(想看见得开混杂模式) 这一步的意义:"线路上跑的帧"远远多于"你接收到的帧"。
第 4 步:观察"谁在刷新,谁一直不动" - 盯着路由器设备列表的「最近活跃时间」 - 什么都不做:所有时间戳原地不动(没人说话就没有新登记) - 拿起手机刷一下网页:它那一行的时间戳立刻跳——进表和刷新,都靠"它自己说话"
第 5 步:制造一次"纯粹只收不发" 找一台开着防火墙、不回 ICMP 的设备(或者把 Windows 防火墙的"文件和打印机共享(回显请求)"规则关掉,再去 ping 它): - 它收到了你的 ICMP 请求,但不回包 - 结果:它始终不出现在表里(或表项老化后不再回来) - 之后你每次 ping 它,都是 ARP 广播 + 泛洪(收 5.11) ⚠️ 这就是"只收不发 → 永远进不了表"的现场。
第 6 步:拔线再插,看"重新报到" 把网线拔掉、等十几秒、再插上。网卡一连上就会发一串帧(DHCP 请求 / ARP / 各种组播,收 3.23)—— 表里 / 设备列表里它重新出现。这就是"报到"(收 5.12)。
第 7 步:交叉看两张表(端到端验证)
arp -a
- ARP 表里有对方、MAC 表里也有 → 两张表都同步
- ARP 表里有、交换机 MAC 表里没有 → 发了会泛洪(表老了,收 5.12)
- 两张表记的从来不是同一件事:ARP 记 IP→MAC(在主机里),MAC 表记 MAC→端口(在交换机里)
第 8 步(可选):看一次"多跳各登记一次" 如果家里/公司有两台串联的交换机:在上一级的表里找下面那台交换机下面设备的 MAC—— 它们全都挂在同一个"上联口"上。这就是"每台各记各的口"(收 5.12)。
第 3 步想看见"不是给你的帧",需要在 Wireshark 里勾选混杂模式(或给网卡开了这个选项)。 只在自己家的网络上做;公司/学校的网络里,这种行为可能触发安全告警(收 4.9 关于审计设备的老板账)。
八、30 秒实验:让表停跳 30 秒
- 打开家用路由器的「已连接设备」列表(或交换机的
show mac address-table) - 什么都别做,盯着看 30 秒
- 然后拿起手机刷一下网页(或点开一个视频)
- 再看那个列表
你会看到:前 30 秒所有时间戳都停在那里(没人说话,就没有任何变化), 手机一刷,它那一行立刻跳。
这张表完全是用流量喂出来的:设备不主动说话,交换机就永远不知道它在哪。 反过来说——表里一条都不能凭空出现,也没有一条是管理员手工配的(收 5.12)。
九、常见误区
- 以为交换机登记的是"这帧是给谁的"。 登记的是发送方。目的地址只用来查表,不用来记(收 5.12)。
- 以为"我收到了帧,交换机就知道我在哪了"。 收到帧不产生任何登记——被登记的是发信人。想让别人找到你,只能自己开口。
- 以为登记可以发生在发送方那一侧。 发送方只能提供源 MAC;入端口只有接收侧观测得到,所以登记只能由收到帧的设备执行。
- 以为"收下帧"和"被登记"是一回事。 门槛完全不同:收下要求目的 MAC 是我;登记只看源 MAC,哪怕这帧不是给你的照记不误。
- 以为主机也会登记。 主机不维护 MAC 表;主机只有 ARP 表(IP → MAC)。两回事(收 5.12)。
- 以为"别人 ping 我,我就进表了"。 只有回包(我发帧)才让我进表。防火墙挡住不回 → 永远泛洪。
- 以为"交换机知道目的 MAC"就等于"知道它在哪"。 知道"要给谁"和"知道他在哪"是两件事——后者必须等对方说话。
- 以为泛洪只累到目标一台。 每个口上的设备都要先收下整帧、看目的 MAC、再丢掉(收 5.11)。
- 以为同一个 MAC 在全网只有一个"位置"。 每台交换机各记各的:接入层是终端口,汇聚层是上联口。
- 以为 ARP 请求和应答的登记效果一样。 两个都会被登记,但登记的是各自的发送方:请求登记 A、应答登记 C(收 3.16)。
- 以为网卡能看到网络上所有帧。 正常模式只收给自己的(+ 广播/组播),其余在网卡层就被丢弃——要看齐得开混杂模式。
- 以为"零配置"意味着"可信"。 源 MAC 是自报家门、无人验证的;改 MAC 就能拿别人的号报到(漂移/MAC 欺骗的根,收 5.12)。
十、动手自测
- 表项的两个字段分别由哪一侧提供?为什么登记只能由接收侧执行?
- 一台设备发出一个帧,链路上会有几台设备"接收"它?会产生几次登记?
- 交换机的"接收"和网卡的"接收"有什么不同?
- 为什么"交换机知道这帧是给 C 的",却不知道"C 在哪个口"?
- 收到帧的一方会被登记吗?为什么?
- 什么叫"单向流量导致长期泛洪"?机制是什么?
- 第一次 ping 的四帧里,哪一帧让 C 第一次进表?
- 链路上有哪三道"按名字挑人"的关卡?
- 为什么源 MAC 是"唯一的报到凭据"?它能被伪造吗,后果是什么?
- 如果一台设备开了防火墙、不回 ICMP,它在交换机的表里会怎样?
- 主机的 ARP 表和交换机的 MAC 表"不同步"时,会看到什么现象?
- 为什么说"泛洪打扰了网段里所有设备"不是夸张?
答案: ① 源 MAC 由发送方提供(网卡发送时填进帧头,收 5.4·5.6),入端口只有接收侧观测得到——发送方根本不知道自己的帧从哪个口进来。两个字段各占一半,所以登记这个动作只能由收到帧的设备执行。 ② 沿途每一台交换机各接收一次、各登记一行;再加上目的主机的网卡也"收下"一次(但主机不登记)。所以"一次发送 = 链路上多次接收、多次登记,登记的永远是同一个源 MAC"。 ③ 交换机是"全收":不管这帧给谁,都收下、都用(源 MAC 用来登记、目的 MAC 用来查表);网卡是"挑收":只有目的 MAC 是本机(或广播/组播)才收下往上交,其余直接丢弃。 ④ 因为帧头里没有任何字段描述"收信人在哪"(只有目的 MAC 和源 MAC,收 5.6)。"要给谁"是发送方写进帧里的;"他在哪个口"只能靠他自己发帧时暴露。 ⑤ 不会。登记的对象永远是发送方——表项是"谁发的、从哪个口来",收信人只是被写在目的字段里,不构成任何位置信息。 ⑥ 只有 A→C 的流量(监控推流、日志上传),C 从不发帧 → 交换机永远学不到 C → 表里没有 C(或老化后消失)→ 发给 C 的帧永远走未知单播泛洪,而且不会自愈(收 5.11)。 ⑦ 第 2 帧:C 回的 ARP 应答(单播给 A)。从这一帧起交换机才第一次登记 C——所以"对方先说话"是你能被定向送达的前提(收 5.11·3.16)。 ⑧ ① 交换机按目的 MAC 挑口(该口没有就不往那送,收 5.9);② 网卡按目的 MAC 决定收不收;③ 主机 IP 层按目的 IP 决定上不上交(MAC 对、IP 不对照样不交,收 3.7)。 ⑨ 因为源 MAC 是网卡自己填的、没人验证,它是发送方唯一能"证明自己是谁"的东西。能被伪造(MAC 欺骗)→ 交换机把别人的号记到你的口上 → 真正的设备收不到帧 + 表里出现漂移(收 5.12);对策是端口安全、802.1X、动态 ARP 检测。 ⑩ 它收到了请求但不回包 → 永远不进表(或老化后不再回来)→ 之后发给它的帧每次都是未知单播泛洪。所以"ping 不通"与"它不在表里"经常同时出现,但不是同一件事。 ⑪ ARP 表里有、交换机 MAC 表里没有 → 你这台电脑照常发单播帧(目的 MAC 写法没错),但交换机查不到 → 出门即泛洪:主机侧一切正常、网络上却在泛洪——所以查泛洪要看交换机不看电脑(收 5.11)。 ⑫ 因为泛洪是从除入端口外的所有口各送一份,每个口上的设备都得先把整帧收下来、比对目的 MAC、发现不是给自己的、再丢掉——它们真的都"接收"了一遍,只是白收(收 5.11)。
十一、下一步学什么
- ☑ 5.14 MAC地址表的管理(MAC地址表) —— 已学完:从运维视角收口这张表——默认全自动管理(学习·老化·漂移纠正都不用配,管理员只在"要固定/要限制/要排障"时出手)、五类表项(动态·静态·secure/sticky·系统·组播)、四个动作(看·定·调·清)、三种病与处置(缺了就补·多了就去·乱了就改)。见 MAC地址表的管理(MAC地址表)。
相关笔记
- MAC地址表的管理(MAC地址表) —— 下一节:本节讲"表怎么被写",下一节转到运维视角讲"这张表怎么被看、被定、被调、被清"
- 二层交换机的操作(以太帧发送后的MAC地址表的登记) —— 上一节讲"表里被写进了什么";本节讲"这件事由谁执行、登的是谁"
- 二层交换机的操作(Unknown单播数据帧、泛洪) —— 单向流量的长期泛洪;本节给出它的机制根:收信人不登记
- 创建以太网网络(二层交换机) —— 学习 / 查表转发 / 泛洪三件事;本节从接收侧的时间轴把它们重摆一遍
- 二层交换机的操作(二层交换机的数据传输) —— 一帧旅程的"读帧头"那一步;本节补上"这一步用的是谁提供的信息"
- 数据的格式(以太网的数据帧格式) —— 帧头只有目的 MAC + 源 MAC;"没有收信人在哪"这个字段,是本节的物理前提
- 接口是哪个(MAC地址) —— 源 MAC 是网卡自报的凭据;改 MAC 就等于拿别人的号报到
- 将IP地址与MAC地址对应(ARP) —— 第一次 ping 的四帧:请求登记 A、应答登记 C,表就是这么配齐的
- 数据的发送和接收(IP、IP数据包、路由) —— 第三道关卡:主机 IP 层按目的 IP 决定上不上交
- 对必要的设置进行自动设置(DHCP) —— 设备一连上就发一串帧,这就是一次完整"报到"
- 用于构建网络的设备(网络设备) —— 交换机与网卡都在链路层看帧头,一个为了"送"、一个为了"收"
- 如何连接(网络拓扑) —— 链上多一台交换机,就多一次接收、多一次登记
- 以太网标准(IEEE802委员会) —— 802.1X 与端口安全:给"自报家门"补上一道验证