首页/网络/VLAN 与高可用速查/802.1Q 帧格式与 Tag 字段
VLAN 与 Trunk81 条

802.1Q 帧格式与 Tag 字段

802.1Q 在原以太帧的源 MAC 之后插入 4 字节 Tag:TPID=0x8100、PCP 3 位优先级、DEI 1 位、VID 12 位,靠它区分不同 VLAN 的流量。

VLAN 与高可用速查网络更新于 2026-10-13

802.1Q Tag 是什么

802.1Q 是 IEEE 定义的 VLAN 标签标准,做法是在以太网帧的源 MAC 之后插入 4 字节标签,让一条物理链路能承载多个相互隔离的广播域。标签前 2 字节是 TPID,固定为 0x8100,用来告诉接收方『后面是 VLAN 标签』;后 2 字节是 TCI,内部再分 3 位 PCP 优先级、1 位 DEI 丢弃资格、12 位 VID 标识。所有厂商的 Trunk 互通都建立在这个格式上,只要两端对 TPID 与 VID 的理解一致,就能互相识别。

基本信息

TPID0x8100(802.1Q)/ 0x88a8(QinQ 外层)
TCI 结构PCP(3bit) + DEI(1bit) + VID(12bit)
插入位置源 MAC 之后、Length/Type 之前
帧长影响比无 Tag 帧多 4 字节
最大帧长普通 1518 字节、带 Tag 1522 字节(含 FCS)

帧结构示意

帧结构示意
[DstMAC 6B][SrcMAC 6B][TPID 2B=0x8100][TCI 2B][Type 2B][Payload][FCS 4B]
TCI = PCP(3bit) | DEI(1bit) | VID(12bit)
QinQ 双层标签示例:[TPID 0x88a8][TCI 外层][TPID 0x8100][TCI 内层][Type][Payload]

Tag 字段逐位读法

字段位宽含义常见取值
TPID16 bit标签协议标识,标明后续是 VLAN 标签0x8100;QinQ 外层 0x88a8
PCP3 bit优先级,供 QoS 排队使用0-7,6/7 留给网络控制流量
DEI1 bit丢弃资格(原 CFI 位)0 正常,1 表示拥塞时可优先丢弃
VID12 bitVLAN 标识,决定帧归属的广播域1-4094;0 表示优先级标签
FCS32 bit帧校验,物理层处理抓包工具默认看不到

典型使用场景

  • 跨设备承载多 VLAN:交换机互联口用 Trunk,靠 Tag 区分不同业务流量
  • 语音与数据共线接入:IP 电话打 PCP 标记,交换机按优先级给语音队列优先转发
  • QinQ 双层标签:运营商接入用户 VLAN 时外层再套一层,实现用户隔离
  • 抓包定位 VLAN 问题:看到实际 TPID 与 VID,才能确认对端发来的是带 Tag 还是无 Tag 帧
  • 核对 MTU 与分片:跨 Trunk 的链路要按 1522 字节核算链路上限,避免大包被丢

抓包核对 Tag

抓包核对 Tag
tcpdump -i eth0 -e -nn vlan             # 只抓带 VLAN 标签的帧并打印二层头
tcpdump -i eth0 -e -nn 'vlan 10'        # 只看 VLAN 10 的流量
tcpdump -i eth0 -e -nn 'vlan and vlan'  # QinQ:连续两层标签
tcpdump -i eth0 -c 20 -e -nn vlan       # 取 20 个样本后停止

Wireshark 显示过滤

Wireshark 显示过滤
vlan.id == 10                 # 按 VID 过滤
vlan.priority == 5             # 只看 PCP 为 5 的帧
eth.type == 0x8100             # 匹配 TPID,用于确认标签存在
untagged 流量(Native VLAN / PVID 对应 VLAN)不带标签,标签只出现在 Trunk、Hybrid 这类显式携带 VLAN 信息的链路上。同一物理口上可以同时收发带 Tag 与不带 Tag 的帧,判断时以对端实际发出的帧为准。
PCP 只在链路上有意义:经过三层设备后原有 PCP 通常被丢弃并重写,所以不要指望跨网段的优先级标记会自动延续,需要在每一跳上分别配置。

为什么插在源 MAC 之后

标签位置不是随便定的:接收端可以从帧起始的固定偏移处检查 TPID,若等于 0x8100 就按带标签帧解析,否则退回普通以太帧的处理逻辑,这样同一块网卡既能收带标签帧也能收普通帧。反过来说,不支持 802.1Q 的老网卡拿到带标签帧时,会在本该是 Length/Type 的位置读到 0x8100,把它当成未知协议直接丢弃,这就是老设备接 Trunk 口不通的根本原因。

按标签核算链路 MTU

按标签核算链路 MTU
ip link show eth0                        # 查看当前接口 MTU,默认 1500
ip link set eth0 mtu 1500                # 单层标签场景保持 1500 即可
# 带一层标签的帧最大 1522 字节(含 FCS),跨 Trunk 的链路按此核算
# QinQ 双层标签再增加 4 字节,最大 1526 字节,隧道与聚合口要一并放宽
标签层数不设上限:QinQ 外层用 TPID 0x88a8(IEEE 802.1ad)与内层 0x8100 区分,部分厂商还允许把外层 TPID 改成 0x9100 或 0x9200 以兼容老设备。层数越多,每跳都要重新核对 VID 与链路最大帧长。
抓包时看到带标签帧不代表链路配置正确:先确认标签出现在哪一跳、VID 是否等于预期值,再回头核对 Trunk 放行列表与 PVID,能避免把标签本身当成故障原因。

易错点

  • QinQ 外层 TPID 记住 0x88a8:部分厂商默认用 0x9100 或 0x9200,抓包时按 TPID 区分内外层标签,只认 0x8100 会把外层标签漏掉
  • 按 1518 字节规划链路 MTU:带 Tag 的帧最大 1522 字节,中间链路或隧道封装若按 1518 设限,大包会被静默丢弃
  • 把 FCS 算进帧长或当成应用数据:FCS 由物理层处理,交换芯片校验后剥离,抓包文件里通常看不到,计算 MTU 时不要把它当载荷
  • 只看 Wireshark 的 VLAN 列就下结论:部分网卡驱动会剥离标签(硬件卸载),需要在抓包选项里关闭 VLAN 剥离才能看到真实标签
  • 把 PCP 当作端到端 QoS 保证:优先级只在单跳链路上生效,跨设备后需要逐跳重新标记,否则中间的尽力转发队列会先丢包

数据来源与参考

  • IEEE 802.1Q-2018 Clause 9(Tagged frame format)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