4. DoIP网络架构

这一章我们聊聊传输层。说白了,就是数据怎么在诊断仪和ECU之间“跑”起来。DoIP用了两个传输层协议——TCP和UDP,各有各的活儿。我刚开始接触DoIP时,总觉得这两个协议差不多,直到在实车上踩了坑,才明白它们的分工有多重要。

4.1 TCP与UDP的分工逻辑

先看一张图,把整体关系理清楚。

DoIP传输层协议分工 DoIP应用层(诊断消息) TCP(端口13400) UDP(端口13400) TCP特性 • 面向连接,可靠传输 • 用于路由激活、诊断消息、诊断响应 • 保证数据顺序和完整性 UDP特性 • 无连接,不可靠但快速 • 用于车辆发现、车辆声明、DoIP实体状态 • 广播/组播,无需建立连接 TCP:可靠控制通道 | UDP:发现与状态通道 端口13400同时承载TCP和UDP,但用途完全不同

嗯,这张图很清楚了。TCP和UDP共用同一个端口13400,但干的活儿完全不一样。我个人习惯把TCP叫做“控制通道”,UDP叫做“发现通道”。

4.2 端口号13400的分配逻辑

为什么DoIP偏偏选了13400?其实没有特别玄学的原因——ISO 13400标准定的就是这个端口。你想想看,如果每个OEM自己随便选端口,那诊断仪连不同品牌的车就得配不同的端口配置,多麻烦。统一用13400,省心。

协议 端口号 用途 方向
UDP 13400 车辆发现、车辆声明、DoIP实体状态信息 广播/组播
TCP 13400 路由激活、诊断消息、诊断响应、AliveCheck 点对点

关键点:UDP的13400端口用于广播和组播,TCP的13400端口用于点对点连接。两者互不干扰,但同一个端口号在协议栈里是分开注册的。

4.3 UDP在DoIP中的应用

UDP在DoIP里主要干三件事:

  • 车辆发现(Vehicle Discovery):诊断仪发一个UDP广播,问“谁在线上?”
  • 车辆声明(Vehicle Announcement):ECU收到广播后,用UDP回复“我在这里,这是我的VIN和逻辑地址”。
  • DoIP实体状态信息:ECU定期广播自己的状态,比如“我还活着,别断开我”。

UDP的好处是快,不需要握手。坏处是——丢包了不重传。不过对于发现和声明这种“丢了再发一次就行”的场景,UDP完全够用。

我的经验:有一次在实车上调试,诊断仪死活发现不了ECU。抓包一看,UDP广播被交换机过滤了。后来我建议客户把交换机的IGMP Snooping关掉,问题解决。嗯,UDP广播在复杂网络里容易被“卡住”,这个坑我踩过。

4.4 TCP在DoIP中的应用

TCP就严肃多了。它负责所有需要可靠传输的“正经事”:

  1. 路由激活(Routing Activation):诊断仪和ECU建立TCP连接后,先发路由激活请求,ECU确认后,才算“接上头”。
  2. 诊断消息(Diagnostic Message):UDS请求和响应都走TCP。比如你发一个22 01 00 读VIN,ECU回复62 01 00 ...,这些数据必须完整、有序地到达。
  3. AliveCheck(保活机制):双方定期发“我还活着”的消息,防止连接被意外断开。

TCP的可靠性靠三次握手、序列号、确认重传这些机制保证。说白了,TCP就是“我发一条,你确认一条,没确认我就重发”。

注意:DoIP规定,一个TCP连接只能对应一个逻辑地址。也就是说,你不能在同一个TCP连接里同时模拟两个诊断仪。我曾经见过有人想“复用”连接,结果ECU直接拒绝路由激活——这是标准明确禁止的。

4.5 连接建立与断开流程

这部分是实操重点。我画个流程图,把TCP连接从建立到断开的完整过程走一遍。

DoIP TCP连接建立与断开流程 诊断仪(Client) ECU(Server) 步骤1:TCP三次握手 SYN SYN + ACK ACK 步骤2:路由激活 路由激活请求(0x0005) 路由激活响应(0x0006) 步骤3:诊断通信 诊断请求(0x8001) 诊断响应(0x8002) 步骤4:断开连接 FIN ACK FIN ACK 整个流程:TCP握手 → 路由激活 → 诊断通信 → 四次挥手断开 任何一步失败,后续步骤都无法进行

流程看起来不复杂,但实际项目中容易出问题的往往是“断开”这一步。我遇到过一种情况:诊断仪发完诊断请求后直接拔网线,ECU那边TCP连接还挂着,等超时。结果下次诊断仪再连,ECU说“你已经有连接了,拒绝”。

避坑指南:我曾经在测试中发现,某些ECU的TCP连接超时时间设置得太长(比如300秒)。诊断仪断开后,ECU还在等保活消息。后来我建议把超时时间缩短到30秒,同时诊断仪主动发FIN断开,问题就解决了。

4.6 连接状态机

DoIP定义了一个连接状态机,每个TCP连接都处于以下某个状态:

状态 说明 可执行操作
Listen ECU在13400端口监听,等待连接 无
SocketConnected TCP三次握手完成,连接建立 只能发路由激活请求
RoutingActive 路由激活成功,诊断通道打开 可以发诊断消息
SocketDisconnected 连接断开或超时 无

嗯,这里要注意:从SocketConnected到RoutingActive,必须走路由激活流程。你不能跳过这一步直接发诊断消息。ECU会直接忽略,甚至断开连接。

重要:路由激活请求里包含诊断仪的逻辑地址和激活类型。ECU会检查这个地址是否合法、是否已经被占用。如果同一个逻辑地址已经激活了另一个TCP连接,ECU会拒绝新的路由激活请求。

4.7 小结

这一章我们聊了TCP和UDP在DoIP里的分工。UDP负责“发现”,TCP负责“通信”。端口13400是固定的,别乱改。连接建立要经过三次握手、路由激活,断开要四次挥手。每一步都有对应的状态,跳步就会出问题。

我个人觉得,理解传输层的关键是记住一句话:UDP是广播,TCP是点对点;UDP快但不靠谱,TCP慢但可靠。在实车诊断中,该用哪个就用哪个,别混着来。