3、DoIP网络架构:物理层与数据链路层、网络层与传输层、DoIP实体与网关、DoIP节点类型与角色

好,我们直接进入正题。DoIP 这个名字听起来挺唬人,但拆开看,它就是「诊断 over IP」。说白了,就是把传统的 CAN 诊断报文,塞进以太网的帧里发出去。那这中间到底怎么塞的?每一层干了什么?我结合自己踩过的坑,跟你捋一遍。

3.1 物理层与数据链路层

先看最底下两层。DoIP 的物理层,现在主流用的是 100BASE-TX 或 1000BASE-T。也就是咱们常见的百兆或千兆以太网。我记得最早做项目时,还有人纠结用 10M 的,后来发现根本跑不动诊断刷写的数据量。

数据链路层呢,就是标准的以太网 MAC 层。这里有个关键点——DoIP 要求支持全双工通信。为什么?因为诊断请求和响应是并发的,半双工会导致冲突重传,延迟就上去了。我在实验室测过,半双工下刷一个 64MB 的固件,时间能差出 30%。

物理层关键参数:

  • 传输速率:100Mbps / 1Gbps
  • 连接器:RJ45(车规级需用 X2e 或 H-MTD)
  • 线缆:STP(屏蔽双绞线),长度不超过 15 米
  • 供电:PoDL(数据线供电)可选

你想想看,车里的电磁环境多恶劣。我有个客户,第一次装车后 DoIP 老是断连,查了半天发现是线束没做屏蔽,发动机点火瞬间的 EMI 直接把链路打掉了。后来换了屏蔽双绞线,问题解决。所以物理层别省,省了就是给自己挖坑。

3.2 网络层与传输层

再往上走,网络层用的是 IPv4 或 IPv6。DoIP 规范里明确说了,必须支持 IPv4,IPv6 可选。我个人习惯,能用 IPv4 就用 IPv4,因为工具链成熟,抓包方便。IPv6 在车里目前还没什么刚需。

传输层呢,用的是 TCP 和 UDP。这里有个分工:

  • TCP:用于诊断消息的可靠传输。比如 UDS 请求/响应、刷写数据,必须用 TCP。因为丢一个包,诊断可能就失败了。
  • UDP:用于发现和公告。比如 DoIP 实体上线时发的 Vehicle Announcement 消息,就是用 UDP 广播。不需要确认,丢了就丢了,反正会重发。

我记得有一次,测试时发现诊断会话老是超时。抓包一看,TCP 的窗口大小设得太小,导致吞吐量上不去。后来把 TCP 接收窗口调到 64KB,刷写速度直接翻倍。嗯,这里要注意,TCP 参数调优在 DoIP 里很重要,别用默认值。

端口号分配:

协议端口用途
UDP13400DoIP 发现/公告
TCP13400DoIP 诊断数据

所有 DoIP 通信都走 13400 端口,别搞混了。

3.3 DoIP 实体与网关

DoIP 实体,说白了就是车里支持 DoIP 的那个节点。它可以是单独的网关,也可以是集成在域控制器里的一个软件模块。我见过最典型的架构,是一个中央网关,上面跑着 DoIP 协议栈,下面挂着 CAN、LIN、FlexRay 总线。

网关的作用是什么?就是做协议转换。DoIP 实体收到以太网上的诊断请求,拆包后转成 CAN 报文,发到目标 ECU。反过来也一样。这个过程中,网关要维护一个路由表,知道哪个诊断地址对应哪条总线。

我曾经踩过一个坑:

网关的路由表配置错了,导致诊断请求发到了错误的 CAN 总线上。结果目标 ECU 没响应,超时后工具报了「无响应」。查了两天才发现,是路由表里把 0x01 和 0x02 的映射写反了。所以,路由表一定要 double check。

DoIP 实体还有一个重要功能——连接管理。它要维护多个 TCP 连接,每个连接对应一个诊断会话。规范里说,一个 DoIP 实体最多支持 4 个并发 TCP 连接。为什么是 4 个?我猜是考虑到实际场景中,同时诊断的 ECU 数量有限。但我在项目中遇到过,有些工具会同时开 3 个连接,一个刷写、一个读故障码、一个监控数据。所以 4 个是够用的。

3.4 DoIP 节点类型与角色

最后,我们聊聊节点类型。DoIP 规范里定义了两种角色:

  1. DoIP 节点(DoIP Node):就是支持 DoIP 协议的 ECU。它可以直接响应诊断请求,也可以作为网关转发。
  2. DoIP 边缘节点(DoIP Edge Node):这个角色比较特殊。它本身不处理诊断,只是把 DoIP 报文转成其他总线协议。说白了,就是一个协议转换器。

在实际项目中,我更喜欢把节点分成三类:

类型角色典型设备
主动节点能主动发起诊断请求诊断仪、Tester
被动节点只能响应诊断请求普通 ECU
网关节点转发诊断请求到其他总线中央网关

你想想看,诊断仪是主动节点,它发请求。ECU 是被动节点,它只能回响应。网关呢,夹在中间,既要听诊断仪的,又要转给 ECU。这个角色划分清楚了,后面讲路由激活和诊断地址分配时,你就不会晕。

节点角色决定了行为:

  • 主动节点:发送 Vehicle Identification Request,等待响应
  • 被动节点:发送 Vehicle Announcement,宣告自己在线
  • 网关节点:维护路由表,转发诊断消息

嗯,这一章的内容就这些。物理层别省线缆,网络层调好 TCP 参数,网关层配好路由表,节点角色搞清楚。这几条做到了,DoIP 网络架构这块基本就稳了。下一章我们讲 DoIP 的通信流程,包括连接建立、路由激活、诊断消息交换,那才是真正跑起来的部分。