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

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 表)

三句要点:

  1. 每台交换机各登记一行。同一个 A,在接入交换机上对应"终端接的那个口",在汇聚交换机上对应"往下那台交换机的上联口"(收 5.11·5.12)。
  2. 登记的永远是同一个号:A(发送方)。从第一跳到最后一跳,被反复写进去的都是发信人。
  3. C 全程不产生任何登记。它收到了一封"写着它名字的信",但交换机对这个动作一无所知——交换机只看了这封信的发信人。
💡 这条 "一次发送、多次接收" 有多实在

家里那台路由器/交换机"登记"你的时候,你根本没意识到; 而你在公司发一个文件到另一个网段,从你电脑到对方电脑之间的每一台二层设备都各记了一笔"你这个 MAC,从我的某个口来"。 越往上走,对应的口越"靠上游"——这也是为什么按 MAC 定位物理位置要靠接入层的表(收 5.12)。

三、"接收"这个词在链路上有两个意思

这是本节最容易踩混的地方:同一个"接收",在交换机和在终端网卡上,含义完全不同。

维度 交换机(接收侧设备) 终端网卡(收信人)
"接收"的范围 全部收下,不管这帧是给谁的 只收给它的(目的 MAC = 本机 / 广播 / 组播)
依据哪个字段 源 MAC 用来登记、目的 MAC 用来查表 只看目的 MAC(收 5.6)
收下之后做什么 登记 → 转发 / 过滤 / 泛洪 交给驱动 → IP 层 → 应用
会不会登记 会(这就是本节的主题) 不会(主机没有 MAC 表)
不是给自己的帧怎么办 照收、照登记、照转发 直接丢掉,连驱动都到不了
❗ 由此看清"泛洪"的真实代价

泛洪时,交换机会把帧从除入端口外的所有口送出——每一个口上的设备,都得先把整帧收下来、看一眼目的 MAC、发现不是给自己的、再丢掉(收 5.11)。 所以"打扰所有设备"不是修辞:它们真的都收了一遍,只是白收了。

顺着看,链路上其实有三道"按名字挑人"的关卡:

  1. 交换机按目的 MAC 挑口——这道口上没有它,就不往这送(收 5.9)
  2. 网卡按目的 MAC 决定收不收——不是给我的就丢
  3. 主机的 IP 层按目的 IP 决定上不上交——MAC 是我的但 IP 不是我的?照样不交上去(收 3.7)

信封上的名字被逐层核对:帧头写着"给谁的 MAC"、IP 头写着"给谁的 IP",两道名字都不对就出不去。

四、核心推论:收到帧的一方不会进表

把第二节的表再想一遍,会得出一个相当反直觉的结论:

交换机非常清楚这帧是发给 C 的(目的 MAC 就是 C), 可它依然不知道 C 在哪个口——因为帧头里根本没有"收信人在哪"这个字段(收 5.6)。

于是有了一条清晰的界线:

交换机知道的 交换机不知道的
这帧要给谁(目的 MAC 写在帧里) 那个"谁"现在在哪个口
发信人在哪(因为它刚发过帧) 收信人在哪(它什么都没说)
❗ "知道要给谁" ≠ "知道他在哪"

前者写在帧里,是发送方告诉它的; 后者必须靠目的方自己发帧才可能知道。

所以 C 的第一次回话(ARP 应答 / TCP 的 ACK / ping 的回包)一发出, 交换机才第一次登记 C——而且登记的端口,正是 C 那根线的口。

这条推论直接解释了两个日常现象:

⚠️ 还有一个真实场景:防火墙挡住不回话

你 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 的机制(表、VLAN、端口安全)都建立在这个前提上; 想真正可信,得往上层走(认证、加密)——这也正是端口隔离与 802.1X 存在的理由。

七、动手 Demo:把"接收"和"登记"分开看

🧪 Demo62:谁在接收、谁被登记

