二、DoIP物理层与链路层:从信号到帧的硬功夫
各位工程师,咱们直接进入正题。DoIP 诊断要想跑得稳,物理层和链路层是地基。这一层要是出问题,上层协议栈再牛也白搭。我个人习惯,做 DoIP 项目时,最先确认的就是物理层选型和 MAC 层的配置。今天咱们就把这块硬骨头啃下来。
2.1 以太网物理层基础:100BASE-T1 与 1000BASE-T1
车载以太网和咱们办公室用的以太网不一样。普通以太网用 RJ45 接口,四对差分线。车载以太网呢?一对差分线就够了。为什么?为了减重、降成本、抗干扰。
目前主流的车载物理层标准有两个:
| 特性 | 100BASE-T1 | 1000BASE-T1 |
|---|---|---|
| 速率 | 100 Mbps | 1000 Mbps (1 Gbps) |
| 传输介质 | 单对非屏蔽双绞线 | 单对非屏蔽双绞线 |
| 最大距离 | 15 米 | 15 米 |
| 编码方式 | PAM3 | PAM4 |
| 典型应用 | 诊断、控制、传感器 | 摄像头、ADAS、高速数据 |
| 标准 | IEEE 802.3bw | IEEE 802.3bp |
这里有个关键点:100BASE-T1 和 1000BASE-T1 的物理层完全不兼容。接口、编码、信号幅度都不一样。你想想看,一个 100M 的 DoIP 节点,插到 1G 的交换机上,物理层就握手失败。我在项目中遇到过,有人把 100BASE-T1 的节点接到 1000BASE-T1 的端口上,结果 Link 死活起不来。查了半天,最后发现是物理层不匹配。
核心结论:DoIP 诊断通常使用 100BASE-T1 就足够了。诊断数据量不大,100M 带宽完全够用。除非你要做刷写,或者传输大量日志,才需要考虑 1000BASE-T1。
2.2 DoIP 对 MAC 层的要求
物理层搞定信号,MAC 层负责把数据封装成帧。DoIP 对 MAC 层有明确要求,不是随便一个以太网 MAC 都能用。
咱们先看 DoIP 的 MAC 帧格式:
+----------------+----------------+----------------+----------------+
| 目的MAC地址(6B) | 源MAC地址(6B) | EtherType(2B) | 数据(46-1500B) |
+----------------+----------------+----------------+----------------+
| 0xFFFFFFFFFFF | ECU MAC | 0x0800 (IPv4) | DoIP 报文 |
| (广播/单播) | | 0x86DD (IPv6) | |
+----------------+----------------+----------------+----------------+
DoIP 规范(ISO 13400-2)对 MAC 层提了几个硬性要求:
- EtherType 必须支持 0x0800 和 0x86DD:分别对应 IPv4 和 IPv6。DoIP 本身不直接绑定 IP 版本,但 ECU 必须能处理这两种类型。
- MAC 地址必须唯一:每个 DoIP 实体必须有一个全球唯一的 MAC 地址。不能重复,不能乱配。我曾经见过一个项目,两台 ECU 的 MAC 地址写成了同一个值,结果网络上一片混乱,诊断仪根本找不到目标。
- 支持广播和单播:DoIP 的车辆发现阶段(Vehicle Discovery)需要广播 MAC 地址。诊断通信阶段使用单播。
- 帧长度支持 64 字节到 1522 字节:标准以太网帧最小 64 字节,最大 1518 字节。DoIP 建议支持到 1522 字节(含 VLAN 标签)。
避坑指南:我曾经调试过一个 DoIP 节点,发现诊断仪发送的请求 ECU 收不到。抓包一看,ECU 的 MAC 过滤器把广播帧给丢了。很多车载 MAC 控制器默认只接收单播帧,需要手动配置接收广播帧。这个坑,我踩过。
2.3 VLAN 与优先级配置
车载网络里不止 DoIP 一种流量。还有 CAN 网关、音视频、控制信号等等。怎么保证 DoIP 诊断报文不被其他流量挤掉?答案就是 VLAN 和优先级。
VLAN(虚拟局域网)在 DoIP 里的作用有两个:
- 隔离流量:把 DoIP 诊断流量和其他业务流量隔开。比如诊断 VLAN 和娱乐 VLAN 分开,互不干扰。
- 优先级标记:通过 802.1Q 标签中的 PCP(Priority Code Point)字段,给 DoIP 报文打上高优先级。
802.1Q 帧结构如下:
+----------------+----------------+----------------+----------------+----------------+
| 目的MAC地址(6B) | 源MAC地址(6B) | 802.1Q标签(4B) | EtherType(2B) | 数据(46-1500B) |
+----------------+----------------+----------------+----------------+----------------+
| | | TPID(2B) | TCI(2B) | | |
| | | 0x8100 | PCP(3b) | | |
| | | | DEI(1b) | | |
| | | | VID(12b)| | |
+----------------+----------------+----------------+----------------+----------------+
PCP 优先级从 0 到 7,数值越大优先级越高。DoIP 诊断报文建议使用 PCP = 5 或 6。为什么?
- PCP 7:网络控制(如路由协议)
- PCP 6:网络控制(如诊断)
- PCP 5:关键业务(如 DoIP 诊断)
- PCP 4:视频
- PCP 3:音频
- PCP 2-0:尽力而为
我个人习惯,DoIP 诊断报文打 PCP = 5。既保证优先级够高,又不会干扰网络控制报文。你想想看,如果诊断报文抢了路由协议的优先级,整个网络都可能崩溃。
注意:VLAN 配置必须在 ECU 和交换机两端同时做。ECU 发送带 VLAN 标签的帧,交换机必须能识别并转发。如果交换机配置了 VLAN 过滤,ECU 没打标签,帧就会被丢弃。反过来也一样。我曾经排查过一个故障,ECU 打了 VLAN 10 的标签,但交换机端口配置的是 VLAN 20,结果诊断仪死活连不上。
2.4 知识体系总览
下面这张图把物理层和链路层的核心关系画出来了。你可以对照着看,心里有个全局概念。
2.5 常见故障与定位思路
物理层和链路层的故障,表现往往很相似:诊断仪连不上 ECU,或者连接不稳定。怎么快速定位?我总结了一个排查顺序:
- 看 Link 灯:如果 ECU 和交换机都有 Link 指示灯,先看灯亮不亮。不亮,物理层有问题。检查线缆、接口、物理层芯片供电。
- 抓 MAC 层报文:用抓包工具(比如 Wireshark)看 ECU 是否发出广播帧。如果抓不到任何帧,MAC 层可能没初始化。
- 检查 VLAN 配置:抓到的帧有没有 802.1Q 标签?标签里的 VID 和交换机配置是否一致?PCP 值对不对?
- 确认 MAC 地址:ECU 的 MAC 地址是否和诊断仪期望的一致?有没有冲突?
一个小技巧:我习惯在 ECU 启动时,先发一个不带 VLAN 标签的广播帧。如果诊断仪能收到,说明物理层和 MAC 层基本正常。然后再打上 VLAN 标签测试。这样一步步缩小范围,比直接查 VLAN 配置快得多。
嗯,物理层和链路层的内容就这些。说白了,就是选对物理层、配好 MAC、打好 VLAN 标签。这三件事做好了,DoIP 诊断通信的底层就稳了。下一层咱们再聊网络层和传输层,那是 DoIP 报文真正开始跑起来的地方。