【计算机网络 | 数据链路层6:交换机的工作原理:MAC 地址表是如何学习出来的?】

上一篇我们从一帧以太网数据在局域网中的转发过程出发,认识了目的 MAC 地址、ARP 和以太网帧各自扮演的角色。但还有一个关键问题没有展开:主机把帧交给交换机后,交换机怎么知道目的主机接在哪个端口?

它并不需要管理员为每台电脑逐项录入端口信息。现代二层交换机能在正常通信中观察帧的来源,自动建立并维护一张 MAC 地址表;有了这张表,原本可能发往所有端口的帧,就能大多数时候只发往正确的一个端口。

这一篇仍处在 TCP/IP 五层模型的数据链路层。我们关注的是同一个交换式局域网内的帧怎样被转发,而不是跨网络时路由器如何根据 IP 地址选择路径。

一、从集线器到交换机:差别不只是端口更多

早期使用集线器的以太网中,集线器只在物理层处理比特信号:从一个端口收到比特流后,就复制到其他端口。它不理解帧首部,也不会辨认目的 MAC 地址。因此,连接在同一个集线器上的设备共享传输介质,属于同一个冲突域。

交换机的核心转发功能工作在数据链路层。它会接收完整的以太网帧,检查帧首部中的源 MAC 地址和目的 MAC 地址,再决定该转发、泛洪还是过滤。

可以把两者的差异概括为:

设备 主要工作层次 收到数据后的典型处理 冲突域
集线器 物理层 向其他端口复制比特信号 所有端口共享一个冲突域
二层交换机 数据链路层 根据 MAC 地址表转发或过滤帧 每个端口通常是独立冲突域

这里的"通常"很重要。交换机端口直连主机或另一台交换机时,现代以太网一般工作在全双工方式,不需要 CSMA/CD;如果交换机端口接的是集线器,连接的一侧仍是共享介质,仍可能涉及半双工和 CSMA/CD。

不过,交换机并不会因为理解 MAC 地址,就直接把一切帧都变成单播。它首先得知道"哪个 MAC 地址位于哪个端口后面",这正是 MAC 地址表存在的原因。

交换机的功能

链路层交换机的核心功能 可拆解为过滤与转发 ,二者通过"交换机表"协同工作

  • 过滤功能决定帧是否应被转发或丢弃。
  • 转发功能基于交换机表确定帧的输出接口。即决定帧应被发送到哪个接口。

这两个功能要通过交换机表(MAC表)实现

二、MAC 地址表记录的是什么?

MAC 地址表也常被称为交换表、转发表或 CAM 表。不同设备和教材的名称略有差异,但核心内容一致:它记录一个可达的 MAC 地址与交换机端口之间的对应关系,并为动态表项保留老化信息。

交换机表包含三要素:

  • MAC地址(目标设备的唯一标识)
  • 对应接口(该MAC地址对应的交换机端口)
  • 时间戳(生存时间,倒计时)。

它表达的不是"这台主机在全世界的什么位置",而是一个更局部的判断:如果要到达这个 MAC 地址,帧应从本交换机的哪个端口送出去。

因此,MAC 地址表只服务于本交换机所在的二层转发范围。它不同于路由器的路由表:

对比维度 交换机的 MAC 地址表 路由器的路由表
主要依据 MAC 地址 IP 网络前缀或 IP 地址
所在层次 数据链路层 网络层
解决的问题 局域网内从哪个端口转发帧 跨网络时下一跳往哪里走
形成方式 从到达帧的源 MAC 地址中自学习,也可静态配置 手工配置或通过路由协议计算、学习

不要把"MAC 地址表"理解为 ARP 缓存。ARP 缓存维护的是"IP 地址对应哪个 MAC 地址",主要帮助主机或路由器在发送前完成二层寻址;MAC 地址表维护的是"某个 MAC 地址应从哪个交换机端口离开",用于交换机内部的帧转发决策。

  • ARP 用来"生成帧之前确定目的 MAC"。
  • MAC 地址表用来"帧进入交换机之后决定往哪转发"。

三、交换机怎样自学习:只相信帧从哪里来

以太网交换机通过自学习算法动态构建MAC地址表,无需人工干预。

交换机的自学习原则非常朴素:

某个源 MAC 地址的帧从端口 X 进入,那么目前可以认为,到达该 MAC 地址的帧应从端口 X 送出。

注意,学习依据是源 MAC 地址,不是目的 MAC 地址。目的 MAC 地址只用于查询和转发;如果交换机试图从目的地址学习,就无法确认目标设备实际位于哪个端口。

例子

假设交换机有四个端口:主机 A 接在端口 1,主机 B 接在端口 3,主机 C、D 分别接在其他端口。刚上电时,MAC 地址表为空。

1. A 第一次向 B 发送帧

