在网络协议分析和软件定义网络(SDN)开发中,0x0800 和 0x8100 的区别代表了以太网帧结构的不同层级。
结论先行
0x0800(EtherType for IPv4): 表示该以太网帧直接承载的是 IPv4 数据包。0x8100(EtherType for 802.1Q): 表示该帧是一个 VLAN Tagged 帧。它告诉网卡驱动,接下来的内容是 4 字节的 VLAN 标签,而不是 IP 头部。
1. 结构化对比
| 特性 | 0x0800 | 0x8100 |
|---|---|---|
| 协议名称 | Internet Protocol version 4 (IPv4) | IEEE 802.1Q (VLAN Tagging) |
| 帧结构位置 | 紧跟在源 MAC 地址之后 | 紧跟在源 MAC 地址之后 |
| 后续内容 | IPv4 Header (20 字节起) | VLAN Tag (4 字节) + 原始 EtherType |
| 常见场景 | 普通二层接入、解封装后的报文 | 交换机 Trunk 口、子接口、虚拟化环境 |
2. 为什么在物理口看到的是 0x0800?
如果你在运行了 VLAN 或 Overlay 网络(如 Kube-OVN/Cilium 涉及的封装)的物理口抓包,却只看到 0x0800 而非 0x8100,通常由以下第一性原理层面的底层机制导致:
A. 硬件卸载 (VLAN Offloading)
现代网卡(NIC)通常开启了 rx-vlan-offload。
- 原理: 当带有 VLAN 标签的帧到达物理网卡时,网卡硬件会自动剥离(Strip)那 4 字节的
0x8100标签,并将 VLAN ID 放入元数据(skb 的 vlan_tci)中传给内核。 - 结果:
tcpdump捕获的是经过硬件处理后的数据包,此时0x8100已不存在,协议字段显示为内层的0x0800。
B. 操作系统层面的处理
在 Linux 网络栈中,如果你监听的是物理接口(如 eth0),而 VLAN 终结在子接口(如 eth0.100)上:
- 物理层视角: 原始电信号包含
0x8100。 - 抓包点视角:
tcpdump使用的是AF_PACKET套接字。如果内核驱动在将包传递给tap接口前已经处理了 VLAN 头部,你在物理口看到的就已经是“干净”的 IPv4 包。
3. 如何验证是否存在 VLAN 标签?
如果你怀疑是硬件卸载干扰了观察,可以尝试关闭卸载功能:
Bash
# 关闭 VLAN 接收卸载
ethtool -K <interface_name> rxvlan off
# 再次尝试抓包,此时你应该能看到 0x8100 (802.1Q)
tcpdump -i <interface_name> -e -n
注意:
-e参数在tcpdump中至关重要,它能打印出链路层(以太网头部)的信息,否则你只能看到网络层以上的逻辑。
领域关联
在你熟悉的 Kube-OVN 或 Cilium 场景中:
- 如果使用 VLAN 模式,物理链路必须出现
0x8100才能保证交换机正确识别。 - 如果使用 Geneve/VXLAN 模式,物理口看到的 EtherType 依然是
0x0800(IPv4),因为 VLAN 标签被封装在了外层 UDP 报文的内部,或者压根没用二层 VLAN 标记。