本页目录

交换、桥接与 VXLAN

从 STP 防环到 VLAN 隔离到 VXLAN 跨三层隧道——二层网络的演进史,就是"广播域越切越小、隧道越打越远"的历史。理解 MAC 学习和 STP 收敛,就理解了为什么数据中心网络长成现在这样。

概述

交换机通过 MAC 学习自动构建转发路径,使得以太网可以扩展到数千个节点而无需手动配置。Linux bridge 用软件实现了同样的功能——容器和虚拟机通过 veth pair 接入 bridge,bridge 负责 L2 转发。STP/RSTP 防止环路导致广播风暴,VXLAN 则在 IP 网络上叠加虚拟 L2 网络,将 4094 个 VLAN 的限制扩展到 1600 万。这些都是数据中心和家庭网络中 L2 虚拟化的基础。

MAC Learning: 分布式 Hash Map

每个交换机维护一个 MAC 地址表 (Filtering Database):

MAC 学习与老化:交换机如何自愈的分布式 Hash Map

① 学习:frame 到达即记录来源 MAC frame 到达 port N 取 source MAC 存储 (MAC → port N)

② 转发:frame 有 dest MAC → 查表决定去向 查 MAC 表(按 dest MAC) 已知 → 单播转发 对应 port(不再泛洪!) 未知 → 泛洪 到所有 port(除入端口) 广播/多播 → 泛洪 (总是全端口发送)

③ 老化:每个 entry 有 aging timer(默认 300s) aging timer 300s 同 source MAC 再现 → 重置 timer,继续存活 timer 到期 → 删除 entry → 下次泛洪(重新学习)

洞察:这解释了为什么闲置一段时间的设备会短暂丢包—— 交换机忘了它 → 下一个 frame 泛洪 → 1 个包丢失,随即重新学习。

Learning 和 Forwarding 是同时进行的 — 收到 frame 时先学习 source (更新 MAC 表) 再查 dest。如果 dest == source port → 不转发 (过滤, 防环路)。

Linux Bridge

// net/bridge/
// bridge 本质上是一个虚拟交换机, 用 FDB (Forwarding Database) 存储 MAC→port

struct net_bridge_fdb_entry {
    unsigned char       addr[ETH_ALEN];     // MAC
    struct net_bridge_port *dst;            // 出口 port
    struct hlist_node   fdb_node;           // hash table
    struct hlist_node   vlan_node;          // per-VLAN list
    unsigned long       updated;            // jiffies of last refresh
    unsigned long       used;               // jiffies of last use
    u16                 vlan_id;
    // flags: sticky, added_by_user, added_by_external_learn, offloaded
};

bridge 与物理交换机的差异:

  1. 物理交换机: MAC table 在硬件 ASIC → per-port 极速查找
  2. Linux bridge: MAC table 在 hash table (软件) → 比硬件慢 ~10x, 但足够用于软件交换机 (<10Gbps)
  3. Linux bridge 可以设 ageing_time:
# MAC aging 时间 (默认 300s):
cat /sys/class/net/br0/bridge/ageing_time
echo 60 > /sys/class/net/br0/bridge/ageing_time   # 1 min

# 查看 FDB:
bridge fdb show br br0
bridge fdb add <MAC> dev eth0 master static       # 静态 entry (不老化)

Hairpin 与 Bridge-NF

bridge-nf (netfilter on bridge): iptables 可以在 bridge 转发的 frame 上运行。关键路径 (net/bridge/br_netfilter.c):

  • NF_BR_PRE_ROUTING: frame 刚到达 bridge port
  • NF_BR_FORWARD: frame 从一个 port 转发到另一个
  • NF_BR_POST_ROUTING: frame 即将离开 bridge port

这允许在 bridge 上使用 iptables 做透明防火墙/过滤/日志,但会有性能开销。

STP (802.1D)

