第2章:以太网基础回顾
各位同学,在正式进入AUTOSAR以太网协议栈之前,我觉得有必要先花一章的时间,把以太网的基础知识捋一遍。你可能会说:「这些我都知道啊」。嗯,我理解,但请相信我——很多坑,恰恰就出在这些「你以为你知道」的地方。
我在做AUTOSAR项目时,遇到过好几次因为MAC地址配置错误导致通信失败的案例。排查到最后,发现是工程师对地址类型的理解有偏差。所以,咱们还是踏踏实实把地基打牢。
2.1 OSI七层模型与TCP/IP四层模型
先聊聊网络模型。OSI七层模型,说白了就是国际标准化组织给网络通信画的一个「理想蓝图」。从上到下分别是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
但实际工程中,没人真的按七层来干活。我们用的更多的是TCP/IP四层模型:应用层、传输层、网络层、网络接口层。你想想看,OSI的会话层和表示层,在TCP/IP里直接被合并到应用层了。
我个人习惯这样对应着记:
- 应用层(HTTP、FTP、DoIP)→ 用户数据
- 传输层(TCP、UDP)→ 端口号 + 数据分段
- 网络层(IP)→ IP地址 + 路由
- 网络接口层(以太网)→ MAC地址 + 帧封装
在AUTOSAR里,我们最常打交道的是传输层和网络层。比如SOME/IP协议跑在应用层,但它的底层依赖TCP或UDP。而DoIP(诊断 over IP)更是直接跟TCP绑定。
避坑指南:我曾经在配置AUTOSAR的Socket Adapter模块时,把传输层和网络层的角色搞混了。结果报文发不出去,查了两天才发现是IP层配置对了,但TCP端口号没绑定。记住:传输层管「谁跟谁聊」,网络层管「怎么找到对方」。
2.2 以太网帧结构
以太网帧,就是数据在物理介质上传输的「包装盒」。标准以太网帧(IEEE 802.3)的结构是这样的:
| 前导码(7B) | 帧起始定界符(1B) | 目标MAC(6B) | 源MAC(6B) | 长度/类型(2B) | 数据(46-1500B) | FCS(4B) |
嗯,这里要注意几个关键点:
- 前导码和帧起始定界符:这是物理层用的,上层软件一般看不到。我刚开始做驱动时,老想着在软件里抓前导码,后来发现根本抓不到——那是PHY芯片的事。
- MAC地址:6字节,全球唯一。但注意,这个「唯一」是理论上的。实际项目中,我见过因为MAC地址冲突导致网络瘫痪的案例。
- 长度/类型字段:如果值小于等于1500,表示数据长度;大于等于1536,表示上层协议类型(比如0x0800是IPv4)。
- 数据字段:最小46字节,最大1500字节。如果数据不够46字节,要填充。这个填充在AUTOSAR的Eth模块里是自动处理的,但如果你自己写驱动,千万别忘了。
注意:在AUTOSAR中,以太网帧的FCS(帧校验序列)通常由硬件自动计算和校验。但有些芯片允许软件接管FCS计算。我建议除非你有特殊需求,否则别碰这个——让硬件干它该干的事。
2.3 MAC地址与IP地址
这两个地址,是网络通信的「身份证」和「门牌号」。
MAC地址:48位,通常写成6组十六进制数,比如 00:1A:2B:3C:4D:5E。它是在网卡出厂时烧录的,理论上全球唯一。但实际项目中,我遇到过两种情况:
- 虚拟机网卡的MAC地址是软件生成的,可能重复
- 有些开发板允许用户修改MAC地址(比如通过uboot环境变量)
IP地址:IPv4是32位,比如 192.168.1.100。它是在网络层使用的,用于路由寻址。在AUTOSAR中,IP地址通常通过静态配置或DHCP获取。
| 特性 | MAC地址 | IP地址 |
|---|---|---|
| 长度 | 48位(6字节) | 32位(4字节) |
| 作用范围 | 局域网内 | 互联网范围 |
| 分配方式 | 硬件固化 | 网络管理员/DHCP |
| 在AUTOSAR中的配置 | Eth模块的控制器配置 | TcpIp模块的IP地址配置 |
我个人经验:在AUTOSAR项目中,MAC地址的配置要特别注意字节序。有些芯片是大端,有些是小端。我曾经在配置一个Infineon的芯片时,MAC地址写反了,结果ARP请求一直没响应。排查了半天,最后发现是字节序的问题。
2.4 VLAN与QoS基础
VLAN(虚拟局域网)和QoS(服务质量),是车载以太网中非常重要的概念。为什么?因为车载网络里,既有实时性要求高的控制信号(比如ADAS数据),又有带宽需求大的信息娱乐数据。如果不做隔离和优先级管理,网络会乱成一锅粥。
VLAN:说白了,就是把一个物理网络切成多个逻辑网络。每个VLAN有一个12位的VLAN ID(0-4095)。在以太网帧里,VLAN标签插在源MAC地址和长度/类型字段之间:
| ... | 源MAC(6B) | VLAN标签(4B) | 长度/类型(2B) | ... |
VLAN标签包含:
- TPID(2字节):固定为0x8100,表示这是VLAN帧
- TCI(2字节):包含PCP(3位优先级)、DEI(1位)、VID(12位VLAN ID)
QoS:在以太网中,QoS主要通过VLAN标签中的PCP字段实现。PCP有3位,可以表示8个优先级(0-7)。在AUTOSAR中,这个优先级会映射到以太网控制器的发送队列。
避坑指南:我曾经在一个项目中,把所有的数据都放在VLAN 1里,结果发现高优先级的控制信号和低优先级的诊断数据混在一起,导致控制信号延迟超标。后来我们按照AUTOSAR的建议,把控制信号放在VLAN 0(优先级7),诊断数据放在VLAN 1(优先级3),问题就解决了。
在AUTOSAR中,VLAN和QoS的配置主要在Eth_SwPduRouter和Eth模块中完成。你需要:
- 在Eth模块中配置VLAN ID和PCP优先级
- 在Eth_SwPduRouter中配置路由规则,把不同优先级的PDU映射到不同的VLAN
- 在TcpIp模块中配置IP层的QoS策略(比如DSCP标记)
嗯,这里要提醒一下:VLAN和QoS的配置,一定要跟网络交换机的配置保持一致。否则,你这边打了优先级标签,交换机那边不认,等于白干。
重要提醒:在AUTOSAR中,VLAN标签的处理通常由硬件完成。但有些芯片的以太网控制器不支持硬件VLAN插入,这时就需要软件在Eth模块中手动添加VLAN标签。这会增加CPU负载,而且影响实时性。选型时一定要注意。
好了,这一章的内容就到这里。以太网基础看似简单,但每一个细节都可能成为项目中的「坑」。下一章,我们会进入AUTOSAR以太网协议栈的整体架构,看看这些基础概念是如何在AUTOSAR中落地的。