第4章 车载以太网网络层:IPv4与IPv6在车内的应用、ARP协议、ICMP与诊断

网络层,说白了就是负责把数据包从A点送到B点。在车里,这个A点和B点可能是ADAS控制器和中央网关,也可能是座舱域控制器和T-Box。我最早接触车载以太网时,总觉得网络层就是电脑上网用的那一套,拿到车上直接套用就行。后来踩了不少坑才明白——车里的网络环境跟办公室完全两码事。

4.1 IPv4与IPv6:谁更适合车内?

先说说IPv4。目前绝大多数量产车型用的还是IPv4。为什么?因为简单、成熟、工具链完善。你想想看,一个ECU的软件工程师可能连IP地址都没配过,你让他去搞IPv6的SLAAC(无状态地址自动配置),那画面太美我不敢看。

但IPv4有个硬伤——地址空间不够。车内节点越来越多,一个域控制器可能就要跑十几个虚拟IP。我记得有个项目,光摄像头就用了8个,每个都需要独立IP,再加上网关、座舱、T-Box,整个子网地址规划搞得我头大。

IPv6的好处很明显:地址多到用不完,而且支持更灵活的自动配置。我在一个预研项目里试过IPv6,说实话,配置起来确实比IPv4繁琐,但一旦跑通了,后续扩展非常方便。特别是SOME/IP over IPv6,在服务发现阶段效率更高。

我的建议:当前量产项目继续用IPv4,但新架构设计一定要预留IPv6能力。网关和域控制器最好双栈支持,别给自己挖坑。

4.2 ARP协议:车内的“谁是谁”查询表

ARP(地址解析协议)解决的是个很基础的问题:我知道你的IP,但你的MAC地址是多少?在车里,这个协议看似简单,但坑不少。

ARP的工作原理其实就两步:

  • 广播一个ARP请求:“谁的IP是192.168.1.10?请告诉我你的MAC地址”
  • 目标节点单播回复:“我是,我的MAC是AA:BB:CC:DD:EE:FF”

听起来简单对吧?但车里有个特殊场景——休眠唤醒。我曾经遇到过一个诡异的问题:车辆休眠后,某个节点醒来时ARP缓存还是旧的,导致通信失败。排查了两天才发现,是ARP缓存老化时间设置得太长了。

避坑指南:我曾经在项目中因为ARP表项老化时间设置不当,导致唤醒后通信延迟高达500ms。建议将车内ARP缓存老化时间设为30秒左右,别用PC上的默认值(通常2分钟)。

还有一个常见问题:ARP泛洪。如果车内某个节点异常,疯狂发送ARP请求,整个网络都会被拖垮。我建议在交换机层面做ARP速率限制,每个端口每秒最多允许10个ARP包。

4.3 ICMP与诊断:网络层的“体检医生”

ICMP(互联网控制报文协议)在车里主要干两件事:连通性检测和错误报告。最常见的ICMP应用就是Ping——你发一个ICMP Echo Request,对方回一个Echo Reply。

但我要说,Ping在车里不能乱用。为什么?因为有些ECU的CPU资源很紧张,你频繁Ping它,它可能正事不干光忙着回Ping了。我见过一个项目,诊断工程师用脚本每100ms Ping一次所有节点,结果导致某个低端MCU的CAN报文发送延迟了。

小技巧:诊断时建议用ICMP的时间戳请求(Timestamp Request)替代Echo Request。前者开销更小,而且能同时测量往返时间。我个人习惯在诊断工具里默认用这个。

ICMP在车里还有个重要用途——路径MTU发现。车内以太网链路可能经过不同速率的网段(100BASE-T1和1000BASE-T1混用),MTU不一致时,ICMP的“分片需要”报文就派上用场了。不过说实话,我建议直接统一MTU为1500字节,省得麻烦。

4.4 网络层诊断:DoIP与ICMP的配合

DoIP(基于IP的诊断)是UDS over IP的实现。它依赖网络层的正常通信,所以ICMP在这里扮演了重要角色。

诊断流程一般是这样的:

  1. 诊断仪发送ICMP Echo Request确认目标ECU在线
  2. 建立TCP连接(DoIP使用TCP端口13400)
  3. 发送UDS诊断请求
  4. 接收诊断响应

这里有个细节:如果ICMP Ping不通,不代表DoIP一定不能用。我遇到过一种情况——ECU的ICMP响应被防火墙规则拦截了,但DoIP的TCP端口是开放的。所以诊断时别光看Ping结果,直接尝试TCP连接更靠谱。

实战经验:我在一个项目中设计了一套“三级诊断策略”:第一级用ICMP快速扫描所有节点(超时100ms),第二级对无响应的节点尝试TCP连接(超时500ms),第三级才发起完整的DoIP会话。这样既快又准。

4.5 网络层安全:别让ARP和ICMP成为突破口

说到安全,ARP欺骗在车里是真实存在的威胁。攻击者可以伪造ARP响应,把流量引到自己的设备上。我记得有个安全测试,白帽子用一台笔记本接上OBD口,就成功实施了ARP中间人攻击,把ADAS的摄像头数据全截获了。

防御手段主要有几种:

  • 静态ARP表:在关键ECU上配置静态ARP条目,不响应动态ARP
  • DAI(动态ARP检测):在交换机上验证ARP包的真实性
  • IP/MAC绑定:在网关层面做绑定检查

ICMP也有安全隐患。比如ICMP重定向攻击,可以诱导节点修改路由表。我建议在车内网络中禁用ICMP重定向功能,大多数车载协议栈默认就是关的,但最好确认一下。

重要提醒:我曾经在审核一个供应商的协议栈配置时,发现ICMP重定向是开启的。虽然他们说是“为了方便调试”,但量产车上绝对不能留这个口子。记住:调试功能只在开发阶段开启,量产前必须关闭。

4.6 小结与最佳实践

网络层在车里看似简单,但细节决定成败。我总结了几条经验:

项目 推荐做法 原因
IP版本 IPv4为主,预留IPv6 成熟稳定,工具链完善
ARP缓存老化 30秒 平衡唤醒速度和网络负载
ICMP使用 限制频率,避免诊断滥用 保护ECU CPU资源
MTU设置 统一1500字节 避免分片和路径MTU发现问题
安全配置 关闭ICMP重定向,启用ARP防护 防止中间人攻击

嗯,网络层就聊到这儿。下一章我们进入传输层,看看TCP和UDP在车里是怎么打架的——说实话,UDP在车里比TCP吃香得多,原因嘛,下回分解。


公众号:蓝海资料掘金营,微信deep3321