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)超过阈值会使节点进入错误被动甚至总线关闭状态。

CAN 数据帧 / 远程帧 / 过载帧 结构对比 数据帧(标准帧,RTR=显性) SOF 仲裁场 11位ID + RTR 控制场 IDE r0 DLC 数据场 0–8 字节 CRC场 15位 + 界定符 ACK场 槽 + 界定符 EOF 远程帧(RTR=隐性,无数据场) SOF 仲裁场 11位ID + RTR(隐) 控制场 DLC=期望长度 无数据场 CRC场 ACK场 EOF 过载帧(用于延迟下一帧) 过载标志 6位显性位 过载界定符 8位隐性位 触发条件:接收缓冲不足 或节点需延迟下一帧 总线负载示意(单位时间内总线被占用的比例) 帧A 帧B 帧C 帧D 空闲 负载率 = 有效帧占用时间 / 总时间 × 100%

四、总线负载:网络健康的核心指标

总线负载率(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%告警);对远程帧、过载帧、错误帧单独计数并设置突增告警。这些基线正是后续异常检测算法的输入特征。