3、DoIP网络层协议:IPv6 vs IPv4的选择、UDP与TCP的端口分配、DoIP实体地址与逻辑地址

好,咱们进入DoIP协议栈里最核心的一层——网络层。说白了,就是车上的诊断仪和ECU之间,到底怎么把数据包发出去、怎么找到对方。

我这些年调试DoIP系统,踩过最多的坑就在这一层。地址配错了、端口搞混了、IPv4和IPv6没对齐……嗯,今天咱们一个一个捋清楚。

3.1 IPv6 vs IPv4:到底选哪个?

先回答一个最基础的问题:DoIP到底用IPv4还是IPv6?

答案是——两者都支持。ISO 13400标准里明确说了,DoIP可以在IPv4或IPv6上运行。但实际项目中,我个人强烈建议:能用IPv6就别用IPv4

为什么?我给你三个理由:

  1. 地址空间:IPv4只有32位,车上一堆ECU,万一地址冲突就麻烦了。IPv6是128位,每个ECU都能分到全球唯一的地址。
  2. 自动配置:IPv6有SLAAC(无状态地址自动配置),ECU插上网线就能自己拿到地址。IPv4还得靠DHCP,多一步配置就多一个故障点。
  3. 安全性:IPv6原生支持IPsec,诊断数据在网络上传输时更安全。虽然DoIP本身也有安全机制,但底层多一层防护总不是坏事。

重要提醒:虽然标准支持双栈,但实际项目中,我建议你优先实现IPv6。如果客户非要兼容IPv4,再考虑双栈方案。别一开始就想着两个都支持,调试起来会疯的。

不过话说回来,IPv4也不是一无是处。我在一个老项目里遇到过,测试设备只支持IPv4,结果IPv6的ECU死活连不上。后来加了个IPv4兼容模式才搞定。所以,如果你的诊断工具或测试环境老旧,IPv4还是得留着

3.2 UDP与TCP的端口分配

DoIP用了两个传输层协议:UDP和TCP。它们各司其职,千万别搞混。

UDP端口:13400

UDP主要用于发现和公告。ECU启动后,会通过UDP广播自己的存在。诊断仪也是通过UDP广播来发现网络上有哪些ECU。

标准里规定:UDP端口固定为13400。这个端口是IANA分配给DoIP的,别乱改。

我记得有一次,客户说他们的诊断仪找不到ECU。我查了半天,发现他们把UDP端口配成了13401。嗯,改回来就好了。

TCP端口:13400

TCP用于实际的诊断通信。一旦诊断仪和ECU通过UDP建立了联系,后续的所有诊断请求和响应都走TCP。

TCP端口也是13400。但注意:TCP连接是点对点的,一个诊断仪只能和一个ECU建立一个TCP连接。如果你想同时诊断多个ECU,就得开多个TCP连接。

小技巧:在实际项目中,我习惯把UDP和TCP的端口都配成13400,这样防火墙规则好写。但如果你有特殊需求(比如多个诊断仪同时工作),可以考虑用不同的端口范围。不过,别偏离标准太远。

端口分配总结

协议 端口 用途 方向
UDP 13400 车辆发现、ECU公告 广播/组播
TCP 13400 诊断请求/响应 点对点

3.3 DoIP实体地址与逻辑地址

这是DoIP里最容易让人晕的地方。我刚开始接触时也搞混过,后来才明白:实体地址是物理的,逻辑地址是虚拟的

实体地址(Physical Address)

实体地址就是ECU的网络接口地址。在IPv4里是IP地址,在IPv6里也是IP地址。它唯一标识了一个ECU在物理网络上的位置。

举个例子:一个网关ECU的IPv6地址是fe80::1,这就是它的实体地址。诊断仪通过这个地址才能把数据包发到它手上。

逻辑地址(Logical Address)

逻辑地址是DoIP协议层定义的虚拟地址,用于标识ECU上的某个诊断实体。一个ECU可以有多个逻辑地址,比如一个网关ECU可以同时作为UDS诊断的客户端和服务器。

逻辑地址是16位的,范围从0x0000到0xFFFF。标准里有一些保留值,比如0x0000表示“所有ECU”,0x0E00到0x0EFF是诊断仪的逻辑地址范围。

注意:逻辑地址和实体地址不是一一对应的。一个实体地址(一个ECU)可以拥有多个逻辑地址。反过来,一个逻辑地址也可以映射到多个实体地址(比如广播场景)。

我曾经在一个项目里,把逻辑地址和实体地址搞混了,结果诊断仪发出去的请求,ECU根本不认。后来才发现,逻辑地址配错了。

地址映射关系

在实际通信中,诊断仪需要知道两件事:

  1. 目标ECU的逻辑地址:我要诊断哪个ECU?
  2. 目标ECU的实体地址:这个ECU在网络上怎么找到?

DoIP通过车辆发现流程来解决这个问题。诊断仪先发一个UDP广播,询问“谁有逻辑地址0x0E00?”;ECU收到后,回复自己的实体地址和逻辑地址。这样诊断仪就知道该往哪个IP地址发TCP连接请求了。

嗯,这里要注意:逻辑地址是静态配置的,一般在ECU的软件里写死。实体地址是动态分配的(DHCP或SLAAC)。所以,诊断仪不能假设ECU的IP地址不变,每次连接前都得先做发现。

3.4 避坑指南

最后,分享几个我踩过的坑:

  • 端口冲突:如果车上还有其他服务用了13400端口,DoIP就起不来。我建议在ECU启动时做端口检测,如果被占用就报错。
  • IPv6地址太长:有些老旧的诊断工具不支持IPv6地址的完整格式。我遇到过工具只认::1,不认fe80::1。解决办法是让ECU同时支持IPv4兼容地址。
  • 逻辑地址重复:如果两个ECU配了相同的逻辑地址,诊断仪就不知道该连谁。我建议在整车设计阶段就统一规划逻辑地址分配表。
  • UDP广播被防火墙拦截:有些车载网络会限制UDP广播。我建议用组播(Multicast)代替广播,组播地址是ff02::1(IPv6)或224.0.0.1(IPv4)。

好了,这一章的内容就这些。下一章咱们聊聊DoIP的报文格式和路由激活流程,那才是真正动手的地方。