3. CAN网络通信原理
CAN(Controller Area Network)是一种面向广播的多主异步串行总线,其通信原理的核心可以概括为:所有节点共享一对差分信号线,以报文为单位竞争总线,用标识符决定优先级,用位填充与CRC保证可靠性,用ACK实现发送确认。理解报文标识符、数据帧、远程帧、过载帧以及总线负载,是后续做异常检测与安全监控的语法基础——因为绝大多数CAN攻击与故障,最终都会表现为帧结构、标识符分布或总线负载的异常。
一、报文标识符:CAN的“身份”与“优先级”
CAN报文以标识符(Identifier,简称ID)开头。标准帧为11位ID,扩展帧为29位ID(由11位基本ID与18位扩展ID组成)。ID不仅标识报文内容,还直接决定总线仲裁优先级:ID数值越小,优先级越高。这是因为CAN总线采用“线与”逻辑,显性位(逻辑0)会覆盖隐性位(逻辑1),多个节点同时发送时,发送隐性位却检测到显性位的节点立即退出仲裁,转为接收。
工程上通常按功能划分ID区间,例如动力系统使用0x000–0x0FF,车身系统使用0x100–0x2FF,诊断与标定使用0x700–0x7FF。这种划分让ID本身携带语义,也便于监控系统建立“ID白名单”。
关键点:ID既是内容标签,也是优先级标签。异常检测中,ID的“出现频率、周期、数据长度、发送节点”四要素构成基线,任何偏离基线的ID行为都值得关注。
二、数据帧:CAN通信的主体结构
数据帧是承载实际数据的帧类型,标准数据帧由以下字段组成:
- 帧起始(SOF):1位显性位,用于硬同步。
- 仲裁场:11位ID + RTR位(数据帧RTR为显性)。
- 控制场:IDE位、保留位r0、4位DLC(数据长度码,0–8)。
- 数据场:0–8字节数据,CAN FD可扩展至64字节。
- CRC场:15位CRC + 1位CRC界定符,用于检错。
- ACK场:ACK槽 + ACK界定符,接收节点正确接收后拉低ACK槽。
- 帧结束(EOF):7位隐性位。
数据帧的位填充规则为:在SOF到CRC序列之间,连续出现5个相同极性位后,自动插入1个相反极性位。接收端自动去除填充位。位填充既保证同步,也带来“填充位错误”这一故障类型。
三、远程帧、过载帧与错误帧
远程帧与数据帧结构相似,但RTR位为隐性,且不含数据场。它用于请求某个ID的数据,DLC表示期望返回的数据长度。远程帧在现代CAN网络中已较少使用,但在部分老平台和诊断场景中仍会出现。安全监控中,异常远程帧可能是攻击者探测或触发响应的手段。
过载帧由接收节点在需要延迟下一帧时发出,包含6位显性过载标志和8位隐性过载界定符。它用于缓冲能力不足时的流控,但频繁过载往往意味着节点处理能力不足或总线速率配置不当。
错误帧不属于正常通信帧,但必须理解:节点检测到错误后发送错误标志(6位显性位),破坏总线当前帧,使发送方重发。错误计数器(TEC/REC)超过阈值会使节点进入错误被动甚至总线关闭状态。
四、总线负载:网络健康的核心指标
总线负载率(Bus Load)指单位时间内总线被有效帧占用的比例。计算公式可简化为:
负载率 ≈ Σ(每帧位数 × 帧数) / (波特率 × 统计时间) × 100%
示例:500 kbps 总线,1 秒内共发送 3000 帧,
平均每帧约 110 位(含填充与帧间隔),则:
负载率 ≈ 3000 × 110 / (500000 × 1) × 100% ≈ 66%
工程经验值:负载率低于30%为健康,30%–60%为可接受,60%–80%为偏高,超过80%则实时性显著恶化,容易出现仲裁延迟、丢帧和错误帧激增。安全监控中,负载率突增往往对应DoS攻击、节点故障反复重发或总线短路。
| 帧类型 | RTR位 | 数据场 | 典型用途 | 异常监控关注点 |
|---|---|---|---|---|
| 数据帧 | 显性 | 0–8字节 | 正常传感器/控制数据 | ID周期、DLC、数据突变 |
| 远程帧 | 隐性 | 无 | 请求数据 | 异常请求、高频探测 |
| 过载帧 | — | 无 | 延迟下一帧 | 频繁出现说明节点过载 |
| 错误帧 | — | 无 | 错误通知 | TEC/REC增长、总线关闭 |
五、案例与误区复盘
案例:某车型网关监控发现0x2A0报文周期由20ms变为5ms,同时总线负载从42%升至78%。进一步分析发现该ID的DLC由8变为4,且发送节点地址与基线不符。最终定位为某节点被刷写错误固件后进入异常广播状态。该案例说明:ID、周期、DLC、负载四者联动分析,才能快速定位异常。
常见误区:① 认为“ID越小越重要”等同于“ID越小越安全”,实际上高优先级ID更容易被攻击者利用来压制低优先级报文;② 只监控数据内容,忽略DLC和周期变化;③ 把远程帧一律视为正常,忽略其可能被用于探测;④ 只看平均负载,不看瞬时峰值负载,导致偶发拥塞漏检。
监控建议:建立每个ID的“周期—DLC—数据范围—发送节点”四维基线;对总线负载设置分级阈值(如60%预警、80%告警);对远程帧、过载帧、错误帧单独计数并设置突增告警。这些基线正是后续异常检测算法的输入特征。