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:
- 车辆发现:诊断仪发送UDP广播,询问「车上有没有DoIP节点?」
- 车辆应答:ECU回复「我在,我的IP是192.168.1.100」
- 建立TCP连接:诊断仪向ECU的13400端口发起TCP连接
- 路由激活:诊断仪发送路由激活请求,ECU确认
- 诊断通信:诊断仪发送UDS请求(比如0x10 03),ECU回复响应
- 断开连接:诊断完成,关闭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抓包截图,手把手教你分析。嗯,敬请期待。