2. 车载网络与诊断通信基础

各位同学,今天我们聊聊DoIP的根基——物理层和数据链路层。说白了,就是诊断报文在车上到底是怎么“跑”起来的。

很多人一上来就抓DoIP的应用层逻辑,结果在实车上抓包发现收不到响应,或者报文乱飞。我当年第一次调DoIP时也踩过这个坑——焊好线、配好IP,ECU就是不理我。后来才发现,物理层根本没对上。

所以这一章,我们把底层的几个关键点掰开揉碎。你搞懂了这些,后面调协议栈会顺手很多。

2.1 车载以太网物理层:100BASE-T1

先问个问题:为什么车上不用我们办公室那种RJ45以太网?

原因很简单——车上的环境太恶劣了。电磁干扰大、温度范围宽、线束重量和成本都有严格限制。普通以太网用的两对差分线(四根线),在车上太奢侈了。

100BASE-T1 就是为此而生的。它只用一对非屏蔽双绞线(UTP),就能跑100Mbps全双工。你想想看,一对线,收发同时进行,靠的是回波抵消技术——跟电话线一个原理。

核心参数速览:

  • 速率:100 Mbps(全双工)
  • 传输介质:1对非屏蔽双绞线(UTP)
  • 最大距离:15米(车内足够)
  • 编码方式:PAM3(3级脉冲幅度调制)
  • 标准:IEEE 802.3bw(原BroadR-Reach)

我在项目里遇到过一个问题:用普通示波器看100BASE-T1信号,根本看不出有效波形。为什么?因为PAM3编码不是简单的0/1电平,而是-1V、0V、+1V三电平。普通示波器触发条件设不好,波形就是一团乱麻。后来换了带车载以太网解码功能的示波器才搞定。

实战小技巧: 调试100BASE-T1物理层时,别只看波形。先检查链路状态——很多PHY芯片会提供寄存器状态位,比如Link Status、Signal Quality。我习惯先读这些寄存器,确认物理层已经握手成功,再往上查协议问题。

2.2 MAC地址与VLAN:数据链路层的两个关键概念

物理层搞定之后,数据链路层就开始干活了。这里有两个东西你必须搞清楚:MAC地址 和 VLAN。

2.2.1 MAC地址:设备的“身份证”

每个以太网设备都有一个全球唯一的MAC地址,48位,通常写成六组十六进制数,比如 02:1A:3B:4C:5D:6E。

在DoIP场景下,MAC地址的作用很简单:让交换机知道报文该往哪个端口送。但这里有个坑——DoIP网关和诊断仪之间的MAC地址必须能互通,否则二层就断了。

我记得有一次,客户说诊断仪连不上ECU,我远程一看抓包文件,发现诊断仪发出的ARP请求没人回应。查了半天,原来是诊断仪的MAC地址被交换机的MAC地址过滤表拦住了。那台交换机配置了端口安全,只允许特定MAC地址通过。

避坑指南: 在实车环境中,很多网关和交换机启用了MAC地址过滤或端口安全策略。如果你用新的诊断仪(MAC地址不在白名单里),物理层虽然能连上,但数据链路层直接把你挡在门外。我曾经因为这个在客户现场折腾了一下午——最后发现是IT部门没把新设备的MAC加进去。

2.2.2 VLAN:把网络“切”开

VLAN(虚拟局域网)的作用,就是把一个物理网络切成多个逻辑网络。为什么要这么做?

你想想看,车上跑的不只是诊断流量——还有音视频、控制指令、OTA升级包。如果所有流量都在一个广播域里,诊断报文可能会被其他业务干扰,甚至引发安全风险。

DoIP规范里明确建议:诊断流量应该放在独立的VLAN中。通常会用VLAN ID 1或VLAN ID 100,具体看OEM的定义。

VLAN ID 典型用途 优先级(PCP)
1 诊断通信(DoIP) 7(最高)
100 控制指令(如SOME/IP) 6
200 音视频流 4
300 OTA升级 5

这里要注意:诊断仪必须支持VLAN标记,否则它发出的报文会被交换机当成未标记帧,可能被丢弃或转发到错误的VLAN。我见过不少诊断仪默认不带VLAN功能,结果连上车载网络后完全不通。

2.3 DoIP报文封装:从诊断数据到以太网帧

好,现在物理层通了,VLAN也配好了。接下来最关键的一步:诊断数据怎么塞进以太网帧里?

DoIP的报文封装,说白了就是一层一层往上套。我画了张图,你看完就明白了。

DoIP 报文封装结构 应用层:UDS诊断数据(如 0x22 F1 90 读取VIN) 长度:可变(通常 4~4095 字节) DoIP 头部:协议版本 + 负载类型 + 负载长度 长度:8 字节(固定) 传输层:TCP/UDP 头部(源端口 + 目的端口 + 校验和) TCP头部 20 字节 / UDP头部 8 字节 网络层:IPv4/IPv6 头部(源IP + 目的IP + 协议类型) IPv4头部 20 字节(无选项) 数据链路层:以太网帧头(目标MAC + 源MAC + VLAN Tag + 类型) 以太网帧头 14 字节(无VLAN)/ 18 字节(有VLAN)

从上往下看,流程是这样的:

  1. UDS诊断数据(比如读取VIN的请求 0x22 F1 90)先被封装成DoIP报文——加上8字节的DoIP头部,里面包含协议版本、负载类型、负载长度等信息。
  2. 然后交给传输层:DoIP通常走TCP(端口13400),用于可靠传输;路由激活等控制消息也可以走UDP。
  3. 再往下是网络层:IPv4或IPv6头部,指定源IP和目的IP。
  4. 最后是数据链路层:加上以太网帧头,包括目标MAC、源MAC,以及可选的VLAN Tag。

最终在物理层上传输的,就是一串完整的以太网帧。

关键点: DoIP头部只有8字节,非常轻量。它的核心字段包括:

  • 协议版本(1字节):当前为0x02(ISO 13400-2:2012)
  • 负载类型(1字节):标识报文类型,如0x01(路由激活)、0x02(诊断消息)
  • 负载长度(4字节):后面跟着的UDS数据长度

我刚开始学DoIP时,总搞不清这些头部到底怎么拼。后来我养成了一个习惯:用Wireshark抓一个完整的DoIP会话,然后逐层展开看。你亲眼看到UDS数据被一层层包起来,比看十遍文档都管用。

实战建议: 如果你在调试DoIP通信,先确认数据链路层能不能通。最简单的办法:在诊断仪上ping一下ECU的IP地址。如果ping不通,别急着查DoIP协议栈,先回头查物理层和VLAN配置。我见过太多人一上来就抓应用层报文,结果发现底层根本没通——白白浪费半天时间。

2.4 本章小结

这一章我们聊了三件事:

  • 100BASE-T1:一对线跑100Mbps,车上专用,别拿RJ45的思路去套。
  • MAC地址与VLAN:MAC是二层身份证,VLAN是把网络切开的刀。诊断流量最好单独放一个VLAN。
  • DoIP报文封装:从UDS数据到以太网帧,一共四层。记住DoIP头部只有8字节,很轻量。