A 发出的以太网帧可以抽象为:

text 复制代码
源 MAC:MAC_A
目的 MAC:MAC_B

该帧从端口 1 到达交换机。交换机先处理源地址:将 MAC_A -> 端口 1 写入表中;如果表中已有同一源地址的表项,就刷新它的老化时间,必要时更新端口信息。

此时表中还没有 MAC_B,交换机无法确定 B 位于哪个端口。为了让帧仍有机会抵达 B,它会把帧复制到除入端口 1 外的所有端口。这种对未知目的单播帧的处理叫作泛洪(flooding)。

text 复制代码
端口 1 收到 A -> B 的帧
          |
          +-- 学习:MAC_A -> 端口 1
          |
          +-- 查不到 MAC_B
          |
          +-- 从端口 2、3、4 泛洪,不回发端口 1

C 和 D 虽然能收到这份帧副本,但发现目的 MAC 地址不是自己,会由其网卡丢弃;B 的网卡发现目的 MAC 与自己匹配,才接收该帧。这里要分清:**交换机的泛洪不等于所有主机都会接收上交的数据。**泛洪只是交换机把帧送往多个端口,最终是否接收仍由终端根据目的 MAC 地址判断。

2. B 回应 A 时,交换机学到 B 的位置

假设 B 随后向 A 回一帧,帧从端口 3 进入交换机:

text 复制代码
源 MAC:MAC_B
目的 MAC:MAC_A

交换机同样先从源地址学习,加入 MAC_B -> 端口 3。然后查询目的地址 MAC_A,发现已知它对应端口 1,于是只把帧从端口 1 转发出去。

text 复制代码
端口 3 收到 B -> A 的帧
          |
          +-- 学习:MAC_B -> 端口 3
          |
          +-- 查到:MAC_A -> 端口 1
          |
          +-- 仅从端口 1 定向转发

到这一步,交换机已经学到了 A 和 B 的位置。以后 A 再发给 B 时,就会从端口 3 定向转发;B 再发给 A 时,就会从端口 1 定向转发。局域网中的其他端口不必再收到这些无关帧。

3. 表项不是一劳永逸的

设备会移动、断电、换接端口,网络拓扑也可能变化。若 MAC 地址表永久保留旧记录,交换机可能一直把帧送往错误端口。

所以动态 MAC 表项会设置老化时间。交换机持续从某个 MAC 地址收到帧时,会刷新对应表项的计时;长时间未见该源地址的表项则会自动删除。下一次需要发送给这个地址时,交换机可能先泛洪,等目标设备再次发出帧后再重新学到它的位置。

这也是交换机能够即插即用的原因:它不要求人工预先描述每台主机的位置,而是让实际通信不断校正表项。

四、查表之后的三种转发结果

从任意端口收到一个有效以太网帧后,交换机可以按下面的顺序理解:

  1. 检查帧是否有差错;发现 FCS 等校验异常时丢弃。
  2. 根据源 MAC 地址学习或刷新 MAC 地址表。
  3. 查询目的 MAC 地址对应的出接口。
  4. 依据查询结果转发、泛洪或过滤。

其中第 4 步最容易混淆,可以分为三类。

1. 目的 MAC 未知:泛洪

若目的 MAC 不在表中,交换机不知道目标在哪个端口,就将帧从除入端口以外的所有端口发出。这叫未知单播泛洪。

"未知单播"描述的是帧的目的地址本身是一个普通单播 MAC 地址,只是当前交换机尚未学到它的位置;它与目的地址为广播地址的广播帧不是同一回事。

2. 目的 MAC 已知且端口不同:定向转发

若查到目的 MAC 对应的出接口,并且该出接口不同于入接口,交换机只从该出接口发送帧。这是最常见、也是交换机提高带宽利用率的关键。

例如,MAC_B -> 端口 3 已存在,而 A 的帧从端口 1 到达,交换机就把帧从端口 3 发出。其他端口不会收到该帧。

3. 目的 MAC 已知但端口相同:过滤

若目的 MAC 的表项指向的端口恰好就是帧的入端口,说明源主机和目的主机目前位于同一端口后面的网络中。

  • 例如,端口 2 后面接了一个小型共享网段,两个设备之间互发帧;它们的帧已经能够在该网段内到达彼此,无须再绕回交换机。

此时交换机丢弃该帧,不向其他端口转发。这种"阻止不必要转发"的动作称为过滤。它不是差错丢弃,也不是说帧一定有问题,而是因为没有必要让该帧离开当前网段。

五、广播、多播和未知单播为什么都会看到多个端口?

"交换机不会广播"是一个常见但不准确的说法。更准确的表述是:交换机会尽量对已知单播帧做定向转发,但仍会在需要时向多个端口发送帧。

