2、物理层与数据链路层:DoIP物理层要求(100Base-TX/1000Base-T)、以太网帧结构、MAC地址与VLAN
好,咱们正式开始聊 DoIP 的底层。很多朋友一上来就盯着 DoIP 的协议栈,觉得物理层和数据链路层太“低级”,没什么好学的。我刚开始接触车载以太网时也这么想,结果呢?被一个接头的接触不良折腾了整整两天。说白了,上层协议再牛,也得靠物理层把比特流发出去。这一层要是出问题,你抓包分析得再漂亮也是白搭。
2.1 DoIP 对物理层的要求
DoIP 跑在标准以太网上,所以物理层必须符合 IEEE 802.3 标准。目前车载领域主流是两种:100Base-TX 和 1000Base-T。嗯,这里要注意,1000Base-T 在车上用得越来越多,因为诊断数据量越来越大,尤其是刷写软件时,百兆带宽真的不够用。
| 特性 | 100Base-TX | 1000Base-T |
|---|---|---|
| 速率 | 100 Mbps | 1000 Mbps |
| 编码方式 | 4B/5B + MLT-3 | 4D-PAM5 |
| 线对数量 | 2 对(4 线) | 4 对(8 线) |
| 最大距离 | 100 米 | 100 米 |
| 车载应用 | 传统诊断、低速刷写 | 高速刷写、大数据传输 |
我个人习惯在项目初期就确认好物理层选型。为什么?因为线束成本差不少。100Base-TX 只需要两对线,而 1000Base-T 需要四对。我曾经在一个项目中,客户坚持用百兆,结果后期刷写时间太长,又改回千兆,线束和连接器全得换,那叫一个折腾。
2.2 以太网帧结构
搞 DoIP 抓包分析,看不懂以太网帧结构可不行。你想想看,抓包工具里那一堆十六进制数据,其实就是帧的各个字段。标准以太网帧长这样:
| 前导码 (7B) | 帧起始定界符 (1B) | 目标MAC (6B) | 源MAC (6B) | 类型/长度 (2B) | 数据 (46-1500B) | FCS (4B) |
这里我重点说几个关键点:
- 前导码和帧起始定界符:这 8 个字节是物理层用的,抓包时通常看不到。它们的作用是让接收端同步时钟。
- 目标MAC和源MAC:各 6 个字节。DoIP 通信中,诊断仪和目标 ECU 就是靠这个找到对方的。
- 类型/长度字段:如果值大于 0x0600,表示上层协议类型。DoIP 用的是 0x0800(IPv4)或 0x86DD(IPv6)。
- 数据字段:最小 46 字节,最大 1500 字节。DoIP 报文就封装在这里面。
- FCS:4 字节的 CRC 校验。我见过有人抓包发现 CRC 错误,结果是网卡硬件故障。
2.3 MAC 地址
MAC 地址是数据链路层的核心。每个以太网设备都有一个全球唯一的 48 位 MAC 地址。DoIP 通信中,诊断仪和目标 ECU 通过 MAC 地址进行二层寻址。
MAC 地址的结构:
| 厂商代码 (OUI, 3B) | 设备标识 (3B) |
| 00:1E:67 | :A1:B2:C3 |
前 3 个字节是厂商代码,由 IEEE 分配。后 3 个字节是厂商自己分配的。我记得有一次,客户说他们的 ECU 通信不稳定,我一看抓包,发现两个 ECU 的 MAC 地址居然一样!原来是供应商烧录时搞错了。这种问题排查起来特别费劲。
DoIP 中还有几个特殊的 MAC 地址:
- 广播地址:FF:FF:FF:FF:FF:FF。DoIP 的车辆发现请求就是用这个地址发送的。
- 多播地址:01:00:5E:xx:xx:xx。DoIP 的某些特定功能会用到多播。
2.4 VLAN
VLAN 在车载以太网中越来越常见。为什么?因为车上网络越来越复杂,一个物理网络要承载诊断、娱乐、控制等多种流量。VLAN 可以把它们隔离开。
VLAN 的帧结构:
| 目标MAC (6B) | 源MAC (6B) | VLAN标签 (4B) | 类型/长度 (2B) | 数据 | FCS (4B) |
VLAN 标签的格式:
| TPID (2B, 0x8100) | PCP (3bit) | DEI (1bit) | VID (12bit) |
- TPID:固定为 0x8100,表示这是一个 VLAN 帧。
- PCP:优先级,0-7。DoIP 诊断数据通常设高优先级。
- VID:VLAN ID,0-4095。0 和 4095 保留。
我个人建议,在 DoIP 项目中,给诊断流量单独分配一个 VLAN。比如 VID=100。这样即使娱乐系统在疯狂下载数据,也不会影响诊断通信。我曾经在一个项目中,没做 VLAN 隔离,结果刷写时被娱乐系统的广播风暴干扰,刷写成功率不到 50%。加了 VLAN 后,问题迎刃而解。
好了,物理层和数据链路层就聊这么多。下一章我们进入网络层,看看 IP 地址和路由是怎么在 DoIP 中工作的。记住,底层扎实了,上层分析才能得心应手。