4. DoIP网络架构
这一章我们聊聊传输层。说白了,就是数据怎么在诊断仪和ECU之间“跑”起来。DoIP用了两个传输层协议——TCP和UDP,各有各的活儿。我刚开始接触DoIP时,总觉得这两个协议差不多,直到在实车上踩了坑,才明白它们的分工有多重要。
4.1 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就严肃多了。它负责所有需要可靠传输的“正经事”:
- 路由激活(Routing Activation):诊断仪和ECU建立TCP连接后,先发路由激活请求,ECU确认后,才算“接上头”。
- 诊断消息(Diagnostic Message):UDS请求和响应都走TCP。比如你发一个22 01 00 读VIN,ECU回复62 01 00 ...,这些数据必须完整、有序地到达。
- AliveCheck(保活机制):双方定期发“我还活着”的消息,防止连接被意外断开。
TCP的可靠性靠三次握手、序列号、确认重传这些机制保证。说白了,TCP就是“我发一条,你确认一条,没确认我就重发”。
注意:DoIP规定,一个TCP连接只能对应一个逻辑地址。也就是说,你不能在同一个TCP连接里同时模拟两个诊断仪。我曾经见过有人想“复用”连接,结果ECU直接拒绝路由激活——这是标准明确禁止的。
4.5 连接建立与断开流程
这部分是实操重点。我画个流程图,把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慢但可靠。在实车诊断中,该用哪个就用哪个,别混着来。