3、DoIP物理层与数据链路层:100Base-TX/1000Base-T以太网物理层、MAC地址与VLAN、以太网帧格式

好,咱们今天聊聊DoIP协议栈最底层的那些事儿——物理层和数据链路层。说实话,很多做UDS诊断的朋友,一提到以太网底层就头疼,觉得那是网络工程师的活。但我个人觉得,搞DoIP开发,不懂点物理层和MAC层,出了问题你连从哪儿查起都不知道。

我刚开始做DoIP项目时,就吃过这个亏。当时一台设备死活连不上诊断仪,我拿着协议栈代码翻来覆去查了两天,最后发现是网线接口的差分信号线序焊反了。嗯,从那以后,我再也不敢跳过物理层了。

3.1 100Base-TX与1000Base-T物理层

DoIP标准里明确说了,物理层必须用100Base-TX或1000Base-T。说白了,就是咱们车上用的以太网,跟办公室电脑插网线那套东西基本一样。

100Base-TX:也叫快速以太网,速率100Mbps。它用两对双绞线,一对发一对收。你想想看,这个速率对于UDS诊断来说其实绰绰有余了。我见过不少量产项目,到现在还在用100Base-TX,稳定、成熟、成本低。

1000Base-T:千兆以太网,速率1Gbps。它用了四对双绞线,每对同时收发。DoIP标准里把它列为可选,但如果你要做高带宽的刷写(比如OTA升级),我建议你直接上千兆。为什么?因为一个几百兆的固件包,用100Mbps传,光传输时间就要好几分钟,再加上诊断交互的握手开销,用户体验很差。

关键参数对比

参数 100Base-TX 1000Base-T
速率 100 Mbps 1000 Mbps
线对数 2对 4对
最大距离 100米 100米
编码方式 4B/5B + MLT-3 4D-PAM5
DoIP支持 强制 可选

这里有个坑,我提醒一下。车上的以太网线束跟办公室不一样,它要过车规级测试,比如温度、振动、EMC。我曾经见过一个项目,用了普通商用网线,结果在-40℃低温测试时,物理层直接掉线。所以,选型时一定要用车规级的以太网PHY芯片和连接器。

3.2 MAC地址与VLAN

聊完物理层,咱们往上走一层,到数据链路层的MAC子层。

MAC地址,每个以太网设备都有一个全球唯一的48位地址。DoIP标准里规定,每个DoIP实体必须有一个唯一的MAC地址。你可能会问:那如果车上多个ECU都支持DoIP怎么办?答案是每个ECU的以太网接口都得有自己的MAC地址。

我记得有一次调试,发现诊断仪发出去的DoIP请求,车上的ECU就是不响应。抓包一看,发现两个ECU的MAC地址配成了一样的。你想想看,交换机都不知道该把数据帧转发给谁。所以,量产时一定要做好MAC地址的烧录和管理,别偷懒用默认值。

VLAN(虚拟局域网),这个在DoIP里是个可选功能。VLAN的作用,说白了就是把一个物理网络切成多个逻辑网络。为什么要这么做?因为车上的网络不止跑诊断流量,还有音视频、控制信号等等。用VLAN可以把诊断流量隔离开,避免互相干扰。

DoIP标准里定义了一个特殊的VLAN ID——VLAN ID 0,用于DoIP的初始化和发现阶段。当DoIP实体刚上电时,它还不知道自己属于哪个VLAN,所以先用VLAN ID 0来发送广播消息。等它通过DHCP或其他方式获取到配置后,再切换到正式的VLAN。

个人经验:VLAN配置这块,我建议你在开发阶段先别碰。先把不带VLAN的DoIP调通,再逐步加上VLAN支持。否则,你很难分清问题是出在协议栈还是VLAN配置上。

3.3 以太网帧格式

好了,咱们来看看最核心的东西——以太网帧。DoIP的数据,最终都要封装在以太网帧里传输。

标准的以太网帧格式长这样:

+----------------+----------------+----------------+----------------+----------------+----------------+
| 前导码(7B)     | 帧起始定界符(1B)| 目标MAC(6B)    | 源MAC(6B)      | 类型/长度(2B)  | 数据(46-1500B) |
+----------------+----------------+----------------+----------------+----------------+----------------+
|                                                                                               |
+----------------+----------------+----------------+--------------------------------------------+
| FCS(4B)        |                                                                               |
+----------------+                                                                               |

这里有几个关键点,我重点说一下:

  • 前导码和帧起始定界符:这是物理层用的,咱们软件工程师一般不用管。但你要知道,抓包工具(比如Wireshark)通常会把这两部分去掉再显示。
  • 目标MAC和源MAC:6字节,48位。DoIP的广播消息,目标MAC是广播地址 FF:FF:FF:FF:FF:FF。
  • 类型/长度字段:如果值大于0x0600(1536),表示上层协议类型。DoIP用的以太类型是0x0800(IPv4)或0x86DD(IPv6)。如果值小于等于0x05DC(1500),则表示数据长度,这是IEEE 802.3的格式。实际项目中,几乎都用以太类型的方式。
  • 数据字段:46到1500字节。DoIP的报文就放在这里。如果数据不足46字节,要填充到46字节。
  • FCS:4字节的帧校验序列,用CRC32算法。网卡硬件会自动计算和校验,软件不用操心。

避坑指南:我曾经遇到过一个奇怪的问题,DoIP报文偶尔会丢包。抓包发现,有些以太网帧的FCS校验错误。查了半天,原来是PHY芯片的时钟抖动太大,导致数据采样出错。所以,如果你的DoIP通信不稳定,别光查协议栈,先看看物理层的信号质量。

对于DoIP来说,以太网帧的数据字段里,封装的是IP包。IP包里再封装TCP或UDP报文。DoIP的报文,就放在TCP或UDP的载荷里。这个层次关系,你心里要有数。

举个例子,一个DoIP诊断请求的完整封装过程:

  1. 应用层:UDS诊断请求(比如读取DTC)
  2. DoIP层:加上DoIP头部(协议版本、类型、长度等)
  3. 传输层:封装成TCP或UDP报文
  4. 网络层:封装成IP包
  5. 数据链路层:封装成以太网帧
  6. 物理层:转换成电信号发送出去

你想想看,每一层都加了自己的头部,所以一个简单的UDS请求,最终在线上传输的字节数会膨胀不少。做DoIP开发时,一定要考虑这个开销,特别是做刷写功能时,要算好带宽和传输时间。

3.4 小结

这一章的内容,说白了就是DoIP通信的「地基」。物理层决定了信号能不能传过去,MAC地址决定了数据该发给谁,VLAN决定了流量怎么隔离,以太网帧格式决定了数据怎么打包。

我个人建议,你在开始写DoIP协议栈代码之前,先花点时间把抓包工具用熟。用Wireshark抓一个DoIP的广播请求,看看以太网帧的每个字段长什么样。相信我,这个习惯会让你少走很多弯路。

下一章,咱们会聊IP层和传输层,也就是TCP/UDP在DoIP里的用法。到时候,你会发现,底层的东西搞明白了,上层的东西理解起来就顺理成章了。