2. 二层网络基础:以太网帧结构、MAC地址表、广播域与冲突域
在深入 Linux Bridge 内核实现之前,必须牢固掌握二层网络的核心概念。本章将系统梳理以太网帧的精确结构、MAC 地址表的转发逻辑,以及广播域与冲突域的本质区别。这些知识是理解 Bridge 如何在内核中处理数据包、学习地址和防止环路的基础。
2.1 以太网帧结构
以太网帧是二层网络传输的基本单元。Linux Bridge 在转发决策时,会解析帧头中的目标 MAC 地址(DMAC)和源 MAC 地址(SMAC)。当前主流使用的是 Ethernet II(DIX 2.0)帧格式,其结构如下:
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 前导码(Preamble) | 7 | 同步时钟,物理层使用,网卡接收后剥离 |
| 帧起始定界符(SFD) | 1 | 标识帧开始,物理层使用 |
| 目标 MAC 地址(DMAC) | 6 | 接收方 MAC,Bridge 查表依据 |
| 源 MAC 地址(SMAC) | 6 | 发送方 MAC,Bridge 学习依据 |
| 以太类型(EtherType) | 2 | 上层协议标识,如 0x0800(IPv4)、0x0806(ARP) |
| 载荷(Payload) | 46–1500 | 上层数据包,最小 46 字节保证碰撞检测 |
| 帧校验序列(FCS) | 4 | CRC32 校验,检测传输错误 |
关键点:Linux Bridge 在内核中处理数据包时,
sk_buff 结构体已经剥离了前导码和 SFD。Bridge 模块直接操作的是从 DMAC 开始的以太网帧头,通过 eth_hdr(skb) 宏获取帧头指针。
以下 SVG 展示了 Ethernet II 帧的完整结构,并标注了 Bridge 转发引擎关注的字段:
2.2 MAC 地址表与转发逻辑
MAC 地址表(又称 CAM 表)是二层交换设备的核心数据结构。Linux Bridge 在内核中维护一张 struct net_bridge_fdb_entry 的哈希表,用于记录 MAC 地址与端口的映射关系。
2.2.1 地址表条目结构
| 字段 | 类型 | 说明 |
|---|---|---|
dst |
struct net_bridge_port * |
指向出口端口(Bridge 的 slave 接口) |
key.addr |
unsigned char[ETH_ALEN] |
MAC 地址(6 字节) |
key.vlan_id |
u16 |
VLAN ID(如果启用 VLAN 过滤) |
flags |
unsigned short |
标志位:是否静态、是否本地、是否已同步 |
updated |
unsigned long |
最后更新时间戳,用于老化 |
used |
unsigned long |
最后使用时间戳,用于转发统计 |
2.2.2 转发决策流程
当 Bridge 收到一个数据帧时,内核中的 br_handle_frame 函数会执行以下逻辑:
- 源 MAC 学习:将帧的 SMAC 与接收端口关联,更新或创建 FDB 条目。
- 目标 MAC 查找:以 DMAC 为键在 FDB 哈希表中搜索。
- 决策:
- 若找到且端口与接收端口相同 → 丢弃(端口隔离)。
- 若找到且端口不同 → 单播转发到该端口。
- 若未找到或 DMAC 为广播/组播地址 → 洪泛到所有端口(除接收端口)。
内核路径:
br_handle_frame() → br_forward() / br_flood() → __br_forward() → br_forward_finish() → dev_queue_xmit()。
以下 SVG 展示了 MAC 地址表驱动的转发决策流程:
2.3 广播域与冲突域
这两个概念是理解二层网络隔离性的基础,也是 Bridge 与 Hub、交换机对比时的核心差异。
2.3.1 冲突域
冲突域是指网络中可能发生数据帧碰撞的范围。在共享介质(如使用 Hub 的以太网)中,同一时刻只能有一个设备发送数据,否则会发生冲突。
- Hub(集线器):所有端口在同一个冲突域中,半双工通信,效率低。
- Bridge / 交换机:每个端口是一个独立的冲突域,支持全双工,无冲突。
- Linux Bridge:软件实现的虚拟交换机,每个 slave 接口(如 veth、tap)在逻辑上属于独立冲突域。
2.3.2 广播域
广播域是指网络中所有能接收到广播帧(目标 MAC 为 FF:FF:FF:FF:FF:FF)的设备的集合。
- Hub / 普通交换机:默认所有端口在同一个广播域中。
- VLAN:将一个物理交换机划分为多个逻辑广播域。
- Linux Bridge:默认所有端口在同一广播域;启用 VLAN 过滤后,每个 VLAN 是一个独立的广播域。
| 设备 | 冲突域数量 | 广播域数量 | 转发方式 |
|---|---|---|---|
| Hub | 1(所有端口共享) | 1 | 电气信号复制 |
| Bridge / 交换机 | 每端口独立 | 1(默认) | MAC 地址表转发 |
| VLAN 交换机 | 每端口独立 | 每个 VLAN 独立 | MAC + VLAN 表转发 |
| Linux Bridge | 每端口独立 | 1(默认)/ 按 VLAN | 内核 FDB 表转发 |
注意:广播域过大时,广播流量会消耗大量带宽和 CPU 资源(广播风暴)。Linux Bridge 通过 STP 协议防止环路导致的广播风暴,而 VLAN 则从逻辑上缩小广播域。
以下 SVG 对比了 Hub、Bridge 和 VLAN 交换机的冲突域与广播域划分:
2.4 广播与洪泛的代价
在二层网络中,广播和洪泛是必要的机制,但也会带来性能开销:
- ARP 请求:主机发送 ARP 请求时,目标 MAC 为广播地址,Bridge 必须洪泛到所有端口。
- 未知单播洪泛:当 FDB 表中没有目标 MAC 条目时,Bridge 会洪泛该帧,直到目标主机响应并更新 FDB。
- 组播流量:IGMP 侦听(IGMP Snooping)可以优化组播洪泛,但默认情况下 Bridge 会洪泛所有组播帧。
优化建议:在生产环境中,建议启用
mac_hash 和 igmp_snooping 内核参数,并合理规划 VLAN 以缩小广播域。对于已知的单播流量,FDB 表的老化时间(默认 300 秒)可以根据网络规模调整。
2.5 小结
本章覆盖了二层网络的核心基础:
- 以太网帧结构:DMAC 和 SMAC 是 Bridge 转发的关键字段,EtherType 用于协议分发。
- MAC 地址表:内核 FDB 表驱动转发决策,学习、查找、洪泛是三个基本操作。
- 冲突域与广播域:Bridge 每个端口独立冲突域,默认单广播域;VLAN 提供广播域隔离。