第4章 DoIP传输层机制:TCP与UDP的选择策略、端口号分配(13400)、连接管理状态机

各位工程师,咱们今天聊聊DoIP的传输层。说实话,这一块是很多人在实际项目中容易踩坑的地方。TCP和UDP怎么选?端口号为什么是13400?连接状态机到底怎么跑?我一个个给你讲透。

4.1 TCP与UDP的选择策略

DoIP协议在传输层同时支持TCP和UDP,但两者的分工非常明确。我个人习惯把UDP比作“广播员”,TCP比作“快递员”。

UDP的应用场景:

  • 车辆发现:诊断仪发送广播请求,ECU回复“我在这里”。
  • 车辆信息通告:ECU主动上报VIN、IP地址等基本信息。
  • 简单状态查询:比如ping一下ECU是否在线。

TCP的应用场景:

  • 诊断消息传输:UDS诊断请求/响应,必须可靠。
  • 大数据传输:比如刷写ECU固件,动辄几十MB。
  • 连接控制:路由激活、诊断会话控制等。

核心原则:UDP只管“发现”,TCP负责“干活”。

我在项目中遇到过一个问题:某次测试时,诊断仪发送UDP广播后,ECU回复了,但后续的TCP连接却一直建立不起来。排查了半天,发现是ECU的TCP端口被防火墙挡住了。嗯,这里要注意——UDP能通不代表TCP也能通。

4.2 端口号分配(13400)

DoIP协议规定使用端口号13400。为什么是13400?说实话,我也不知道ISO为什么选这个数字,但咱们记住就行。

端口使用规则:

协议 端口号 用途
UDP 13400 车辆发现、状态通告
TCP 13400 诊断消息、路由激活、数据交换

你可能会问:为什么TCP和UDP用同一个端口号?其实这是故意的。ECU只需要监听一个端口,简化了实现。诊断仪发送UDP广播时,目标端口是13400;建立TCP连接时,目标端口也是13400。ECU根据协议类型自动区分。

避坑指南:我曾经见过有人把UDP和TCP的端口号分开配置,结果ECU的UDP端口是13400,TCP端口却配成了13401。诊断仪死活连不上,查了三天才发现。记住,DoIP的端口号就是13400,别乱改。

4.3 连接管理状态机

DoIP的连接管理状态机,说白了就是ECU如何管理诊断连接的“生命周期”。我把它分为四个阶段:

  1. 监听状态(Listen):ECU启动后,在13400端口上监听TCP连接请求。
  2. 连接建立(Connected):诊断仪发起TCP连接,ECU接受后进入此状态。
  3. 路由激活(Routing Active):诊断仪发送路由激活请求,ECU验证通过后激活路由。
  4. 诊断会话(Diagnostic Session):路由激活后,可以进行UDS诊断通信。

状态机转换图大致如下:

Listen → TCP连接建立 → Connected → 路由激活 → Routing Active → 诊断请求 → Diagnostic Session
                    ↓                    ↓
                超时/断开           超时/断开
                    ↓                    ↓
                回到Listen          回到Listen

这里有个关键点:路由激活是DoIP特有的机制。诊断仪必须先发送路由激活请求,ECU验证通过后,才会允许后续的诊断消息通过。为什么要多这一步?说白了是为了安全——防止未经授权的设备随意访问ECU。

注意事项:路由激活请求中包含了诊断仪的逻辑地址。ECU会检查这个地址是否合法。我曾经遇到一个案例,诊断仪发送的路由激活请求中逻辑地址填错了,ECU直接拒绝,连接一直卡在Connected状态。所以,逻辑地址一定要配对。

另外,连接管理状态机还涉及超时机制。ISO 13400-2规定了几个关键超时:

  • TCP连接超时:默认30秒,超过后ECU会主动断开。
  • 路由激活超时:默认5秒,诊断仪必须在5秒内发送路由激活请求。
  • 诊断消息超时:默认2秒,ECU等待诊断请求的间隔。

你想想看,如果诊断仪发送路由激活请求后,ECU迟迟不回复,大概率是超时设置有问题。我建议你在开发阶段把这些超时参数打印出来,方便调试。

4.4 实际项目中的经验总结

最后,我分享几个实际项目中的经验:

  • UDP广播不要发太频繁:有些诊断仪每秒发10次广播,ECU处理不过来,导致丢包。建议间隔1秒以上。
  • TCP连接数有限:ECU资源有限,一般只支持1-2个并发TCP连接。诊断仪不要同时开太多连接。
  • 状态机要记录日志:我习惯在ECU中记录连接状态机的转换日志,出问题时一看就知道卡在哪一步。

好了,这一章就讲到这里。下一章咱们聊聊DoIP的消息格式和头部结构,那个更精彩。