tcpdump 0800 vs 8100

5 阅读3分钟

在网络协议分析和软件定义网络(SDN)开发中,0x08000x8100 的区别代表了以太网帧结构的不同层级

结论先行

  • 0x0800 (EtherType for IPv4): 表示该以太网帧直接承载的是 IPv4 数据包
  • 0x8100 (EtherType for 802.1Q): 表示该帧是一个 VLAN Tagged 帧。它告诉网卡驱动,接下来的内容是 4 字节的 VLAN 标签,而不是 IP 头部。

1. 结构化对比

特性0x08000x8100
协议名称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-OVNCilium 场景中:

  • 如果使用 VLAN 模式,物理链路必须出现 0x8100 才能保证交换机正确识别。
  • 如果使用 Geneve/VXLAN 模式,物理口看到的 EtherType 依然是 0x0800(IPv4),因为 VLAN 标签被封装在了外层 UDP 报文的内部,或者压根没用二层 VLAN 标记。