bond0 vs bond0.0 的包发出和交换机处理流程
+-------------------------+
| Linux Host |
+-------------------------+
| |
| |
bond0 (untagged) bond0.0 (VLAN 0 tagged)
MTU = 1500 MTU = 1500
| |
v v
+----------------+ +----------------+
| Ethernet Frame | | Ethernet Frame |
| [no VLAN tag]| | [VLAN tag=0] |
+----------------+ +----------------+
| |
v v
+--------------------------------+
| Switch / NIC |
+--------------------------------+
| |
Unmodified / forwarded VLAN 0 frame
as normal behavior depends on switch:
- most trunks ignore or drop
- VLAN 0 only carries PCP (priority)
- NOT treated as ordinary VLAN
| |
v v
Network reachable Possibly dropped or ignored
by other hosts IP/ARP unreachable
✅ 总结视觉理解
- bond0 → untagged → switch 正常处理 → IP 通信正常
- bond0.0 → VLAN 0 tag → switch 可能丢弃 → IP 通信可能失败
- VLAN 0 仅作为优先级标记,不可用作普通 VLAN
1️⃣ 802.1Q 标准关于 VLAN 0
-
VLAN Tag(802.1Q header)结构:
2 bytes TPID (0x8100) 2 bytes TCI (VLAN ID + PCP) -
VLAN ID = 0 有特殊含义:
- 代表优先级(802.1p)
- 不用于 VLAN 隔离
- 数据包发送出去 依然会带 802.1Q header
- VLAN 0 不算普通 VLAN(ID 1~4094 才是标准 VLAN)
官方规范里,VLAN 0 是合法的,但它只是“标记优先级”而非真正的 VLAN。
2️⃣ 主流交换机的处理行为(经验 + 厂商文档)
| 厂商 / 系列 | VLAN 0 行为 |
|---|---|
| Cisco Catalyst / Nexus | VLAN 0 用于 QoS,不会作为普通 VLAN 转发;如果 trunk 收到 VLAN 0,一般丢弃或忽略 ID 0,只保留优先级 PCP |
| Arista EOS | VLAN 0 帧在 trunk 上不会被划入任何 VLAN,通常丢弃或默认为 native VLAN |
| Juniper EX / QFX | VLAN 0 不用于隔离,部分型号会丢弃 VLAN 0 帧 |
| H3C / Huawei | VLAN 0 常用作 QoS tag,不能作为普通 VLAN 端口,帧可能被丢弃 |
💡 结论:
VLAN 0 是标准允许的,但绝大多数主流交换机 不把它当成普通 VLAN 来转发,会丢弃或忽略,只保留 802.1p 优先级字段。
3️⃣ Linux bond0.0 的行为
-
Linux 内核会创建一个 VLAN 子接口,TPID=0x8100,VLAN ID=0
-
发送帧时:
- 会加 4 字节 VLAN header
- VLAN ID=0 → 对应交换机 trunk 的 VLAN 0
-
如果交换机丢掉或忽略 → IP / ARP 无法通信
4️⃣ 实战经验总结
-
VLAN 0 ≠ untagged
-
VLAN 0 ≠ VLAN 1
-
VLAN 0 通常 只能做 QoS 优先级标记
-
大部分主流交换机不会当作普通 VLAN 转发
-
所以在生产环境:
- bond0.0 不可靠
- 不要用它来承载 IP 或做不同 MTU 的网段
💡 一句话记忆法:
“VLAN 0 在 Linux 上会打 tag,但主流交换机不会按 VLAN 0 转发,无法作为普通 VLAN 接口使用。”
如果你需要,我可以帮你画一张 bond0 / bond0.0 发出的帧和交换机处理流程图,直观显示为什么 VLAN 0 不可用。