跳转至

带宽、时延、完整性与认证

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

带宽时延完整性预算

四个目标

目标 问题
带宽 线路、总线和处理器能否承载全部帧及突发
时延 数据从产生到使用经历多久,抖动多大
完整性 接收的数据是否被意外或恶意改变
认证与授权 谁发送、是否新鲜、当前状态是否允许执行

高带宽不自动带来低时延;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帧。
线路需求
= (30×100 + 80×20 + 10×1) × 10
= 46100 bit/s

利用率
= 46100 ÷ 115200
≈ 40.0%

这还没有包含反向请求、重试、启动突发或无线承载开销。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不能证明对方是合法节点。签名正确也不能绕过:

  • 飞行状态;
  • 物理互锁;
  • 命令来源策略;
  • 参数范围;
  • 操作员确认;
  • 双人批准;
  • 任务约束。

防重放

认证机制还需要新鲜度:

  • 单调序号;
  • 时间戳;
  • 随机挑战;
  • 会话计数器;
  • 持久化接收状态。

必须定义:

  • 计数器回绕;
  • 设备重启;
  • 时钟回退;
  • 多链路共享状态;
  • 丢包窗口;
  • 离线恢复;
  • 密钥轮换;
  • 重复帧处理。

仅把时间戳放进载荷但不认证,攻击者可以同时修改时间戳和消息。

密钥管理

密钥生命周期包括:

  1. 生成;
  2. 安全注入;
  3. 设备和操作员绑定;
  4. 最小权限使用;
  5. 备份或恢复策略;
  6. 轮换;
  7. 吊销;
  8. 擦除;
  9. 审计。

禁止:

  • 把密钥写入文档、截图或日志;
  • 多项目长期共享同一生产密钥;
  • 在公开测试样本中保留真实签名材料;
  • 把默认密钥当作已部署安全;
  • 为了排障长期允许所有未签名命令。

测试使用独立临时密钥和隔离环境。

可用性与降级

安全机制失败时不能悄悄关闭。例如:

  • 签名时钟异常;
  • 密钥缺失;
  • 认证失败过多;
  • 网络路由变化;
  • 节点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或隔离台架进行。

检查理解

  1. 为什么平均利用率较低仍可能产生长延迟?
  2. 数据持续到达为什么仍可能已经过期?
  3. CRC、认证和加密分别解决什么问题?
  4. 认证成功后为什么仍要做授权和飞行状态检查?
  5. 安全机制故障时为什么不能自动退回无认证控制?

主要参考