1、DoIP协议概述:DoIP协议背景、DoIP协议在汽车网络中的定位、DoIP协议栈架构

1.1 为什么需要DoIP?——协议背景

各位工程师朋友,咱们先聊聊背景。你想想看,传统汽车诊断用的是CAN总线,速度也就500kbps。刷个ECU固件,动辄几兆甚至几十兆的数据量。我早年做项目时,刷一个网关固件要等20分钟,车间里的同事都快睡着了。

为什么会这样?因为CAN总线天生带宽有限。它设计于80年代,初衷是传输控制信号,不是大数据包。随着汽车电子化程度越来越高,ADAS、自动驾驶、OTA升级这些需求冒出来了,CAN总线明显扛不住了。

这时候,DoIP(Diagnostic over Internet Protocol)就登场了。说白了,就是把诊断协议UDS(ISO 14229)跑在以太网上。以太网带宽多大?100Mbps、1000Mbps,甚至更高。刷个固件从20分钟缩短到2分钟,这体验完全不一样。

我记得2016年第一次接触DoIP,当时客户要求新车型必须支持远程诊断。传统CAN诊断根本没法远程搞,因为CAN报文没法直接路由到云端。DoIP基于IP网络,天然支持远程通信。嗯,这个需求直接推动了DoIP的普及。

1.2 DoIP在汽车网络中的定位

DoIP不是孤立存在的。它在整个汽车网络架构中,扮演着「诊断通道」的角色。我习惯把汽车网络分成三层来看:

  • 控制层:CAN、CAN FD、FlexRay,负责实时控制
  • 信息层:以太网,负责大数据传输、OTA、诊断
  • 云端层:T-Box通过4G/5G连接后端服务器

DoIP就位于信息层和云端层的交界处。它一端连接车内以太网,另一端通过TCP/IP协议栈与外部诊断工具或云端平台通信。

核心定位:DoIP是UDS诊断协议在以太网上的「运输工具」。它不改变诊断本身的内容,只改变传输方式。

你可能会问:为什么不用HTTP或者MQTT?其实也可以,但DoIP是汽车行业专门为诊断场景定制的协议。它考虑了诊断的特殊需求,比如:

  • 车辆发现机制(不需要预先知道IP地址)
  • 多个诊断会话的并发管理
  • 诊断数据的安全传输
  • 与现有UDS诊断流程的兼容性

我在项目中遇到过一个问题:某供应商直接用HTTP封装诊断数据,结果发现诊断仪和ECU之间的连接管理非常混乱。后来改回DoIP标准方案,问题迎刃而解。所以,能用标准就别自己造轮子。

1.3 DoIP协议栈架构

DoIP协议栈长什么样?我画个简化的分层图给你看:

+------------------------------------------+
|            UDS 诊断应用层                  |
|  (ISO 14229-1: 诊断服务、子功能、DTC)     |
+------------------------------------------+
|            DoIP 协议层                     |
|  (ISO 13400-2: 车辆发现、路由激活、       |
|   诊断消息封装、连接管理)                  |
+------------------------------------------+
|            TCP/UDP 传输层                  |
|  (TCP: 可靠传输诊断消息)                   |
|  (UDP: 车辆发现、广播消息)                 |
+------------------------------------------+
|            IPv4/IPv6 网络层                |
+------------------------------------------+
|            以太网 MAC/PHY 层               |
+------------------------------------------+

从上往下看,最上层是UDS应用层。这一层你肯定熟悉,就是那些诊断服务:0x10(诊断会话控制)、0x22(读取数据)、0x2E(写入数据)、0x31(例程控制)等等。DoIP不改变这些服务的内容,只负责把它们打包传输。

中间是DoIP协议层,这是核心。它定义了:

  • 车辆发现:通过UDP广播,诊断工具可以找到车上的DoIP节点
  • 路由激活:建立诊断会话前的握手过程
  • 诊断消息封装:把UDS报文包装成DoIP格式
  • 连接管理:处理多个诊断会话、超时、断开等

再往下是TCP/UDP传输层。这里有个关键点:

  • UDP:用于车辆发现和广播消息,不需要建立连接
  • TCP:用于诊断消息的可靠传输,确保数据不丢包、不乱序

个人经验:我建议你在抓包分析时,重点关注TCP端口13400。这是DoIP的默认端口。如果看到这个端口上的数据包,基本可以确定是DoIP流量。

最底层是标准的以太网MAC/PHY层。这里没什么特别的,就是100BASE-T1(单对以太网)或者1000BASE-T1。不过要注意,车载以太网的物理层和普通以太网不太一样,它用的是单对差分线,而不是四对。

1.4 一个典型的DoIP通信流程

光讲理论太枯燥,我结合一个实际场景来说。假设你拿着诊断仪去刷写一个ECU:

  1. 车辆发现:诊断仪发送UDP广播,询问「车上有没有DoIP节点?」
  2. 车辆应答:ECU回复「我在,我的IP是192.168.1.100」
  3. 建立TCP连接:诊断仪向ECU的13400端口发起TCP连接
  4. 路由激活:诊断仪发送路由激活请求,ECU确认
  5. 诊断通信:诊断仪发送UDS请求(比如0x10 03),ECU回复响应
  6. 断开连接:诊断完成,关闭TCP连接

这个流程看起来简单,但每个步骤都有很多细节。比如车辆发现阶段,如果网络中有多个DoIP节点怎么办?路由激活时,如果认证失败怎么办?这些我们后面章节会详细分析。

避坑指南:我曾经遇到过一个坑——诊断仪和ECU之间的TCP连接被防火墙拦截了。因为车载以太网通常有安全网关,不是所有端口都开放。记得检查防火墙规则,确保13400端口是放行的。

1.5 DoIP与其他诊断协议的对比

为了让你更清楚DoIP的定位,我整理了一个对比表:

特性 CAN诊断 DoIP诊断
物理层 CAN总线 以太网
带宽 500kbps 100Mbps+
传输距离 车内(<40m) 可远程(IP网络)
车辆发现 不需要(直接寻址) 需要(UDP广播)
并发会话 有限 支持多个
典型应用 故障诊断 OTA、刷写、远程诊断

看到这个表,你应该明白了。DoIP不是要取代CAN诊断,而是补充。CAN诊断适合实时性要求高的控制类场景,DoIP适合大数据量、远程通信的场景。两者共存,才是现代汽车网络的常态。

1.6 小结

这一章我们聊了DoIP的背景、定位和协议栈架构。核心就三点:

  • DoIP是为了解决CAN总线带宽不足和远程诊断需求而生的
  • 它位于汽车网络的信息层,连接车内以太网和云端
  • 协议栈从UDS应用层到以太网物理层,每层各司其职

下一章,我们会深入DoIP的报文格式,看看数据包到底长什么样。到时候我会带着Wireshark抓包截图,手把手教你分析。嗯,敬请期待。