帧的情况 交换机的典型处理 原因
已知单播 从目标端口定向转发 MAC 地址表已知目的位置
未知单播 除入端口外泛洪 尚未知道目的位置
广播帧 除入端口外泛洪 广播本就要求同一广播域内的设备都能收到
多播帧 按交换机能力和相关表项处理,未知时可能泛洪 目标是一组设备而非单个 MAC 地址

ARP 请求就是典型的广播帧。主机尚不知道目标 IP 对应的 MAC 地址时,会发送目的 MAC 为 FF:FF:FF:FF:FF:FF 的 ARP 请求;交换机在同一广播域内把它转发到其他端口,目标主机再以单播 ARP 应答回复。随后,主机拥有 IP 到 MAC 的映射,交换机也会在双方通信中逐渐拥有 MAC 到端口的映射。

因此,ARP 表和交换机 MAC 地址表都在帮助局域网通信减少"不知道该发给谁"的问题,但它们所处的位置和回答的问题不同。

六、交换机、广播域与环路:自学习的边界

普通二层交换机将每个端口划分为独立冲突域,却不会天然划分广播域。在没有 VLAN 的普通交换式以太网中,广播帧和未知单播帧仍会被泛洪到同一广播域的其他端口。

如果为了冗余而在多台交换机间连接出二层环路,泛洪帧可能在环路中不断被复制、循环,造成 MAC 地址表反复抖动并迅速占满带宽。这不是自学习算法"算错了",而是二层转发没有像 IP 数据报那样默认携带可用于限制转发次数的跳数机制。

例子:

  • 假定一开始交换机转发表均为空。
  • 主机 A 通过接口交换机#1向主机B发送一帧。
  • 交换机#1收到这个帧后就向所有其他接口进行广播发送。
  • 观察其中一个帧的走向:离开交换机#1的接口 3-->交换机#2 的接口 1-->接口 2 -->交换机#1 的接口 4 -->接口 3 -->交换机#2 的接口 1。。。
  • 这样就无限制地循环兜圈子下去,白白消耗了网络资源。

工程上通常用生成树协议(STP)等机制在逻辑上阻断部分冗余链路,使转发拓扑保持无环。我们在这里先记住结论即可:MAC 地址自学习依赖一个可正常转发且没有二层环路的网络环境。

七、把一次转发过程串起来

现在可以把交换机处理一帧数据的过程压缩为一条清晰的链路:

text 复制代码
收到以太网帧
    |
检查 FCS,错误则丢弃
    |
读取源 MAC,学习或刷新"源 MAC -> 入端口"
    |
查询目的 MAC
    |
    +-- 未知:向除入端口外的端口泛洪
    |
    +-- 已知且出端口不同:从目标端口定向转发
    |
    +-- 已知且出端口相同:过滤,不再转发

这里有三个最值得记住的要点:

  1. **从源 MAC 学习,而不是从目的 MAC 学习。**源地址告诉交换机"这个地址的帧是从哪里来的"。
  2. **按目的 MAC 转发。**目的地址决定该从哪个端口离开,或是否需要泛洪。
  3. **动态老化保证表项与网络变化同步。**表项不会永久有效,设备迁移后可以重新学习。

从帧、MAC 地址、ARP 到交换机自学习,我们已经能解释局域网中一帧数据为什么会被准确送到某个端口,也能解释第一次通信时为什么常常需要泛洪。不过,当同一台交换机接入的设备越来越多,仅靠 MAC 地址表并不能缩小广播帧的传播范围。接下来会进一步看看 VLAN 如何在不改变大量物理布线的前提下,把一个交换式网络划分为多个相互隔离的逻辑广播域。

如果这篇文章对你有帮助,欢迎点赞、评论、关注、收藏。你们的支持是我前进的动力!

相关推荐
Shaoxi Zhang3 小时前
JAVA学习笔记035——对象和JSON格式
java·笔记·学习
hoaxxcj3 小时前
零能力 Agent 骗过评测实测:朴素 harness 被骗 75%,加固后仍漏掉「抄答案」
网络·安全·大模型·工程化·ai实战
陈皮波比茶3 小时前
Redis学习
数据库·redis·学习
猫咪宝妖4 小时前
【信息安全工程师】网络与信息安全理论
网络·安全·web安全
minglie16 小时前
espidf的esp32版的webClient
学习
学运维的Kysan6 小时前
暑假运维学习打卡第二十五天8.16
学习
键盘飞行员6 小时前
Flutter App 全套实战学习计划:从零搭建到 APK 部署
学习·flutter
Fnetlink17 小时前
FNET 云网安 260819
网络·人工智能·安全·网络安全
lsh曙光7 小时前
playbook剧本(2)--Ansible变量
linux·运维·网络
会编程的吕洞宾8 小时前
DeepAgents In Action学习(Second)
android·java·学习