802.1Q Tag 是什么
802.1Q 是 IEEE 定义的 VLAN 标签标准,做法是在以太网帧的源 MAC 之后插入 4 字节标签,让一条物理链路能承载多个相互隔离的广播域。标签前 2 字节是 TPID,固定为 0x8100,用来告诉接收方『后面是 VLAN 标签』;后 2 字节是 TCI,内部再分 3 位 PCP 优先级、1 位 DEI 丢弃资格、12 位 VID 标识。所有厂商的 Trunk 互通都建立在这个格式上,只要两端对 TPID 与 VID 的理解一致,就能互相识别。
基本信息
| TPID | 0x8100(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 字段逐位读法
| 字段 | 位宽 | 含义 | 常见取值 |
|---|---|---|---|
| TPID | 16 bit | 标签协议标识,标明后续是 VLAN 标签 | 0x8100;QinQ 外层 0x88a8 |
| PCP | 3 bit | 优先级,供 QoS 排队使用 | 0-7,6/7 留给网络控制流量 |
| DEI | 1 bit | 丢弃资格(原 CFI 位) | 0 正常,1 表示拥塞时可优先丢弃 |
| VID | 12 bit | VLAN 标识,决定帧归属的广播域 | 1-4094;0 表示优先级标签 |
| FCS | 32 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,能避免把标签本身当成故障原因。