网络层与传输层:IPv4/IPv6在车内的应用、TCP/UDP的选择、DoIP协议、SOME/IP协议
好,我们进入第四讲。这一章是车载以太网协议栈的「腰部」——网络层和传输层。说白了,就是数据怎么在车里找到路,以及怎么可靠地送到目的地。
我个人习惯把这一层比作「快递系统」。IP地址是门牌号,TCP/UDP是快递方式,DoIP和SOME/IP则是车里特有的「快递规则」。咱们一个一个拆开讲。
IPv4 vs IPv6:车内到底用哪个?
先回答一个最实际的问题:车里用IPv4还是IPv6?
嗯,目前绝大多数量产车,用的还是IPv4。为什么?因为简单、成熟、够用。你想想看,一个座舱域控制器,加上几个摄像头、显示屏、T-Box,撑死了几十个节点。IPv4的地址空间完全够用。
但我要提醒你,别被「够用」骗了。我在项目中遇到过一个问题:某OEM要求所有ECU必须支持IPv6,因为他们的远程诊断系统需要全球唯一地址。结果呢?底层交换芯片不支持IPv6路由,最后只能做双栈——IPv4跑内部通信,IPv6跑外部诊断。折腾了三个月。
这里有个关键区别:IPv6在车内的优势不是地址多,而是自动配置(SLAAC)和安全头(IPsec)。对于座舱这种频繁插拔设备的场景(比如诊断仪),IPv6的即插即用确实香。
TCP vs UDP:选谁?看场景
这个问题,我每次培训都会被问到。我的回答很简单:看你的数据怕不怕丢。
| 特性 | TCP | UDP |
|---|---|---|
| 可靠性 | 有确认、重传 | 无确认,发完不管 |
| 延迟 | 较高(握手+ACK) | 低(无握手) |
| 典型场景 | DoIP诊断、OTA下载 | SOME/IP事件、音视频流 |
| 车内推荐 | 控制类、配置类 | 周期性数据、实时数据 |
举个例子。DoIP诊断,你肯定用TCP。为什么?因为诊断报文丢了,ECU可能进入错误状态,甚至导致整车功能异常。我见过一个案例:某Tier1用UDP做诊断,结果丢了一个报文,ECU直接死锁,最后只能断电重启。嗯,从那以后,所有诊断通信我都强制要求TCP。
反过来,SOME/IP的事件通知,我建议用UDP。你想想看,车速信号每10ms发一次,丢一帧有什么关系?下一帧马上就到。如果用TCP,重传机制反而会导致延迟抖动,影响控制算法的稳定性。
DoIP协议:诊断的「高速公路」
DoIP,全称Diagnostics over Internet Protocol。说白了,就是把传统的CAN诊断报文,封装到以太网帧里传。
为什么要这么做?因为CAN太慢了。一个UDS诊断请求,在CAN上可能要拆成好几个帧,来回握手。而DoIP直接一个TCP包搞定,速度提升几十倍。
DoIP的核心流程,我总结为三步:
- 车辆发现:诊断仪发送广播,寻找车辆。车辆回复自己的IP和VIN。
- 路由激活:诊断仪和ECU建立TCP连接,发送路由激活请求。
- 诊断通信:双方通过TCP传输UDS报文。
这里有个坑,我踩过。DoIP的TCP端口是13400,但很多防火墙默认会拦截这个端口。有一次我在台架上调试,死活连不上ECU,查了半天发现是IT部门把13400端口封了。所以,量产前一定要和网络团队确认端口放行策略。
// DoIP报文头格式(简化版)
struct DoIPHeader {
uint8_t protocol_version; // 当前为0x02
uint8_t inverse_version; // 取反,用于校验
uint16_t payload_type; // 0x0001: 车辆声明, 0x0005: 诊断请求
uint32_t payload_length; // 后续数据长度
};
SOME/IP协议:面向服务的通信
SOME/IP,Scalable service-Oriented MiddlewarE over IP。名字很长,但核心思想很简单:把ECU的功能抽象成「服务」,其他ECU通过以太网调用这些服务。
举个例子。座舱里的「空调控制」是一个服务。中控屏想调温度,就发一个SOME/IP请求给空调ECU。空调ECU处理完,返回结果。整个过程就像调用一个远程函数——RPC(远程过程调用)。
SOME/IP有四种通信模式:
- 请求/响应:客户端发请求,服务端回响应。适合配置类操作。
- 事件通知:服务端主动推送数据。适合传感器值变化。
- 字段:类似属性,可读可写。适合状态查询。
- 方法:带参数的远程调用。适合复杂操作。
我个人最常用的是事件通知。为什么?因为座舱里大部分数据是周期性的(车速、转速、温度)。用事件通知,ECU只在数据变化时才发,节省带宽。
最后,说一个SOME/IP和DoIP的配合场景。诊断时,DoIP负责传输UDS报文。但如果你需要读取某个服务的当前状态(比如空调温度),可以用SOME/IP的字段读取,比UDS快得多。所以,我建议在座舱架构里,同时保留DoIP和SOME/IP,各司其职。
嗯,这一章内容不少。网络层和传输层是车载以太网的基石,选对了协议,后面的应用层开发会顺畅很多。下一章我们讲应用层协议,到时候再细聊。