环路问题: 两个交换机之间有两根线 → 没有任何机制 → 广播帧无限循环 → 广播风暴 → 整个网络瘫痪。

STP 的核心: 在一棵生成树上转发, 冗余链路阻塞待命

选举:
  1. Root Bridge: 最低 Bridge ID (priority + MAC)
  2. 每个非 Root bridge: 选一个 Root Port (到 root 最短路径)
  3. 每个网段: 选一个 Designated Port (负责此网段的转发)
  4. 其余 port → Blocked (不转发, 只收 BPDU)

BPDU (Bridge Protocol Data Unit):
  EtherType: 0x0026 (LLC) → DSAP/SSAP=0x42 (STP)
  每 2 秒发一次 (Hello timer)

STP BPDU 内容:
  Protocol ID: 0
  Version: 0 (STP) or 2 (RSTP)
  Type: 0 (config BPDU) or 0x80 (TCN)
  Flags: TC (Topology Change) + TCA (Topology Change Ack)
  Root ID: priority (2B) + MAC (6B)
  Root Path Cost: (4B)
  Bridge ID: priority + MAC
  Port ID: priority (4 bits) + port number (12 bits)
  Message Age / Max Age / Hello Time / Forward Delay

收敛时间:
  STP: 30-50s (Listening→Learning→Forwarding, 每阶段 15s)
  RSTP (802.1w): 1-3s (Proposal/Agreement 机制)

VXLAN (RFC 7348)

核心需求: 数据中心 L2 扩展

VLAN 只有 12-bit VID → 4094 个隔离域。大型数据中心需要更多 (multi-tenant 隔离)。VXLAN 提供 24-bit VNI → 16M 隔离域。

封装

VXLAN 封装:
  [Outer Eth][Outer IP][Outer UDP dport=4789][VXLAN Hdr 8B][Inner Eth][Inner IP][Inner Payload]

VXLAN Header:
  Flags (1 byte):  bit 3 = I (VNI valid), bit 0-2/4-7 = reserved
  Reserved (3 bytes): 零
  VNI (3 bytes): Virtual Network Identifier — 24-bit identifier
  Reserved (1 byte): 零

为什么用 UDP:
  - ECMP: 路由器可以按 UDP src port (entropy) 做多路径负载均衡
  - NAT traversal: UDP 可以通过 NAT (不像 GRE/IPIP 需要特别处理)
  - 防火墙友好: dst port=4789 固定 → 容易设置 ACL

VTEP

VTEP (VXLAN Tunnel Endpoint):
  封装/解封装点 (Linux: vxlan device)

  创建: ip link add vxlan100 type vxlan id 100 remote 10.0.0.2 dstport 4789 dev eth0

  转发逻辑:
    1. 本地 VM 发 frame → bridge 查 MAC → 目标 MAC 不在本地?
    2. 如果 MAC 在另一个 VTEP → 查 FDB: MAT→remote VTEP IP
    3. 封装: 加 VXLAN header + outer IP/UDP → route to remote VTEP IP
    4. 远端: vxlan device 收到 → 解封装 → 去掉 outer headers → bridge processing

  ARP suppression (减少 VXLAN 泛洪):
    多播/广播在 VXLAN 中必须 replicated 到所有 VTEP → 带宽浪费
    → ARP proxy at VTEP: 本地直接回 ARP (不用泛洪到网络)
    → L2-population: 从 control plane (如 Open vSwitch) 学习 MAC→VTEP 映射

参考

  • IEEE: 802.1D, 802.1w, 802.1Q
  • RFC: 7348 (VXLAN), 7348 Appendix A (ARP suppression recommendations)
  • 源码⁠: net/bridge/ (bridge + STP), drivers/net/vxlan/ (VXLAN driver)
  • LWN: "VXLAN and overlay networks in the kernel"

关键词: MAC learning, FDB, Linux bridge, STP, RSTP, BPDU, VXLAN, VTEP, VNI, ARP suppression, overlay network