带宽、时延、完整性与认证¶
协议能解码只是最低条件。控制和遥测链路还要在最坏负载下满足时延、新鲜度、完整性、可用性和权限要求。

四个目标¶
| 目标 | 问题 |
|---|---|
| 带宽 | 线路、总线和处理器能否承载全部帧及突发 |
| 时延 | 数据从产生到使用经历多久,抖动多大 |
| 完整性 | 接收的数据是否被意外或恶意改变 |
| 认证与授权 | 谁发送、是否新鲜、当前状态是否允许执行 |
高带宽不自动带来低时延;CRC不自动带来认证;认证成功不自动代表命令被授权。
串行线路预算¶
对某一方向的异步串口:
[ R_{line}=\sum_i L_i f_i b_{wire} ]
其中:
- (L_i):第(i)类完整协议帧长度,单位为字节;
- (f_i):该帧发送率,单位为帧每秒;
- (b_{wire}):每字节线路位数,8N1为10,8E2为12;
- (R_{line}):所需线路速率,单位为比特每秒。
利用率:
[ U=\frac{R_{line}}{B_{nominal}} ]
其中(B_{nominal})是配置波特率。
计算必须使用完整协议帧长度,而不是只用应用载荷。全双工分别计算两个方向;半双工合并两个方向,并加入换向和响应窗口。
示例¶
假设115200波特、8N1的单向链路发送:
- 30字节完整状态帧,每秒100帧;
- 80字节完整扩展帧,每秒20帧;
- 10字节心跳帧,每秒1帧。
这还没有包含反向请求、重试、启动突发或无线承载开销。40%只是计算结果,不是自动通过;仍要测最坏队列和时延。
突发比平均值更重要¶
平均流量可能很低,但以下事件会同时产生消息:
- 系统启动和设备发现;
- 参数列表请求;
- 任务上传;
- 状态变化和告警;
- 多个节点重连;
- 日志或文件下载;
- OSD全屏重绘;
- 错误重试。
测试至少记录:
- 1秒、100毫秒和10毫秒窗口峰值;
- 接收、发送队列峰值;
- 低优先级丢弃;
- 关键消息最大间隔;
- 处理器负载;
- 串口或CAN错误;
- 恢复时间。
只测稳定空闲状态无法证明突发安全。
端到端时延预算¶
端到端时延可拆为:
[ T_{end}=T_{sample}+T_{wait}+T_{serialize}+T_{transport} +T_{parse}+T_{queue}+T_{consume} ]
分别表示:
- 数据采样或产生;
- 等待发送周期;
- 序列化和线路发送;
- 中间承载、无线调度或重传;
- 接收解析;
- 任务队列;
- 控制或应用任务实际使用。
测量时必须说明起点和终点。例如:
- 摇杆物理变化到飞控接收任务更新;
- 飞控状态产生到地面站显示;
- 电机命令生成到电子调速器收到;
- OSD字段变化到显示设备提交。
“串口帧耗时”不能代替端到端时延。
抖动、尾延迟和新鲜度¶
平均时延会隐藏偶发长尾。至少记录:
- 中位数;
- 第95百分位(P95);
- 第99百分位(P99);
- 最大值;
- 连续超时次数;
- 最大消息间隔。
数据新鲜度应根据产生时间判断,而不是仅根据最近收到字节。队列拥塞可能持续收到格式正确但已经过期的数据。
对于控制输入,应定义:
队列策略¶
不同消息需要不同策略:
| 消息类型 | 队列建议 |
|---|---|
| 最新状态 | 可覆盖旧状态,优先保持最新 |
| 事件 | 不能静默覆盖,需要序号和丢失指示 |
| 命令 | 需要确认、幂等和状态门禁 |
| 参数事务 | 保持请求顺序和所有权 |
| 日志或文件块 | 可重试但应限速 |
| 安全告警 | 高优先级但要防止洪泛 |
把所有消息放入同一个先进先出队列,会让过期状态阻塞实时控制。
完整性分层¶
| 机制 | 发现随机错误 | 防主动篡改 | 身份 | 防重放 | 保密 |
|---|---|---|---|---|---|
| UART奇偶校验 | 有限 | 否 | 否 | 否 | 否 |
| XOR或加法和 | 有限 | 否 | 否 | 否 | 否 |
| CRC | 较强的随机错误检测 | 否 | 否 | 否 | 否 |
| 带密钥消息认证 | 是 | 是 | 持钥身份 | 需序号/时间 | 否 |
| 认证加密 | 是 | 是 | 取决于协议 | 需序号/时间 | 是 |
“数字协议”“有校验”和“使用私有格式”都不能替代认证。
威胁建模¶
先记录攻击者可能位于:
- 物理接插件;
- 机内共享总线;
- USB主机;
- 无线数传;
- 局域网;
- 云端中继;
- 配置文件或消息定义供应链;
- 地面站插件和脚本。
再列出可被滥用的能力:
- 被动读取位置和身份;
- 修改参数;
- 注入命令;
- 重放旧命令;
- 冒充节点;
- 阻塞总线或队列;
- 降级到未认证模式;
- 替换固件或消息定义。
安全设计应基于可达路径和权限,不以“接口藏在机壳内”作为唯一防线。
身份、认证、授权¶
三个概念必须分开:
- 身份标识:系统ID、组件ID、节点ID或设备地址;
- 认证:证明对方持有密钥、证书或其他凭据;
- 授权:认证后的主体在当前状态是否可以执行某项操作。
知道节点ID不能证明对方是合法节点。签名正确也不能绕过:
- 飞行状态;
- 物理互锁;
- 命令来源策略;
- 参数范围;
- 操作员确认;
- 双人批准;
- 任务约束。
防重放¶
认证机制还需要新鲜度:
- 单调序号;
- 时间戳;
- 随机挑战;
- 会话计数器;
- 持久化接收状态。
必须定义:
- 计数器回绕;
- 设备重启;
- 时钟回退;
- 多链路共享状态;
- 丢包窗口;
- 离线恢复;
- 密钥轮换;
- 重复帧处理。
仅把时间戳放进载荷但不认证,攻击者可以同时修改时间戳和消息。
密钥管理¶
密钥生命周期包括:
- 生成;
- 安全注入;
- 设备和操作员绑定;
- 最小权限使用;
- 备份或恢复策略;
- 轮换;
- 吊销;
- 擦除;
- 审计。
禁止:
- 把密钥写入文档、截图或日志;
- 多项目长期共享同一生产密钥;
- 在公开测试样本中保留真实签名材料;
- 把默认密钥当作已部署安全;
- 为了排障长期允许所有未签名命令。
测试使用独立临时密钥和隔离环境。
可用性与降级¶
安全机制失败时不能悄悄关闭。例如:
- 签名时钟异常;
- 密钥缺失;
- 认证失败过多;
- 网络路由变化;
- 节点ID冲突;
- 总线高负载;
- 队列耗尽。
应进入明确状态:
- 只读;
- 拒绝高风险命令;
- 限制消息率;
- 使用预先批准的本地控制;
- 告警并记录;
- 需要人工恢复。
降级路径自身必须测试。不能以“保持可用”为由自动退回无认证控制。
协议安全边界表¶
| 协议 | 内建随机错误检测 | 内建认证/加密 | 主要补充控制 |
|---|---|---|---|
| CRSF | CRC8 | 不应默认假设具备 | 物理边界、消息白名单、设备状态 |
| SBUS | UART奇偶校验和帧结构 | 无 | 物理边界、新鲜度和失联状态 |
| MAVLink 2未签名 | CRC16 | 无 | 网络隔离、访问控制、命令门禁 |
| MAVLink 2签名 | CRC16和可选消息签名 | 认证与防重放;不加密 | 密钥、强制接收策略、授权 |
| MSP | XOR或CRC8 | 无 | 接口隔离、只读/写入分权、状态门禁 |
| DShot | 4位校验 | 无 | 物理隔离、输出状态机、目标映射 |
| DroneCAN | CAN链路CRC和多帧CRC | 无 | 总线隔离、白名单、网关和门禁 |
| SmartAudio/Tramp | CRC8或加法和 | 无 | 物理边界、写后回读、法规门禁 |
某个厂商可以在外层增加认证或加密,应按实际产品验证,不能由基础协议表推导。
验证计划¶
性能¶
- 正常平均负载;
- 启动和重连突发;
- 最大受支持消息率;
- 双向同时传输;
- 低优先级流量受压;
- 日志或文件下载并行;
- 温度和CPU高负载。
完整性¶
- 单比特和多比特破坏;
- 截断和超长;
- 错误消息定义;
- 错误端序;
- 重复和乱序;
- 解析器恢复。
认证¶
- 正确凭据;
- 错误凭据;
- 未签名或未认证;
- 旧序号或旧时间戳;
- 设备和网关重启;
- 密钥轮换;
- 高风险命令的状态拒绝。
完整性和认证异常注入只在离线解析器、SITL、HITL或隔离台架进行。
检查理解¶
- 为什么平均利用率较低仍可能产生长延迟?
- 数据持续到达为什么仍可能已经过期?
- CRC、认证和加密分别解决什么问题?
- 认证成功后为什么仍要做授权和飞行状态检查?
- 安全机制故障时为什么不能自动退回无认证控制?