本页目录
交换、桥接与 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):
Learning 和 Forwarding 是同时进行的 — 收到 frame 时先学习 source (更新 MAC 表) 再查 dest。如果 dest == source port → 不转发 (过滤, 防环路)。
Linux Bridge
// net/bridge/
// bridge 本质上是一个虚拟交换机, 用 FDB (Forwarding Database) 存储 MAC→port
;
bridge 与物理交换机的差异:
- 物理交换机: MAC table 在硬件 ASIC → per-port 极速查找
- Linux bridge: MAC table 在 hash table (软件) → 比硬件慢 ~10x, 但足够用于软件交换机 (<10Gbps)
- Linux bridge 可以设
ageing_time:
# MAC aging 时间 (默认 300s):
# 查看 FDB:
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