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 转发引擎关注的字段:

Ethernet II 帧结构(Bridge 转发视角) 前导码 7B SFD 1B DMAC 6B SMAC 6B 类型 2B 载荷(Payload) 46–1500B FCS 4B Bridge 查表匹配 Bridge 学习源 MAC 协议分发 Bridge 转发引擎只关心 DMAC、SMAC,不修改帧内容(除重写源 MAC 的 Hairpin 模式外)

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 函数会执行以下逻辑:

  1. 源 MAC 学习:将帧的 SMAC 与接收端口关联,更新或创建 FDB 条目。
  2. 目标 MAC 查找:以 DMAC 为键在 FDB 哈希表中搜索。
  3. 决策:
    • 若找到且端口与接收端口相同 → 丢弃(端口隔离)。
    • 若找到且端口不同 → 单播转发到该端口。
    • 若未找到或 DMAC 为广播/组播地址 → 洪泛到所有端口(除接收端口)。
内核路径:br_handle_frame() → br_forward() / br_flood() → __br_forward() → br_forward_finish() → dev_queue_xmit()。

以下 SVG 展示了 MAC 地址表驱动的转发决策流程:

Bridge 转发决策流程(MAC 地址表驱动) 接收数据帧 学习源 MAC → 更新 FDB 表 查找 DMAC 在 FDB 表中 命中? 是 单播转发 否 洪泛到所有端口 若命中端口与接收端口相同,则丢弃(端口隔离);广播/组播地址直接洪泛

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 交换机的冲突域与广播域划分:

冲突域与广播域对比 Hub(集线器) 1 个冲突域 1 个广播域 所有端口共享 Bridge / 交换机 每端口独立冲突域 1 个广播域 端口隔离(全双工) VLAN 交换机 每端口独立冲突域 每个 VLAN 独立广播域 逻辑隔离广播域 Linux Bridge 默认行为类似普通交换机(1 个广播域),但可通过 VLAN 过滤实现多广播域 每个 Bridge 端口在逻辑上是一个独立冲突域,支持全双工无冲突通信

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 提供广播域隔离。