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的报文封装,说白了就是一层一层往上套。我画了张图,你看完就明白了。
从上往下看,流程是这样的:
- UDS诊断数据(比如读取VIN的请求
0x22 F1 90)先被封装成DoIP报文——加上8字节的DoIP头部,里面包含协议版本、负载类型、负载长度等信息。 - 然后交给传输层:DoIP通常走TCP(端口13400),用于可靠传输;路由激活等控制消息也可以走UDP。
- 再往下是网络层:IPv4或IPv6头部,指定源IP和目的IP。
- 最后是数据链路层:加上以太网帧头,包括目标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字节,很轻量。