目标:分清"帧到了线路上"、"设备收下了"、"交换机登记了"这三件不同的事。

第 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 秒

🧪 "进表靠说话,刷新也靠说话"
  1. 打开家用路由器的「已连接设备」列表(或交换机的 show mac address-table)
  2. 什么都别做,盯着看 30 秒
  3. 然后拿起手机刷一下网页(或点开一个视频)
  4. 再看那个列表

你会看到:前 30 秒所有时间戳都停在那里(没人说话,就没有任何变化), 手机一刷,它那一行立刻跳。

这张表完全是用流量喂出来的:设备不主动说话,交换机就永远不知道它在哪。 反过来说——表里一条都不能凭空出现,也没有一条是管理员手工配的(收 5.12)。

九、常见误区

⚠️ 别踩这些
  1. 以为交换机登记的是"这帧是给谁的"。 登记的是发送方。目的地址只用来查表,不用来记(收 5.12)。
  2. 以为"我收到了帧,交换机就知道我在哪了"。 收到帧不产生任何登记——被登记的是发信人。想让别人找到你,只能自己开口。
  3. 以为登记可以发生在发送方那一侧。 发送方只能提供源 MAC;入端口只有接收侧观测得到,所以登记只能由收到帧的设备执行。
  4. 以为"收下帧"和"被登记"是一回事。 门槛完全不同:收下要求目的 MAC 是我;登记只看源 MAC,哪怕这帧不是给你的照记不误。
  5. 以为主机也会登记。 主机不维护 MAC 表;主机只有 ARP 表(IP → MAC)。两回事(收 5.12)。
  6. 以为"别人 ping 我,我就进表了"。 只有回包(我发帧)才让我进表。防火墙挡住不回 → 永远泛洪。
  7. 以为"交换机知道目的 MAC"就等于"知道它在哪"。 知道"要给谁"和"知道他在哪"是两件事——后者必须等对方说话。
  8. 以为泛洪只累到目标一台。 每个口上的设备都要先收下整帧、看目的 MAC、再丢掉(收 5.11)。
  9. 以为同一个 MAC 在全网只有一个"位置"。 每台交换机各记各的:接入层是终端口,汇聚层是上联口。
  10. 以为 ARP 请求和应答的登记效果一样。 两个都会被登记,但登记的是各自的发送方:请求登记 A、应答登记 C(收 3.16)。
  11. 以为网卡能看到网络上所有帧。 正常模式只收给自己的(+ 广播/组播),其余在网卡层就被丢弃——要看齐得开混杂模式。
  12. 以为"零配置"意味着"可信"。 源 MAC 是自报家门、无人验证的;改 MAC 就能拿别人的号报到(漂移/MAC 欺骗的根,收 5.12)。

十、动手自测

❓ 点开自我检查(先自己答,再看答案)
  1. 表项的两个字段分别由哪一侧提供?为什么登记只能由接收侧执行?
  2. 一台设备发出一个帧,链路上会有几台设备"接收"它?会产生几次登记?
  3. 交换机的"接收"和网卡的"接收"有什么不同?
  4. 为什么"交换机知道这帧是给 C 的",却不知道"C 在哪个口"?
  5. 收到帧的一方会被登记吗?为什么?
  6. 什么叫"单向流量导致长期泛洪"?机制是什么?
  7. 第一次 ping 的四帧里,哪一帧让 C 第一次进表?
  8. 链路上有哪三道"按名字挑人"的关卡?
  9. 为什么源 MAC 是"唯一的报到凭据"?它能被伪造吗,后果是什么?
  10. 如果一台设备开了防火墙、不回 ICMP,它在交换机的表里会怎样?
  11. 主机的 ARP 表和交换机的 MAC 表"不同步"时,会看到什么现象?
  12. 为什么说"泛洪打扰了网段里所有设备"不是夸张?

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

十一、下一步学什么

相关笔记