2、以太网基础回顾:TCP/IP协议栈、UDP与TCP区别、以太网帧结构、车载以太网(100BASE-T1/1000BASE-T1)

好,咱们进入第二讲。做CAN到以太网网关迁移,你得先搞清楚以太网这边到底是怎么回事。说实话,很多做CAN的老工程师一听到TCP/IP就头大,觉得太复杂。我当年也一样,总觉得CAN多清爽,一帧就8个字节,哪有这么多弯弯绕。

但没办法,车载带宽需求上来了,ADAS、自动驾驶、OTA升级,CAN那点带宽根本扛不住。所以,咱们今天就把以太网这层窗户纸捅破。我尽量用大白话讲,你听完就能上手。

2.1 TCP/IP协议栈:别被四层吓到

TCP/IP协议栈,说白了就是一套“怎么把数据从A点送到B点”的规矩。它分四层,我习惯从下往上记:

  • 网络接口层:管物理传输,比如网线、PHY芯片、MAC地址。说白了就是“怎么把比特流扔到线上去”。
  • 网络层:核心是IP协议,负责寻址和路由。它不管数据怎么传,只管“下一站去哪”。
  • 传输层:TCP和UDP就在这层。它管的是“数据怎么可靠地交给对方应用程序”。
  • 应用层:HTTP、MQTT、SOME/IP这些,直接跟你的业务逻辑打交道。

你想想看,CAN报文只有一层——ID+数据。以太网呢?一层套一层,像俄罗斯套娃。但别怕,咱们做网关,最常打交道的是传输层和网络层。应用层的东西,通常由上层软件去处理。

我的经验: 刚开始做网关时,我总想把所有协议层都看懂再动手。后来发现,先搞懂传输层和网络层就够了。应用层协议,用到哪个学哪个,别一口吃成胖子。

2.2 UDP与TCP区别:一个像寄明信片,一个像打电话

这是面试必考题,也是实际开发中最容易踩坑的地方。我直接说结论:

特性 UDP TCP
连接 无连接,发完就完 面向连接,先握手再发
可靠性 不可靠,丢了不重传 可靠,丢包会重传
顺序 不保证顺序 保证顺序
速度 快,开销小 慢,有确认和重传
典型应用 视频流、DNS、SOME/IP 文件传输、HTTP、远程诊断

UDP就像寄明信片——你扔进邮筒,对方收不收得到,什么时候收到,你不管。TCP呢,像打电话——你先拨号(三次握手),对方接了,你说一句,对方“嗯”一声(确认),你再说下一句。

在车载环境里,SOME/IP通常跑在UDP上,因为实时性要求高,丢一帧就算了,下一帧补上。但远程诊断(比如UDS over IP)一般用TCP,因为诊断数据不能丢,丢了就得重来。

避坑指南: 我曾经在一个项目中,把SOME/IP的Service Discovery跑在了TCP上。结果发现,车辆在高速移动时,网络切换导致TCP连接频繁断开重连,服务发现延迟暴涨。后来改成UDP,问题解决。记住:车载环境,能UDP就别TCP,除非你明确需要可靠性。

2.3 以太网帧结构:从比特流里扒数据

做网关,你得能从原始字节流里认出以太网帧。标准以太网帧长这样:

| 前导码(7B) | 定界符(1B) | 目标MAC(6B) | 源MAC(6B) | 类型/长度(2B) | 数据(46-1500B) | FCS(4B) |

咱们重点关注几个字段:

  • 目标MAC和源MAC:6字节,硬件地址。网关转发时,这两个字段经常要改。
  • 类型/长度:0x0800表示上层是IPv4,0x86DD是IPv6,0x8100是VLAN标签。这个字段决定了你接下来怎么解析。
  • 数据:46到1500字节。如果不够46字节,要填充。如果超过1500,就得分片。
  • FCS:4字节CRC校验。收到帧先算一遍,不对就丢。

嗯,这里要注意:车载以太网通常用VLAN标签(0x8100),用来区分不同优先级的数据流。比如ADAS数据优先级高,诊断数据优先级低。你在做网关时,VLAN的优先级映射是个关键点。

实战要点: 我在调试一个网关时,发现CAN报文转成以太网后,对方总是收不到。抓包一看,MAC地址写反了——源和目标搞混了。这种低级错误,排查起来最费时间。所以,写代码时一定要把MAC地址的字节序搞清楚。

2.4 车载以太网:100BASE-T1和1000BASE-T1

车载以太网和咱们办公室用的以太网不一样。办公室用的是100BASE-TX或1000BASE-T,需要两对或四对差分线。车载呢?只有一对非屏蔽双绞线,还得供电(PoDL)。

这就是100BASE-T11000BASE-T1的由来。

特性 100BASE-T1 1000BASE-T1
速率 100 Mbps 1 Gbps
线缆 1对非屏蔽双绞线 1对非屏蔽双绞线
最大距离 15米 15米
调制方式 PAM3 PAM3
典型应用 诊断、OTA、摄像头 ADAS、主干网

100BASE-T1现在用得最多,成本低,成熟度高。1000BASE-T1呢,主要用在主干网,比如域控制器之间。我建议你:如果项目带宽需求不超过100M,优先选100BASE-T1。别为了“看起来先进”硬上1000BASE-T1,PHY芯片贵不少,布线要求也更高。

我的习惯: 做网关设计时,我会预留1000BASE-T1的接口位置,但先焊100BASE-T1的PHY。等带宽需求上来了,直接换芯片,PCB不用改。这叫“设计冗余”,做硬件的老工程师都懂。

最后说一句:车载以太网的物理层和MAC层之间,有个MII/RMII/RGMII接口。你做网关时,MCU或SoC的MAC通过这个接口连到PHY芯片。这个接口的时钟、数据线时序,调试时最容易出问题。我建议你第一次打板时,把MII接口的测试点都引出来,方便示波器抓波形。

好了,以太网基础就回顾到这。下一讲,咱们开始真正动手——CAN报文怎么封装进UDP包里,以及那个让人又爱又恨的SOME/IP协议。