3、IEEE 802.1Q VLAN与优先级:VLAN标签结构、PCP优先级编码、VLAN在车载网络中的应用场景
好,咱们今天聊聊VLAN。说实话,VLAN在传统IT网络里已经是个老话题了,但在车载以太网里,它还是个香饽饽。为什么?因为车上的网络环境太特殊了——摄像头数据、雷达点云、诊断报文、娱乐音视频,全都挤在一根线上。没有VLAN,这些数据就会互相打架。
我个人习惯把VLAN理解成「虚拟的隔离墙」。你想想看,物理上只有一根网线,但逻辑上我们可以把它切成好几个独立的网络。这就是VLAN的核心价值。
3.1 VLAN标签结构:4个字节的秘密
先看最基础的东西——VLAN标签长什么样。IEEE 802.1Q定义的这个标签,就插在以太网帧头里,总共4个字节。我刚开始学的时候总觉得这4个字节没什么了不起,直到在项目里抓包分析才发现,这里面的门道真不少。
传统以太网帧:
| 目的MAC(6B) | 源MAC(6B) | 类型/长度(2B) | 数据 | FCS |
带VLAN标签的帧:
| 目的MAC(6B) | 源MAC(6B) | TPID(2B) | TCI(2B) | 类型/长度(2B) | 数据 | FCS |
这4个字节分成两部分:
- TPID(Tag Protocol Identifier):固定值0x8100,告诉交换机「嘿,这是个VLAN标签」
- TCI(Tag Control Information):里面藏着PCP、DEI、VID三个字段
TCI的位分配是这样的:
| 位 | 字段 | 长度 | 说明 |
|---|---|---|---|
| 15-13 | PCP | 3 bit | 优先级编码,0-7共8个等级 |
| 12 | DEI | 1 bit | 丢弃指示,1表示可丢弃 |
| 11-0 | VID | 12 bit | VLAN ID,0-4095 |
重点记住:VID=0是保留值,用于优先级标签;VID=4095也是保留的。实际可用的VID范围是1-4094。我在项目里见过有人用了VID=0,结果交换机直接不认,排查了半天。
3.2 PCP优先级编码:3个bit决定生死
PCP(Priority Code Point)这3个bit,说白了就是给报文贴了个「优先级标签」。0最低,7最高。但具体怎么用,IEEE 802.1Q有推荐映射,不过车载领域有自己的玩法。
| PCP值 | 优先级 | 典型应用(IT网络) | 车载典型应用 |
|---|---|---|---|
| 0 | BE(尽力而为) | 普通数据 | 诊断、OTA下载 |
| 1 | BK(背景) | 批量传输 | 日志上传 |
| 2 | EE(优秀尽力) | — | 娱乐音视频 |
| 3 | CA(关键应用) | 语音 | 语音控制 |
| 4 | VI(视频) | 视频 | 摄像头数据 |
| 5 | VO(语音) | — | 雷达点云 |
| 6 | IC(网间控制) | 网络控制 | 安全关键控制信号 |
| 7 | NC(网络控制) | — | 时间同步、紧急制动 |
我的经验:车载领域PCP的分配其实没有统一标准,各家Tier1都有自己的偏好。我建议你在项目初期就和系统架构师对齐这个映射表,不然后期改起来很痛苦。我曾经在一个项目里,ADAS团队用了PCP=5,座舱团队也用了PCP=5,结果两个高优先级流互相抢占带宽,最后不得不重新规划。
3.3 VLAN在车载网络中的应用场景
好了,理论说完了,咱们看看实际怎么用。车载网络里VLAN主要有三个大用途:
3.3.1 功能隔离
这是最直接的应用。一辆车上有多个功能域:动力域、底盘域、座舱域、智驾域。每个域的数据敏感度不同。你总不希望娱乐系统的视频流把制动控制信号给挤掉吧?
典型的VLAN划分:
- VLAN 10:动力与底盘域(PCP=6,7)
- VLAN 20:智能驾驶域(PCP=5,6)
- VLAN 30:座舱娱乐域(PCP=2,3)
- VLAN 40:诊断与OTA(PCP=0,1)
这样做的好处很明显——即使娱乐域的网络出了故障,也不会影响到制动系统。说白了,这就是「故障隔离」的思维。
3.3.2 优先级保障
光有VLAN隔离还不够,还得有优先级保障。比如智驾域的摄像头数据,每秒几十帧,延迟要求小于1ms。这时候PCP就派上用场了。
我参与过一个项目,智驾域控制器和摄像头之间通过交换机连接。摄像头发出的数据打上PCP=5,交换机会优先转发这些报文。即使链路上有大量诊断数据在传输,摄像头数据也能「插队」通过。
注意:PCP只是优先级标记,真正要保障带宽和延迟,还得配合QoS队列调度算法(比如严格优先级SP、加权轮询WRR)。VLAN+PCP只是「打标签」,交换机怎么处理这些标签,那是另一回事。别搞混了。
3.3.3 多网段共存
现在的车载网络架构越来越复杂,一个物理端口上可能同时跑着多个逻辑网络。比如一个域控制器,既要和摄像头通信(VLAN 20),又要和座舱交互(VLAN 30),还要接收诊断指令(VLAN 40)。
没有VLAN的话,你得给每个网络配独立的物理接口。有了VLAN,一个端口就够了。这就是Trunk口的概念——一个端口上可以透传多个VLAN的流量。
# 交换机端口配置示例(思科风格)
interface GigabitEthernet0/1
switchport mode trunk
switchport trunk allowed vlan 10,20,30,40
!
嗯,这里要注意:车载交换机通常不支持这么复杂的配置,但原理是一样的。很多车载交换芯片(比如Marvell、Broadcom的方案)都支持VLAN成员集和端口VLAN ID(PVID)的配置。
3.4 避坑指南
最后分享几个我踩过的坑:
- VLAN ID别乱用:我曾经在一个项目里,两个团队各自用了VLAN 100,结果交换机一配,流量全乱了。后来我们统一了VLAN规划表,每个域分配一个范围。
- PCP和优先级队列要对应:光打PCP标签没用,交换机的队列映射必须配好。我见过有人PCP打了7,但交换机把7映射到了最低优先级队列,等于白干。
- 注意VLAN标签的MTU影响:加了VLAN标签后,帧头多了4个字节。如果原始报文是1518字节,加上标签就变成1522字节。有些老旧设备不支持巨帧,会直接丢弃。车载环境里这个问题不多见,但如果你用AVB/TSN流,还是要注意一下。
好了,VLAN这部分就聊到这儿。下一节咱们讲QoS队列调度,到时候会结合VLAN的PCP一起说,你会发现这两个东西是天生一对。