3、DoIP连接建立:TCP连接建立流程、路由激活过程、安全认证机制
好,咱们今天聊DoIP连接建立这块。说实话,这是整个DoIP通信的基石。你想想看,如果连接都建不起来,后面什么诊断、刷写全是空谈。我在项目里见过太多工程师,上来就抓包分析应用层,结果折腾半天发现是TCP握手都没完成——这种坑,我踩过不止一次。
3.1 TCP连接建立流程
DoIP的TCP连接,说白了就是标准的三次握手。但有个关键点——它用的是特定的端口号。默认是13400,这个别搞错了。我记得有一次,供应商给的文档里写的是13401,结果联调了整整两天才发现是端口号配错了。
流程其实很简单:
- 客户端(通常是诊断仪)发SYN到13400端口
- 服务端(ECU)回SYN+ACK
- 客户端再发ACK确认
嗯,这里要注意:DoIP要求TCP连接建立后,客户端必须在5秒内发送路由激活请求。否则服务端会主动断开连接。这个超时时间,ISO 13400-2里写得清清楚楚,但很多工程师会忽略。
3.2 路由激活过程
TCP连接建好了,接下来就是路由激活。这一步的目的是让ECU知道:你是谁?你想干什么?
路由激活请求的格式,我直接贴出来:
字节 0-1: 协议版本 (0x02)
字节 2-3: 负载类型 (0x0005 表示路由激活)
字节 4-7: 负载长度 (0x0000000B)
字节 8: ISO 13400-2 保留 (0x00)
字节 9-12: 源地址 (逻辑地址)
字节 13: 激活类型 (0x00 默认, 0x01 带安全认证)
字节 14: 保留 (0x00)
字节 15: 保留 (0x00)
我个人习惯,在写代码时会把源地址和激活类型单独拎出来做校验。为什么?因为很多ECU会检查源地址是否在允许列表里。如果不在,直接拒绝激活。
服务端收到请求后,会回复一个路由激活响应:
字节 0-1: 协议版本 (0x02)
字节 2-3: 负载类型 (0x0006 表示路由激活响应)
字节 4-7: 负载长度 (0x0000000F)
字节 8: 客户端逻辑地址
字节 9-12: 源地址 (ECU自己的逻辑地址)
字节 13: 响应码 (0x10 成功, 0x11 拒绝, 0x12 待安全认证)
字节 14-15: 保留 (0x0000)
字节 16-19: 新源地址 (可选, 用于动态分配)
这里有个容易踩的坑:响应码0x12表示需要安全认证。很多工程师看到这个码就慌了,以为连接失败了。其实不是,它只是告诉你:你得先过安全认证这关。
3.3 安全认证机制
安全认证,说白了就是ECU在问:你真的是合法的诊断仪吗?
DoIP支持两种安全认证方式:
- 默认认证:不认证,直接通过。适合开发调试阶段。
- 带安全认证:需要客户端提供种子和密钥。适合量产阶段。
带安全认证的流程是这样的:
- 客户端发路由激活请求,激活类型设为0x01
- ECU回复0x12(待安全认证),同时返回一个种子(Seed)
- 客户端根据种子计算密钥(Key),发回给ECU
- ECU验证密钥,如果正确,回复0x10(成功)
嗯,这里要注意:种子和密钥的计算算法,ISO 13400-2并没有规定。它是留给OEM自己定义的。所以你在做测试时,一定要拿到OEM提供的算法库或者文档。
最后,我总结一下整个连接建立的时序:
| 步骤 | 动作 | 超时时间 | 常见问题 |
|---|---|---|---|
| 1 | TCP三次握手 | 标准TCP超时 | 端口号错误、防火墙拦截 |
| 2 | 发送路由激活请求 | 5秒内 | 超时未发送、源地址无效 |
| 3 | 安全认证(可选) | OEM定义 | 算法不匹配、重试次数超限 |
| 4 | 连接建立完成 | - | 逻辑地址冲突 |
好了,这一章就讲到这里。下一章我们会聊DoIP的报文传输和超时处理。到时候我会分享一个我亲身经历的、因为超时配置不当导致的整车网络瘫痪案例——嗯,那故事挺有意思的。