2. CAN总线基础

CAN(Controller Area Network)是车载与工业控制领域最常用的现场总线之一。要做好CAN网络异常检测与安全监控,必须先理解它的底层“游戏规则”:报文长什么样、多个节点同时发言时谁先说话、出错后如何收敛、以及位定时与物理层如何决定信号能否被正确采样。本节围绕这四件事展开,为后续的异常识别与入侵检测建立判据基础。

一、CAN协议帧结构:数据帧是监控的基本单位

CAN 2.0A 使用11位标识符的标准帧,CAN 2.0B 使用29位标识符的扩展帧。二者在仲裁段长度不同,但数据帧主体结构一致。以标准数据帧为例,其字段顺序为:帧起始(SOF)、仲裁段(11位ID + RTR)、控制段(IDE、r0、4位DLC)、数据段(0~8字节)、CRC段(15位CRC + CRC界定符)、ACK段(ACK槽 + ACK界定符)、帧结束(EOF,7个隐性位)。

监控系统最常提取的字段包括:ID(用于判断报文合法性)、DLC(判断长度是否异常)、数据字节(用于周期性与数值范围检测)、以及帧间隔时间(用于周期抖动分析)。需要特别注意的是,CAN帧没有源地址与目的地址,ID既表示内容优先级,也常被用作“报文身份”,因此ID伪造是常见攻击面。

标准数据帧字段(从左到右):
SOF | 11位ID | RTR | IDE | r0 | DLC(4) | Data(0~8B) | CRC(15) | CRCdel | ACK | ACKdel | EOF(7)

扩展帧差异:
SOF | 11位基本ID | SRR | IDE | 18位扩展ID | RTR | r1 | r0 | DLC | Data | CRC | ACK | EOF

二、仲裁机制:非破坏性逐位仲裁

CAN采用载波监听多路访问/冲突避免(CSMA/CA)与逐位仲裁。总线上显性位(逻辑0)会覆盖隐性位(逻辑1)。当多个节点同时发送时,每个节点在发送每一位的同时回读总线电平;若某节点发送隐性位却读到显性位,说明有更高优先级报文在竞争,该节点立即退出发送并转为接收,且不会破坏已获胜报文的任何一位,这就是“非破坏性仲裁”。

仲裁结果由ID决定:ID数值越小,优先级越高。因此安全监控中若发现某低优先级ID长期抢占高优先级ID的发送窗口,或高优先级ID出现异常高频,往往意味着总线负载异常或存在恶意注入。仲裁段之后,RTR位区分数据帧与远程帧,IDE位区分标准帧与扩展帧,这些位也是异常检测的特征点。

关键判据:仲裁只发生在仲裁段与ACK段之前;一旦进入数据段,所有节点都必须一致接收。若在数据段出现位错误,说明发送节点与接收节点采样不一致,通常指向位定时或物理层问题。

三、错误处理:错误计数与节点状态机

CAN节点内置发送错误计数器(TEC)与接收错误计数器(REC),并据此在错误主动(Error Active)、错误被动(Error Passive)与总线关闭(Bus Off)三种状态间迁移。检测到错误时,节点会发送错误帧:错误主动节点发送主动错误帧(6个显性位),错误被动节点发送被动错误帧(6个隐性位)。

常见错误类型包括:位错误、填充错误、CRC错误、格式错误与ACK错误。位填充规则要求发送方在连续5个相同极性位后插入1个相反位,接收方自动去除;若违反该规则即触发填充错误。错误处理机制使总线具备故障收敛能力,但也会被攻击者利用:例如持续注入错误帧可迫使某节点进入Bus Off,从而造成“合法节点被踢出总线”的拒绝服务效果。

错误类型触发条件典型原因监控关注点
位错误回读电平与发送不一致仲裁丢失、物理层干扰是否集中在仲裁段
填充错误连续6个相同极性位位定时偏差、噪声错误帧频率突增
CRC错误CRC校验不匹配干扰、注入篡改是否伴随ID异常
格式错误固定格式位出现非法电平帧结构被破坏是否来自同一节点
ACK错误发送方未收到显性ACK无接收节点、总线断开节点掉线排查

四、位定时与物理层特性

CAN位时间被划分为若干时间段:同步段(Sync_Seg)、传播段(Prop_Seg)、相位缓冲段1(Phase_Seg1)与相位缓冲段2(Phase_Seg2)。采样点位于Phase_Seg1与Phase_Seg2之间。常用参数包括波特率、采样点位置(通常建议75%~87.5%)与同步跳转宽度(SJW)。若采样点设置不当,长线缆或节点间晶振偏差会导致采样错误,表现为间歇性错误帧。

物理层方面,高速CAN采用差分信号CAN_H与CAN_L,显性电平对应约2V压差,隐性电平对应约0V压差,终端电阻为120Ω,两端各一个。常见物理层问题包括:终端电阻缺失导致反射、屏蔽接地不当引入共模干扰、支线过长导致信号完整性下降。这些问题在监控数据中常表现为错误计数上升、重传增多与周期抖动。

典型位定时配置(500 kbps,采样点80%):
Sync_Seg   = 1 TQ
Prop_Seg   = 6 TQ
Phase_Seg1 = 1 TQ
Phase_Seg2 = 2 TQ
SJW        = 1 TQ
总位时间   = 10 TQ,采样点位于第8个TQ结束处

五、案例与复盘:从错误帧定位物理层故障

某测试台架在运行约20分钟后频繁出现CRC错误与填充错误,监控系统记录到错误帧集中在两个节点之间。排查发现:该段支线长度超过1米,且一端终端电阻未接入。恢复120Ω终端并缩短支线后,错误计数在10分钟内回落至基线。复盘要点:错误帧不是“软件问题”的同义词,应先核对位定时与物理层,再怀疑协议栈或应用逻辑。

工程建议:在监控系统中同时采集TEC/REC、错误帧类型、总线负载率与报文周期抖动。单一指标异常可能是噪声,多指标联动才更接近真实故障或攻击。
常见误区:把“仲裁丢失”当成错误。仲裁丢失是正常竞争结果,不计入错误计数;只有位错误、填充错误、CRC错误、格式错误与ACK错误才触发错误处理流程。
CAN总线核心机制关系图 ① 标准数据帧结构 SOF 仲裁段 11位ID + RTR 控制段 IDE/r0/DLC 数据段 0~8 字节 CRC段 15位 + 界定符 ACK段 槽 + 界定符 EOF 帧间隔 IFS ② 逐位仲裁(显性0覆盖隐性1) 节点A ID=0x100 ← 读到显性,退出 节点B ID=0x080 ← 赢得仲裁,继续发送 ID数值越小,优先级越高;仲裁丢失不计入错误计数。 ③ 错误计数与节点状态迁移 错误主动 TEC/REC < 128 错误被动 TEC/REC ≥ 128 Bus Off TEC > 255 错误累积 持续错误 错误帧:主动=6显性位,被动=6隐性位 恢复需128次连续11隐性位 ④ 位定时与物理层 Sync_Seg Prop_Seg Phase_Seg1 Phase_Seg2 采样点 CAN_H / CAN_L 差分 显性≈2V,隐性≈0V 终端电阻 120Ω × 2 500 kbps 示例 采样点 80%

综上,CAN的帧结构决定了可观测字段,仲裁机制决定了优先级与竞争行为,错误处理决定了节点状态与故障收敛,位定时与物理层决定了信号能否被可靠采样。这四者共同构成后续异常检测与安全监控的底层判据:任何偏离基线的ID、DLC、周期、错误计数或采样行为,都值得进一步关联分析。