
上一篇我们从一帧以太网数据在局域网中的转发过程出发,认识了目的 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 发出的以太网帧可以抽象为:
源 MAC:MAC_A
目的 MAC:MAC_B
该帧从端口 1 到达交换机。交换机先处理源地址:将 MAC_A -> 端口 1 写入表中;如果表中已有同一源地址的表项,就刷新它的老化时间,必要时更新端口信息。
此时表中还没有 MAC_B,交换机无法确定 B 位于哪个端口。为了让帧仍有机会抵达 B,它会把帧复制到除入端口 1 外的所有端口。这种对未知目的单播帧的处理叫作泛洪(flooding)。
端口 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 进入交换机:
源 MAC:MAC_B
目的 MAC:MAC_A
交换机同样先从源地址学习,加入 MAC_B -> 端口 3。然后查询目的地址 MAC_A,发现已知它对应端口 1,于是只把帧从端口 1 转发出去。
端口 3 收到 B -> A 的帧
|
+-- 学习:MAC_B -> 端口 3
|
+-- 查到:MAC_A -> 端口 1
|
+-- 仅从端口 1 定向转发
到这一步,交换机已经学到了 A 和 B 的位置。以后 A 再发给 B 时,就会从端口 3 定向转发;B 再发给 A 时,就会从端口 1 定向转发。局域网中的其他端口不必再收到这些无关帧。
3. 表项不是一劳永逸的
设备会移动、断电、换接端口,网络拓扑也可能变化。若 MAC 地址表永久保留旧记录,交换机可能一直把帧送往错误端口。
所以动态 MAC 表项会设置老化时间。交换机持续从某个 MAC 地址收到帧时,会刷新对应表项的计时;长时间未见该源地址的表项则会自动删除。下一次需要发送给这个地址时,交换机可能先泛洪,等目标设备再次发出帧后再重新学到它的位置。
这也是交换机能够即插即用的原因:它不要求人工预先描述每台主机的位置,而是让实际通信不断校正表项。
四、查表之后的三种转发结果
从任意端口收到一个有效以太网帧后,交换机可以按下面的顺序理解:
- 检查帧是否有差错;发现 FCS 等校验异常时丢弃。
- 根据源 MAC 地址学习或刷新 MAC 地址表。
- 查询目的 MAC 地址对应的出接口。
- 依据查询结果转发、泛洪或过滤。
其中第 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 地址自学习依赖一个可正常转发且没有二层环路的网络环境。
七、把一次转发过程串起来
现在可以把交换机处理一帧数据的过程压缩为一条清晰的链路:
收到以太网帧
|
检查 FCS,错误则丢弃
|
读取源 MAC,学习或刷新“源 MAC -> 入端口”
|
查询目的 MAC
|
+-- 未知:向除入端口外的端口泛洪
|
+-- 已知且出端口不同:从目标端口定向转发
|
+-- 已知且出端口相同:过滤,不再转发
这里有三个最值得记住的要点:
- **从源 MAC 学习,而不是从目的 MAC 学习。**源地址告诉交换机“这个地址的帧是从哪里来的”。
- **按目的 MAC 转发。**目的地址决定该从哪个端口离开,或是否需要泛洪。
- **动态老化保证表项与网络变化同步。**表项不会永久有效,设备迁移后可以重新学习。
从帧、MAC 地址、ARP 到交换机自学习,我们已经能解释局域网中一帧数据为什么会被准确送到某个端口,也能解释第一次通信时为什么常常需要泛洪。不过,当同一台交换机接入的设备越来越多,仅靠 MAC 地址表并不能缩小广播帧的传播范围。接下来会进一步看看 VLAN 如何在不改变大量物理布线的前提下,把一个交换式网络划分为多个相互隔离的逻辑广播域。
如果这篇文章对你有帮助,欢迎点赞、评论、关注、收藏。你们的支持是我前进的动力!


1万+

被折叠的 条评论
为什么被折叠?



