Files
Share_Li/前端感知系统通信协议 (ICD) V2.1.md
2026-01-12 03:22:13 +00:00

48 KiB
Raw Permalink Blame History

tags, aliases, date created, date modified
tags aliases date created date modified
**前端感知系统通信协议 (ICD) V2.2**
星期一, 十二月 8日 2025, 9:01:09 上午 星期五, 一月 9日 2026, 7:27:23 晚上

前端感知系统通信协议 (ICD) V2.2

文档编号: FES-SW-ICD-002

版本: V2.2 (Header HCS/Epoch/DestID + Control Ext + Data Snapshot)

说明:版本以本页“版本”字段为准;文档编号用于配置管理索引,不随次版本必然变化。

备注:当前文件名包含 “V2.1” 属历史遗留,正文内容为 V2.2 规范;互操作时以 ProtoVer 字段为准。

适用架构: Host (CPU/GPU) <-> Device (Pure Logic FPGA)

物理链路: 10Gbps Ethernet (UDP/IP)


0. 设计变更与迁移指南 (Design Change Log)

0.1 变更综述 (Executive Summary)

本版本关注点(协议层面):

  • 一致性与可解析性:统一通用头与 PayloadLen 语义,避免解析器进入未定义行为。
  • 确定性控制闭环:控制指令具备幂等去重与 ACK 判据,禁止“猜测已执行”。
  • 高吞吐数据平面:固定偏移与自然对齐,支持零拷贝 DMA数据重组以 Key + Offset/Count 为准。
  • 可演进:保留区受校验保护,新增字段不得改变 RAW Payload 起始偏移。

0.2 详细变更对照表

1. 架构与拓扑设计 (Architecture & Topology)

变更维度 V0.1 / V1.0 (Legacy) V2.0 (Current) 设计动机与技术收益
拓扑依赖 强耦合 (IP Binding)
依赖 IP 地址 (192.168.0.x) 区分阵面。
完全解耦 (Logical SourceID)
新增 SourceID 字段,支持 DHCP 及动态组网。
支持即插即用离线数据分析pcap无需依赖环境 IP 表。
传输单元 MTU 1500 (Standard)
未明确定义,默认为标准帧。
MTU 9000 (Jumbo Frame)
强烈推荐开启巨型帧,且必须兼容 MTU 1500 运行。
在吞吐与部署兼容性之间平衡优先保证可达与稳定运行Jumbo 作为性能增强项。
维护通道 无 (None)
仅支持预定义命令。
RMA Protocol
引入 OpCode 0xFF,支持内存/寄存器直接读写。
实现波形文件的动态下载与任意寄存器的带外调试,无需修改协议固件。

2. 数据结构与内存布局 (Data Structure & Memory)

变更维度 V0.1 / V1.0 (Legacy) V2.0 (Current) 设计动机与技术收益
报文头对齐 非对齐 (15 Bytes)
奇数长度头部,导致 Payload 内存错位。
自然对齐 (32 Bytes)
强制 8 字节对齐,填充至 Cache Line 边界。
适配 FPGA 256-bit 总线与 CPU AVX 指令集,实现零拷贝 (Zero-Copy) DMA。
字节对齐 1-Byte Packed
紧凑排列,无填充。
Hybrid Alignment (混合策略)
控制面紧凑,数据面/关键字段强制对齐。
在节省带宽与降低 CPU 访问开销(避免非对齐异常)之间取得最佳平衡。
校验算法 XOR / Sum
抗干扰能力弱,无法检测双位翻转。
CRC-32C (Castagnoli)
硬件加速指令级校验。
极大地降低漏检率,特别是在雷达高功率发射环境下的突发误码检测。
扩展性 无预留
新增字段需破坏现有结构。
预留保留区 (Reserved)
控制面预留 56 字节,且置于 CRC 保护下。
确保协议升级时旧版固件不崩溃,支持向后兼容。

3. 物理量定义与精度 (Physics & Precision)

变更维度 V0.1 / V1.0 (Legacy) V2.0 (Current) 设计动机与技术收益
频率定义 索引码 (uint8)
0=15.5GHz, Step=10MHz。
范围锁定,无法捷变。
绝对物理值 (uint64)
单位Hz。
例:15,500,000,000
解耦硬件支持任意波段Ku/Ka、任意步进的频率捷变与抗干扰策略。
角度定义 量化整数 (int16)
LSB=0.0025°。< br>存在量化噪声GPU 需转换。
微单位整数 / 浮点接口
传输层:int32 (\mu^\circ)。
应用层:double (Deg)。
消除量化误差:精度提升至 10^{-6} 度,满足 AI 波束成形算法的高精度需求。
增益控制 量化步进 (uint16)
LSB=0.5dB。
依赖硬件非线性特性。
物理增益 (int32)
单位mdB。
FPGA 查表映射。
算法闭环:后端直接下发期望增益,底层自动校准,简化业务逻辑。
回波归一化 无 (None)
仅传 ADC 原始值 (Int16)。
后端无法计算 RCS。
Scale Factor (int32 微单位)
随包下发物理归一化因子(整数微单位)。
数据自描述GPU 可直接还原真实电压/功率,无需同步查询增益状态,且 FPGA 侧不需要浮点。

4. 可靠性与时序控制 (Reliability & Timing)

变更维度 V0.1 / V1.0 (Legacy) V2.0 (Current) 设计动机与技术收益
幂等性 缺失
ACK 丢包会导致指令重复执行(如电机步进 2 次)。
SeqID 去重
FPGA 缓存 Last_SeqID,重复包仅回 ACK 不执行。
防止状态过冲:确保控制指令在不可靠网络下的绝对确定性执行。
超时策略 激进 (未定义/短)
易受 OS 调度抖动影响触发重传。
宽松 (20ms)
适配 Windows/Linux 非实时核调度。
减少网络风暴:避免因系统卡顿导致的虚假超时与不必要的重传。
丢包处理 无规范
直接拼接或补零。
相干补零 (Coherent Zero-Pad)
严格补复数零 (0+j0)。
保障信号完整性:防止时域数据缺失导致的脉冲压缩相位错位与测距误差。
自闭环调度 开环 (Open Loop)
发多少脉冲依赖“停止”指令。
Pulse Count (自闭环)
指令携带脉冲数FPGA 计数自动停止。
消除网络延迟风险:防止因网络拥塞导致的发射机“长发”事故。

5. 字段级优化细节 (Field Optimization)

  • 废弃 (Deprecated): Bit-fields (位域) —— 调试困难易引发竞态条件。V2.0 全面改为 uint8 枚举。
  • 废弃 (Deprecated): FreqCode (频率码) —— 扩展性极差。
  • 新增 (New): Token (事务令牌) —— 支持异步非阻塞驱动模型(主要用于 RMA
  • 新增 (New): TaskID (任务标识) —— 支持并发多任务/多 CPI 流交错传输与无歧义重组。
  • 新增 (New): ADC Status (状态字) —— 实时标记饱和与链路质量。
  • 新增 (New): Sample Offset (采样偏移) —— 支持超长脉冲乱序重组。

1. 总则与约束 (General Provisions)

1.1 协议设计哲学:微单位整数 (Micro-Unit Integer)

规范:

  • 传输层物理量 必须 使用整数表示(频率 Hz、角度 $\mu^\circ$、增益 mdB、时间 ns 等),禁止在协议层引入 IEEE 754 浮点依赖(除非字段明确标注为仿真/回放用途)。
  • SPS 驱动层 必须 负责完成“物理量(浮点)↔ 微单位整数”的无损转换;业务代码 不得 直接操作/硬编码协议整数。

1.2 物理量数据类型定义

所有控制指令中的物理量必须遵循以下严格的类型与单位定义:

物理量分类 协议数据类型 基础单位 (Unit) 换算公式 (Software View) FPGA 处理逻辑 示例
频率 (Freq) uint64 Hz (赫兹) Val_{phy} = Val_{raw} 直接写入 DDS 频率控制字 (FCW) 15.5GHz \to 15,500,000,000
角度 (Angle) int32 $\mu^\circ$ (微度) Val_{phy} = Val_{raw} \times 10^{-6} 整数乘法 + 移位计算移相器状态 45.0° \to 45,000,000
增益 (Gain) int32 mdB (毫分贝) Val_{phy} = Val_{raw} \times 10^{-3} 查表 (LUT) 映射衰减器电压 30.5dB \to 30,500
时间 (Time) uint64 ns (纳秒) Val_{phy} = Val_{raw} \times 10^{-9} (sec) 直接与 PTP 计数器比较 1 秒 \to 1,000,000,000
带宽 (BW) uint64 Hz (赫兹) Val_{phy} = Val_{raw} 用于配置 DDC 抽取率 100MHz \to 100,000,000

1.3 基础架构约束

规范:

  • 字节序:所有 uint16/uint32/uint64/int32/int16 等多字节字段 必须 采用 Little-Endian。
  • 传输UDP/IPv4。
  • MTU:应优先使用 Jumbo9000以降低中断与包头开销系统 必须 能在 MTU 1500 下工作。
  • 分片:发送端 必须 在应用层按路径 MTU 切包,禁止依赖 IP 分片。

1.4 混合对齐策略 (Hybrid Alignment)

为平衡传输带宽与处理效率,协议在不同平面采用不同的对齐策略:

  1. 控制平面 (SPS \to DACS)

    • 采用 1-Byte Packed (紧凑模式)(以减少带宽开销)。
  2. 数据平面 (DACS \to SPS)

    • 采用 8-Byte Natural Alignment (自然对齐)(以匹配 DMA/Cache Line/向量化读取)。

2. 通用报文头 (Common Header)

规范(必须):

  • 所有 UDP 报文Control/Status/Data/RMA必须携带该通用报文头,且位于 UDP Payload 起始处。
  • 报文头长度 固定为 32 Bytes;多字节字段 必须 Little-Endian。
  • 接收端 必须 先完成以下检查后才允许继续解析:
    • Magic Word 正确;
    • HCS 校验通过(见 2.3.4
    • PayloadLen 与实际 UDP 应用层长度一致(UdpPayloadBytes == 32 + PayloadLen)。
  • 对齐/保留:Reserved 必须 全 0接收端遇到非 0 时可告警但不得改变兼容性行为。

2.1 报文头结构定义

偏移 (Offset) 字段名 (Field Name) 数据类型 说明与约束
0 Magic Word uint32 协议同步魔数,固定为 0x55AA55AA
用于从二进制流中快速定位帧首,防止滑窗错误。
4 SeqID uint32 按流递增的包序列号(非全局)。
递增作用域:(SourceID, PacketType, Direction) 组成的一条逻辑流。接收端用于丢包检测与乱序重排。
8 Timestamp uint64 PTP 纳秒时间戳
统一使用 Unix Epoch (1970-01-01 00:00:00 ns),用于全系统时序对齐。
16 PayloadLen uint16 后续载荷 (Payload) 的有效字节长度。
不包含本 Header 的 32 字节。
18 PacketType uint16 报文类型标识:
0x01: Control (控制指令)
0x02: Status (状态遥测)
0x03: Data (回波数据)
0xFF: RMA (维护通道)
20 ProtoVer uint8 协议版本号
高 4 位为主版本,低 4 位为次版本。
当前 V2.2 对应 0x22V2.1 为 0x21V2.0 为 0x20)。
21 SourceID uint8 源设备逻辑 ID (拓扑解耦的关键)。
0x01: SPS (主控)
0x10: DACS-Broadcast
0x11~0x1F: DACS-Unicast
22 FrameFlags uint16 分帧标志位 (Bitmask)
用于处理跨 UDP 包的巨型数据帧重组。
Bit0: SOF (Start of Frame)
Bit1: EOF (End of Frame)
Bit2-15: Reserved (0)
24 HCS uint16 Header Checksum
用于校验 Header 前 24 字节,防止 PayloadLen/PacketType 位翻转导致解析异常。计算规则见 2.3.4。
26 Epoch uint16 会话代号 / SessionID
SPS 每次启动/链路重建递增,用于区分“新会话”与旧包残留,并解决设备重启后 SeqID 回绕导致的幂等性冲突。
28 DestID uint8 目的设备逻辑 ID
用于多阵面环境下的快速过滤与防错发。广播可使用 0x10
29 Reserved uint8[3] 对齐保留
必须全填 0x00。确保 Header 总长为 32 字节。

2.2 内存布局图解 (Memory Layout)

| 0      1      2      3      | 4      5      6      7      | (Byte Offset)
+-----------------------------+-----------------------------+
|         Magic Word          |           Seq ID            |
+-----------------------------+-----------------------------+
|                      Timestamp (Lo)                       |
+-----------------------------+-----------------------------+
|                      Timestamp (Hi)                       |
+-----------------------------+-----------------------------+
|  PayloadLen  |  PacketType  |  Ver | SrcID  | FrameFlags  | <--- 紧凑信息区
+-----------------------------+-----------------------------+
|   HCS (2B)   |  Epoch (2B)  | DestID (1B) | Reserved (3B) |
+-----------------------------+-----------------------------+

2.3 关键字段语义详解

2.3.0 SeqID 作用域与回绕处理(必须)

SeqID 规范(必须):

  • SeqID按逻辑流递增 的序列号,递增作用域为 (SourceID, PacketType, Direction)
  • Direction 由系统角色与 PacketType 隐含确定:
    • Control0x01SPS → DACS
    • Data0x03DACS → SPS
    • Status/ACK0x02):通常为 DACS → SPS对 Control/RMA 的确认与遥测);若实现需要也可 SPS → DACS 发送 Telemetry/Keepalive但必须使用独立的 SeqID 流。
    • RMA0xFF双向SPS ↔ DACS两方向必须视为两条独立 SeqID 流。
  • 回绕比较 必须 使用模 2^{32} 的半区间规则(禁止用 > 直接比较):
    • 令 $\Delta = (SeqID_{new} - SeqID_{last})\bmod 2^{32}$(以 uint32 自然溢出实现)。
    • 0 < \Delta < 2^{31} 时,判定为 新包
    • \Delta = 0 时,判定为 重复包
    • 2^{31} \le \Delta < 2^{32} 时,判定为 旧包/乱序包

实现建议FPGA/软件统一采用上述规则,确保回绕时幂等/去重一致。

2.3.1 版本控制 (ProtoVer) —— 解决“协议锁死”

规范(必须):接收端 必须 先检查 ProtoVer

  • ProtoVer == 本地版本:按本规范解析。
  • ProtoVer > 本地版本:接收端 不得 继续按旧格式“猜测解析”;应进入兼容模式或直接丢弃并告警。
  • ProtoVer < 本地版本:接收端应按向后兼容策略解析(至少保证通用头字段语义不变),并忽略未定义/保留字段。

2.3.2 源标识 (SourceID) —— 解决“拓扑依赖”

规范(必须):接收端设备识别 必须SourceID 为准,不得依赖 src_ip

ID 分配表: - 0x01: Signal Processing System (SPS) - 0x11: DACS - Array 01 (Front) - 0x12: DACS - Array 02 (Left) - 0x13: DACS - Array 03 (Right)

说明:离线分析与 DHCP 环境下均可保持一致识别。

2.3.3 帧标志 (FrameFlags) —— 解决“数据拼图”

规范(推荐):FrameFlags 用于显式标记同一“帧”的边界。

  • 一条待重组的上层数据帧(典型为单脉冲回波序列;也可扩展到 CPI 级帧)可能远超 MTU需拆分为多个 UDP 包。
  • 标志定义:
    • 单包帧 (Single Packet): 数据很小,一个包发完。
      • 设置 SOF=1, EOF=1
    • 多包帧 - 首包 (First Packet):
      • 设置 SOF=1, EOF=0
    • 多包帧 - 中间包 (Middle Packet):
      • 设置 SOF=0, EOF=0
    • 多包帧 - 尾包 (Last Packet):
      • 设置 SOF=0, EOF=1

接收端处理建议:对 Data 包优先按 6.3 的相干补零策略保持时间轴;对 Control/RMA 由超时重传闭环。

约定说明(推荐):对于 PacketType=0x03 (Data),若实现需要使用 FrameFlags,建议将其“帧”边界按 4.4 的 Key 维度(即单脉冲回波序列)定义;若仅依赖 Sample Offset/Sample Count 重组,则可将 FrameFlags 置 0。

2.3.4 HCS / Epoch / DestIDV2.2 新增)

  • HCS (Header Checksum)
    • 覆盖范围Header 的前 24 字节Offset 0..23),即从 Magic WordFrameFlags
    • 算法(必须)CRC-16/CCITT-FALSEPoly 0x1021Init 0xFFFFRefIn=falseRefOut=falseXorOut 0x0000)。
    • 校验失败处理(必须):接收端必须直接丢弃该包(静默丢弃),不得继续解析 PayloadLen
  • Epoch (SessionID)
    • SPS 必须在每次启动或链路重建时递增 Epoch16-bit 自然回绕)。
    • DACS/SPS 在做幂等去重与乱序处理时,应将 Epoch 视为逻辑流键的一部分;当 Epoch 变化时,应重置该流的 Last_Executed_SeqID 等状态。
  • DestID
    • DestID 为目的设备逻辑 ID用于快速过滤与防错发。
    • 推荐约定:
      • SPS → DACS 单播 Control/RMADestID = 0x11..0x13(目标阵面)
      • SPS → DACS 广播 ControlDestID = 0x10
      • DACS → SPS Data/StatusDestID = 0x01

3. 控制平面 (Control Plane)

方向: Signal Processing System (SPS) \to Data Acquisition Control System (DACS)

协议: UDP Unicast

端口: 20000 (Base Port) + DACS_ID

报文总长: 固定 160 Bytes (32 Bytes Common Header + 128 Bytes Control Payload)

3.0 端口与阵面映射约定

  • 服务器侧通过 4 口 10GbE 采集卡接入,其中 3 口分别对应 3 个阵面数据口。
  • DACS_ID 取值范围:1..3(阵面编号)。
  • SourceIDDACS_ID 映射(固定约定):
    • DACS_ID=1 -> SourceID=0x11Array 01 / Front
    • DACS_ID=2 -> SourceID=0x12Array 02 / Left
    • DACS_ID=3 -> SourceID=0x13Array 03 / Right

广播约定(必须):

  • SourceID=0x10 (DACS-Broadcast) 为广播语义保留 ID。
  • 本版本中,广播仅用于 控制平面下行SPS → DACS 的“同参同步”场景SPS 可向 UDP 目的端口 20000Base Port 发送一份控制指令DACS 侧必须同时监听 20000广播端口20000 + DACS_ID单播端口
  • DACS 对广播控制指令的 Status/ACK 响应必须使用各自的单播 SourceID=0x11..0x13 回传,禁止使用 0x10 回传。
  • 数据平面30000+ID与 RMA40000+ID不定义广播语义。

3.1 设计约束

  1. 整数/微整数 (Integer-Only): 控制面所有关键物理量字段均采用 int32/uint32/uint64 等整数表达(角度使用 $\mu^\circ$,增益使用 mdB。FPGA 侧无需、也不允许实现 IEEE 754 浮点解析与运算。
  2. 偏移稳定 (Offset-Stable): 为减少固件改动风险,本版本尽量保持 Center Freq 等关键 uint64 字段偏移不变;在角度字段之间使用显式保留字以保持对齐与兼容。
  3. 末尾校验 (Tail Checksum): 校验字段 CRC32C 固定在载荷最末尾Offset 124。该字段用于对整个 UDP 载荷进行完整性校验(见 6.4 统一 CRC 覆盖规则)。
  4. 自闭环调度: 引入 Pulse Count 字段。FPGA 收到指令后,将严格执行指定数量的脉冲发射,完成后自动停止发射并转入空闲状态,消除因网络延迟导致的波束过时或“长发”风险。
  5. 并发任务 (TaskID): 为支持“并发多任务”(多个 CPI/Pulse 流交错),控制面下发 TaskID,数据面回传同一 TaskID 以实现无歧义重组。

参数校验规范(必须):

  • DACS 在执行控制指令前 必须 完成关键字段的范围与一致性检查;检查失败则 不得执行,并通过 Status/ACK 返回 Applied=0ErrorCode=BadParam
  • 关键一致性最小集合(必须):
    • Pulse Width 必须满足 $PulseWidth < 10^9/PRF$(单位换算后等价于脉宽小于 PRI否则拒绝
    • Sample Points > 0 且不得超过硬件上限(实现需给出上限常量);
    • Pulse Count > 0 且不得超过硬件上限;
    • Bandwidth > 0 且不得超过 ADC/DDC 允许带宽;
    • Center Freq 必须落在前端射频工作带内;
    • GainTarget_mdB 必须落在可控增益范围内。
  • TaskID 语义(必须):若上述任一会影响数据平面重组边界/数据长度的参数发生变化(如 Sample PointsPulse Count、波形模式SPS 必须 分配新的 TaskID,不得复用旧 TaskID

3.2 载荷定义 (Control Payload)

相对偏移 (Offset) 字段名 (Field Name) 数据类型 单位 (Unit) 说明与物理定义
0 Command Mode uint8 - 工作模式
0: Standby (待机/静默)
1: Search (搜索)
2: Track (跟踪)
3: Calibrate (内/外校准)
1 Waveform ID uint8 Index 基础波形索引
指向 FPGA 内部 DDR 预存的波形表(如 LFM 基带数据)。
2 Reserved_Pad uint8[2] - 对齐填充
必须填 0x00。确保后续 Azimuth 从 Offset 4 开始。
4 Azimuth_uDeg int32 $\mu^\circ$ 方位角 (\theta)。范围 [-90°, 90°]。软件换算:$\theta[deg] = Val_{raw} \times 10^{-6}$。
8 Reserved_AnglePad0 uint32 - 对齐保留(必须为 0。用于保持后续字段偏移稳定并便于硬件解析。
12 Elevation_uDeg int32 $\mu^\circ$ 俯仰角 (\phi)。范围 [-90°, 90°]。软件换算:$\phi[deg] = Val_{raw} \times 10^{-6}$。
16 Reserved_AnglePad1 uint32 - 对齐保留(必须为 0
20 Center Freq uint64 Hz 载波中心频率
绝对物理值(如 15,500,000,000),直接控制本振 (LO)。
28 Bandwidth uint64 Hz 信号瞬时带宽
用于配置接收机 DDC 滤波器的抽取率与带宽。
36 Pulse Width uint32 ns 脉冲宽度 (\tau)
发射波形的有效持续时间,决定雷达盲区与平均功率。
40 PRF uint32 Hz 脉冲重复频率
决定最大无模糊距离。
44 Sample Points uint32 Count 快拍数 (Range Gates)
单次脉冲回波的 ADC 采样点数(如 4096
48 Pulse Count uint32 Count 驻留脉冲数 (N_{cpi})
本次 CPI 包含的脉冲总数。FPGA 计数达到此值后自动停止。
52 GainTarget_mdB int32 mdB 期望增益。软件换算:$G[dB] = Val_{raw} \times 10^{-3}$。DACS 通过 LUT/标定表映射为模拟衰减/增益控制量。
56 Wave_Param1 uint32 - 波形动态参数 1
例如 LFM 的调频斜率 (Slope) 或相位编码的初相。
60 Wave_Param2 uint32 - 波形动态参数 2
预留给特定波形的高级控制参数。
64 TaskID uint32 - 并发任务标识。由 SPS 分配(建议单调递增或随机非零)。用于区分同一时刻交错的多 CPI 流。
68 Az_Broaden_Factor uint8 Index 方位展宽倍数索引
0: 1x不展宽; 1: 2x; 2: 3x…具体映射由系统配置表定义
69 El_Broaden_Factor uint8 Index 俯仰展宽倍数索引
编码同上。
70 PRF_Jitter_Mode uint8 Enum PRF 抖动模式
0: Off; 1: Deterministic (参差); 2: Random (随机)。
71 Reserved_ExtPad0 uint8 - 对齐填充,必须为 0。确保后续 uint32 4 字节对齐。
72 Sample_Delay_ns uint32 ns 采样起始延迟
定义采样窗起点相对发射时刻的纳秒延迟,用于波门控制。
76 Sim_Target_Dist_ns uint32 ns 模拟目标距离延迟(内测/校准)。
以等效传播时延ns表达。
80 Sim_Target_Vel_mmps int32 mm/s 模拟目标速度(内测/校准)。
84 Phase_Init uint32 - 脉冲初始相位控制字(波形精细化)。
88 Reserved uint8[36] - 扩展保留区(剩余)
必须全填 0x00处于 CRC 保护之下
124 CRC32C uint32 - 完整性校验
算法CRC-32C (Castagnoli)。
覆盖范围:Common Header + Control Payload (不含 CRC 字段本身)(详见 6.4)。

3.3 内存布局图解 (Memory Layout)

以下视图用于核对控制载荷的字节偏移与字边界。

3.3.1 RFC 标准比特视图 (Bit-Level View)

每行代表 32-bit (4 Bytes),左侧为起始偏移量。

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Command Mode |  Waveform ID  |      Reserved_Pad (0x0000)    | 0x00
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Azimuth_uDeg (int32)                      | 0x04
|                 Reserved_AnglePad0 (uint32=0)                  | 0x08
|                     Elevation_uDeg (int32)                     | 0x0C
|                 Reserved_AnglePad1 (uint32=0)                  | 0x10
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Center Freq (uint64)                    | 0x14
+                                                               +
|                       (8 Bytes Total)                         | 0x18
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Bandwidth (uint64)                     | 0x1C
+                                                               +
|                       (8 Bytes Total)                         | 0x20
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Pulse Width (uint32)    |           PRF (uint32)        | 0x24 / 0x28
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Sample Points (uint32)   |       Pulse Count (uint32)    | 0x2C / 0x30
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     GainTarget_mdB (int32)    |       Wave_Param1 (uint32)    | 0x34 / 0x38
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Wave_Param2 (uint32)    |         TaskID (uint32)       | 0x3C / 0x40
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
/                   Reserved (Total 36 Bytes)                   /
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        CRC32C (End)                           | 0x7C
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

3.3.2 关键字段说明

  • 对齐填充 (Reserved_Pad):
    • 位置: Offset 2-3 (2 Bytes)。
    • 作用: 强制将当前的写入指针推移至 Offset 4使后续字段保持偏移稳定并对齐友好。
    • 值约束: 必须填 0x0000
  • 物理量整数编码 (Azimuth_uDeg / Elevation_uDeg / GainTarget_mdB):
    • 角度采用 $\mu^\circ$(微度)整数编码,避免量化误差与 FPGA 浮点。
    • 增益采用 mdB毫分贝整数编码满足 0.001 dB 级别控制分辨率。
  • 末尾校验 (CRC32C):
    • 位置: Offset 124 (最后 4 字节)。
    • 覆盖范围: Common Header + Payload不含 CRC 字段)
    • 封闭性: 这种设计使得整个 128 字节结构体是一个自包含的“安全胶囊”。任何对保留区的无意篡改(如内存越界写)都能被 CRC 检出。

3.4 ACK/Status 机制概述(必须)

  • 控制平面基于 UDP 运行,必须通过 SeqID 去重 + PacketType=0x02 (Status/ACK) 回执 + 超时重传来构建确定性闭环。
  • 执行成功的唯一判据SPS 必须以收到的 ACKStatusFlags.Applied=1ErrorCode==0)作为“指令已执行”的判据;任何未被 ACK 确认的控制指令不得假定已生效。
  • Status/ACK 的完整载荷格式定义见 6.1.2

4. 数据平面 (Data Plane)

方向: DACS \to SPS

协议: UDP Unicast

端口: 30000 (Base Port) + DACS_ID映射规则同 3.0

PacketType必须PacketType == 0x03 (Data)

4.1 报文格式与校验 (Format & Validation)

报文结构(固定前缀):

  • [Common Header (32B)] + [Data Specific Header (32B)] + [Execution Snapshot (64B)] + [RAW Payload (Variable)]

长度与一致性(必须):

  • UdpPayloadBytes 为 UDP Payload 的实际字节数,则接收端 必须 校验:UdpPayloadBytes == 32 + PayloadLen
  • 对于 Data 包,PayloadLen 必须 满足:
    • PayloadLen == 32 + 64 + RawPayloadBytes
    • C = PopCount(Channel Mask)B 为每个分量的字节数(由 Data Type 决定Int16=2Int32=4Float32=4
      • RawPayloadBytes == SampleCount * C * (2 * B)
  • 任一校验失败:接收端 必须 丢弃该包(防止越界重组)。

对齐(必须):

  • RAW Payload 起始偏移固定为 128 字节($32+32+64$),为 64B Cache Line 的整数倍。

SeqID必须

  • 对于同一逻辑流(按 2.3.0 的 (SourceID, PacketType, Direction)),发送端 必须 每发送一个 UDP 数据包使 SeqID 递增 1自然回绕按 2.3.0 规则处理)。

4.2 数据专用头 (Data Specific Header, 32B)

位置:紧随通用报文头之后,长度固定 32B。

偏移 字段名 类型 规范与语义(必须/推荐)
0 CPI_Index uint32 相干处理间隔索引(同一任务内的宏观时间维度)。
4 Pulse_Index uint32 脉冲索引(同一 CPI 内从 0 开始)。
8 Sample_Rate_Hz uint32 采样率Hz。推荐与任务上下文一致不一致时接收端应告警并可丢弃该帧。
12 SampleCount uint32 本包采样点数(每通道复数点数)。必须 > 0。与 PayloadLen 的关系必须满足 4.1。
16 SampleOffset uint32 本包数据在同一重组键 Key 对应序列中的起始点号(点数)。首片通常为 0。
20 Scale_uV int32 Data Type 为 Int16/Int32 时表示 $\mu V/LSB$;当 Data Type 为 Float32 时 必须为 0
24 ChannelMask uint16 通道掩码。Bit0=$\Sigma$Bit1=$\Delta_{Az}$Bit2=$\Delta_{El}$Bit3=Aux其余位保留 0。
26 DataType uint8 0x00=Int160x01=Float32仅回放/仿真),0x02=Int32。
27 ADC_Status uint8 ADC/链路状态位图(按实现定义扩展)。保留位必须为 0。
28 TaskID uint32 任务标识(与控制面一致)。用于跨包/跨流重组与跨平面绑定。

4.3 执行状态快照区 (Execution Snapshot, 64B, V2.2)

位置:紧随 Data Specific Header 之后,长度固定 64B。

规范(必须):

  • 该区长度 必须固定为 64B;旧实现可将其视为 Padding 并填 0。
  • 所有 Reserved_* 字段 必须 填 0接收端可告警但不得依赖其非 0 语义。

字段布局(相对快照区起始偏移):

偏移 字段名 类型 单位 说明
0 Applied_Freq_Hz uint64 Hz 硬件实际发射/本振频率快照。
8 Applied_Gain_mdB int32 mdB 接收链路物理增益快照。
12 Applied_Azimuth_uDeg int32 \mu^\circ 硬件实际方位角快照。
16 Applied_Elevation_uDeg int32 \mu^\circ 硬件实际俯仰角快照。
20 Hardware_Health_Bitmask uint32 - 硬件健康位图(按实现定义)。
24 Device_Temp_0p1C int16 0.1°C 温度快照。
26 Reserved_SnapPad0 uint16 - 必须为 0。
28 Broaden_Snapshot uint8 - 展宽实际状态快照。
29 Data_Source_Attr uint8 - 数据来源属性示例0=真实回波1=内校准)。
30 Reserved_SnapPad1 uint16 - 必须为 0。
32 Reserved_Snapshot uint8[32] - 必须为 0。

4.4 原始载荷 (Raw Payload)

位置:紧随 64B 快照区之后(起始偏移固定 128B

排列必须按“点交织Point-Interleaved+ I/Q 交织”排列:

[I0_Ch0][Q0_Ch0] [I0_Ch1][Q0_Ch1] ... [I0_Ch(C-1)][Q0_Ch(C-1)]
[I1_Ch0][Q1_Ch0] [I1_Ch1][Q1_Ch1] ...
...

数据类型(必须):

  • Int16I/Q 为 int16 Little-Endian。
  • Int32I/Q 为 int32 Little-Endian。
  • Float32I/Q 为 IEEE754 float32(仅回放/仿真);Scale_uV 必须为 0。

Scale_uV 处理(必须):

  • DataType 为 Int16/Int32Scale_uV 必须非 0且建议满足 $|Scale_uV| \le 2^{30}$。
  • 主机侧换算推荐:乘法在至少 64-bit 精度下进行。

4.5 重组规则 (Reassembly)

重组键(必须):


Key = (SourceID,\; TaskID,\; CPI\_Index,\; Pulse\_Index,\; ChannelMask,\; DataType)

分片写入(必须):

  • 同一 Key 下,使用 SampleOffsetSampleCount 将 RAW Payload 写入对应接收缓冲。
  • 缺失区间必须按 6.3 执行相干补零。
  • SeqID 仅可作为“全局丢包提示”;不得SeqID 推导某个 Key 的缺失 Offset。

4.6 跨平面绑定与帧边界 (Control Binding)

任务上下文(必须):

  • 对于任意 Data 包,其 (SourceID, TaskID) 必须能在 SPS 侧命中任务上下文(由最近一次成功执行的 Control 指令建立)。
  • 上下文至少包含:Sample PointsPulse Count,(可选)期望 Sample Rate、以及用于诊断的中心频率/带宽等。

参数不变性(必须):

  • 在同一 (SourceID, TaskID) 生命周期内,影响数据长度/帧边界的参数不得漂移若需要变更SPS 必须分配新的 TaskID

FrameFlags推荐

  • 若实现使用 FrameFlags 标记边界,则对 Data 包建议满足:
    • SOF==1 当且仅当 SampleOffset==0
    • EOF==1 当且仅当 SampleOffset + SampleCount == Sample Points(来自任务上下文)。
  • 若实现不使用 FrameFlags,可置 0但不得与 SampleOffset/SampleCount 语义冲突。

5. 维护平面 (RMA Protocol)

方向: 双向 (SPS \leftrightarrow DACS)

协议: UDP Unicast

端口: 40000 (Base Port) + DACS_ID

DACS_IDSourceID 的映射规则同 3.0。

报文结构: [Common Header (32B)] + [RMA Header (16B)] + [Data Payload] + [CRC32C (4B)]

5.1 关键设计准则

  1. 强制对齐 (Alignment Enforcement): RMA 头部长度被扩充并锁定为 16 Bytes。结合 32 Bytes 的通用头Payload 的绝对起始偏移量为 48 Bytes。这既是 8 字节的倍数也是 16 字节的倍数,确保 CPU AVX 指令集与 FPGA AXI 总线 DMA 引擎均能以最高效率进行突发读写。
  2. 异步事务 (Async Transaction): 引入 Token 字段。SPS 驱动层可为每个读写请求分配唯一的令牌(如 UUID Hash 或自增 IDDACS 在响应时必须原样回传该令牌。这使得上层软件能够采用高效的异步 Promise/Future 模式,无需阻塞等待 IO彻底消除了并发请求下的乱序匹配风险。
  3. 显式状态 (Explicit Status): 引入 Status 字段。DACS 不再仅仅是“沉默的执行者”,而是具备了反馈能力。针对地址越界、写保护或硬件超时等异常情况,能明确返回错误码,极大降低了系统集成的调试难度。

5.2 RMA 专用头 (RMA Specific Header)

该头部紧随通用报文头之后,长度固定为 16 Bytes

5.2.1 RFC 风格比特视图 (Bit View)

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---------------------------------------------------------------+
|    OpCode (8) |   Target (8)  |   Status (8)  |  Reserved (8) |
+---------------------------------------------------------------+
|                         Token (32 bits)                       |
|               (Transaction ID for Async Match)                |
+---------------------------------------------------------------+
|                        Address (32 bits)                      |
|               (Target Memory/Register Offset)                 |
+---------------------------------------------------------------+
|                         Length (32 bits)                      |
|                     (Payload Size in Bytes)                   |
+---------------------------------------------------------------+
|                                                               |
|                     Data Payload (Variable)                   |
|                  (Start at Offset 48, Aligned)                |
|                                                               |
+---------------------------------------------------------------+
|                         CRC32C (4B)                            |
|   (Covers Common Header + RMA Header + Data Payload, no CRC)  |
+---------------------------------------------------------------+

5.2.2 字段语义详解

相对偏移 (Offset) 字段名 (Field Name) 数据类型 说明与业务逻辑
0 OpCode uint8 操作码
请求 (Req): 0x01=Write, 0x02=Read
响应 (Resp): 0x81=Write Ack, 0x82=Read Resp
1 Target uint8 目标区域
0x00: FPGA Regs (32-bit MMIO)
0x01: Waveform DDR (Bulk Memory)
0x02: Flash (Firmware Update)
2 Status uint8 响应状态码 (仅响应包有效,请求包填 0)。
0x00: Success (成功)
0x01: Invalid Addr (地址无效/越界)
0x02: Write Protected (写保护)
0x03: Hardware Timeout (硬件超时)
0x04: Bad Length (长度非法)
3 Reserved uint8 对齐填充
必须填 0x00
4 Token uint32 事务令牌
由主机驱动生成建议单调递增。FPGA 必须在响应包中原样拷贝此字段,用于软件层的 Request-Response 匹配。
8 Address uint32 目标地址
对于寄存器 (Target=0x00),为寄存器偏移量。
对于 DDR/Flash为绝对字节地址。
12 Length uint32 载荷长度
单位:字节。
对于写操作Payload 的实际长度。
对于读操作:请求读取的长度。

长度与校验约定

  • Length 仅指 Data Payload 的字节数(不包含 RMA Header 与 CRC32C
  • PayloadLenCommon Header包含RMA Header (16B) + Data Payload (Length) + CRC32C (4B)
  • CRC32C 为包尾追加字段,计算范围覆盖 Common Header + RMA Header + Data Payload(不含 CRC 字段本身)。

5.3 典型交互流程 (Transaction Flow)

场景 1波形下载 (Write Waveform)

  1. SPS 发送:

    • OpCode: 0x01 (Write)
    • Target: 0x01 (DDR)
    • Token: 0x12345678
    • Address: 0x10000000
    • Length: 4096
    • Payload: [4KB Waveform Data…]
  2. DACS 响应:

    • OpCode: 0x81 (Write Ack)
    • Status: 0x00 (Success)
    • Token: 0x12345678 (原样返回)
    • Length: 0 (无 Payload)

场景 2并发状态轮询 (Async Read)

  1. SPS 发送请求 A (读温度): Token=101, Addr=0x10 (Temp Reg)

  2. SPS 发送请求 B (读电压): Token=102, Addr=0x20 (Volt Reg)

  3. DACS 响应 B (先返回): Token=102, Status=Success, Payload=[电压值]

    • 软件驱动层: 唤醒 Promise B 的回调。
  4. DACS 响应 A (后返回): Token=101, Status=Success, Payload=[温度值]

    • 软件驱动层: 唤醒 Promise A 的回调。

6. 校验与可靠性 (Reliability & Timing)

适用范围: 全系统 (SPS + DACS)

目标: 确保在 UDP 不可靠传输协议之上构建满足雷达战术指标的确定性Determinism与安全性Safety

6.1 控制平面:幂等性设计 (Idempotency)

规范(必须):控制/维护指令在 UDP 重传场景下 必须幂等DACS 必须按 SeqID 去重,重复包只回 ACK 不重复执行。

6.1.1 FPGA 接收状态机逻辑

FPGA 内部需为每条控制/维护逻辑流维护一个寄存器 Last_Executed_SeqID(按 2.3.0 的逻辑流维度独立,初始化为 0。当收到新的控制指令PacketType=0x01 或 RMA=0xFF必须按 2.3.0 的回绕安全比较规则判定(令 $\Delta=(SeqID_{new}-SeqID_{last})\bmod 2^{32}$

  1. 新指令($0 < \Delta < 2^{31}$

    • 动作:立即执行指令。
    • 更新Last_Executed_SeqID \leftarrow SeqID_{new}
    • 回复:发送 ACKPacketType=0x02AckSeqID=SeqID_{new},并携带执行结果)。
  2. 重传指令($\Delta = 0$

    • 动作严禁重复执行Drop Payload
    • 更新:保持不变。
    • 回复重发 ACKPacketType=0x02AckSeqID=SeqID_{new},并携带与首次执行一致的结果)。
  3. 旧包/乱序包($2^{31} \le \Delta < 2^{32}$

    • 动作:丢弃。
    • 回复:无需回复。

6.1.2 ACK/Status 报文PacketType=0x02

规范(必须):本协议使用 PacketType=0x02 作为 ACK/状态承载。

报文结构:[Common Header (32B)] + [Status Payload (32B)] + [CRC32C (4B)]

Status Payload 定义(固定 32B

相对偏移 字段名 类型 说明
0 StatusType uint16 0x0001: ControlAck, 0x0002: RmaAck, 0x0003: Telemetry
2 StatusFlags uint16 Bit0: Applied(已执行)Bit1: Duplicate(重复包未执行);其余保留 0
4 AckSeqID uint32 被确认/关联的命令 SeqIDControl/RMA 请求的 SeqID
8 Token uint32 RMA 用 TokenControlAck 填 0
12 TaskID uint32 ControlAck 用 TaskIDRmaAck 填 0 或实现自定义
16 ErrorCode uint32 0: Success非 0 表示错误码(见下)
20 Detail0 uint32 可选细节(如错误地址低 32 位、校验失败计数等),无则填 0
24 Detail1 uint32 可选细节(无则填 0
28 Reserved uint32 必须填 0

CRC32C 规则:覆盖 Common Header + Status Payload(不含 CRC 字段)。

SeqID 规则(必须):

  • 对于用于确认/回执的 Status/ACK 报文(StatusType=ControlAckRmaAckCommon Header 的 SeqID 必须等于 AckSeqID
  • 对于遥测类报文(StatusType=TelemetryAckSeqID 必须为 0,且其 Common Header 的 SeqID 属于 Telemetry 自身的独立序列(仍按 2.3.0 的规则递增/回绕)。

ErrorCode 建议(可扩展):

  • 0x00000000: Success
  • 0x00000001: BadCRC
  • 0x00000002: BadParam (非法参数/越界)
  • 0x00000003: Busy (资源忙/暂不可用)
  • 0x00000004: Unsupported (不支持的模式/波形)
  • 0x00000005: InternalError

6.2 控制平面:重传与超时 (Retransmission Strategy)

规范(推荐):采用固定超时 + 有界重试;超时/重试达到上限后进入链路故障处理,并触发安全互锁。

6.2.1 计时器参数

参数项 推荐值 说明
Initial Timeout 20ms 初始等待时间。涵盖了 "RTT + FPGA 处理时间 + OS 调度抖动"。
Max Retries 3 次 最大重试次数。
Link Down Time 100ms 判定链路断开的总时间阈值 (20ms \times (1+3) + \Delta)。

6.2.2 故障处理流程

  1. SPS 发送: 发出指令,启动 20ms 计时器。

  2. SPS 等待:

    • 若收到 ACK 且 AckSeqID == Cmd.SeqIDErrorCode==0: 事务成功,清除计时器。
    • 若 20ms 超时: Retry_Cnt++重发指令SeqID 不变)。
  3. SPS 放弃:

    • Retry_Cnt > 3: 判定链路故障 (Link Down)。
    • 安全互锁 (Safety Interlock): SPS 必须立即停止后续波束调度,并向上层业务软件抛出 E_LINK_LOST 异常。若系统包含硬件看门狗DACS 应在 100ms 无指令后自动切断发射机高压。
  4. DACS 侧强制互锁(必须):

    • DACS 必须实现独立于 SPS 的安全闭环:当连续 100ms 未收到“有效控制指令”(至少要求 CRC 校验通过;若系统启用网络层安全/认证,则还必须通过对应安全校验)时,必须自动进入 Standby 并关闭发射相关使能(包括但不限于发射机高压/功放使能/波形播放)。
    • 该互锁应优先由硬件看门狗或等效的 FPGA 计时逻辑实现,禁止仅依赖主机软件。

6.3 数据平面:丢包处理 (Data Loss Handling)

规范(必须):数据平面丢包后 必须 执行相干补零(缺失采样等价为复数 0以保持时间轴与相位一致性。

6.3.1 补零规范

当 SPS 在同一重组键 Key 下检测到丢包(通过 Sample Offset/Sample Count 不连续)时,必须在接收 Buffer 中填充数据,填补空缺,维持时间轴对齐。

注意:在允许多个 Key 交织到达的前提下,SeqID 跳变只能说明数据平面“全局存在丢包”,无法唯一定位是哪个 Key 缺失,因此不得单独据此计算缺失区间并补零。

  • 填充内容: 复数零 (0 + j0)

    • I 路 = 0 (0x0000)
    • Q 路 = 0 (0x0000)
  • 填充长度: 严格等于丢失的采样点数(每通道复数点数)$N_{lost}$。

    • 设上一包参数为 $(Offset_{prev}, Count_{prev})$,当前包为 $Offset_{curr}$,则:
    
    N_{lost} = Offset_{curr} - (Offset_{prev} + Count_{prev})
    
    
    


    - 当 $N_{lost} > 0$:在该 Key 对应的接收缓冲中补 $N_{lost}$ 个复数零(对每个通道均补齐)。
    - 当 $N_{lost} \le 0$表示重复包或乱序到达SPS 仍可选择“最后写入覆盖”或“忽略”,但必须保持输出长度一致。

> **补零后处理**:为减小窗函数旁瓣污染,允许在缺失区间附近对加权窗做平滑过渡(例如对缺失位置两侧若干点的窗系数做插值/衰减),但不得改变“缺失采样等价为 0”的相干约束。

---

### **6.4 校验和 (Checksum)**

校验规范:

1. **控制/维护/状态包**: 强制开启 **CRC-32C**(包尾)。

    - DACS 收到包后,**硬件计算** CRC32C。若校验失败**直接静默丢弃**,不回 NACK防止 NACK 风暴。SPS 会因超时自动重传。
    - CRC32C 覆盖范围统一为:`Common Header + Payload不含 CRC 字段)`。

2. **高速数据包**: 依赖链路层Ethernet FCS校验。

    - 应用层不额外增加 CRC 字段,以节省 FPGA 逻辑资源并降低 PCIe 带宽开销。链路层校验错误的包会被网卡NIC直接丢弃SPS 软件层通过 Sequence ID 即可感知丢包。

---

### **6.5 安全性与访问控制(必须)**

#### **6.5.1 基本原则**

- 本协议基于 UDP 设计,`SourceID`/`SeqID`/`CRC32C` 仅用于**互操作与误码检测**,不具备任何身份认证或抗伪造能力。
- 生产/外场部署中,必须假设存在:伪造控制指令、重放、篡改、以及通过 RMA 获取“等价远程管理权限”的风险。

#### **6.5.2 生产环境安全要求(至少满足其一,必须)**

为在不破坏 V2.2 报文格式的前提下实现可落地的安全闭环,生产环境必须至少采用以下一种方式提供**加密与认证**

1. **链路层安全(推荐)**MACsec (802.1AE)
2. **网络层安全(推荐)**IPsecTransport/Tunnel 均可)或等效的专用加密隧道
3. **物理隔离专网(最低要求)**:控制/维护网络必须与办公网/互联网严格隔离,并采用 ACL/白名单限制可达性

> 注:若系统未来需要在不可信网络上直接跑 UDP 明文,则应在后续版本引入协议级认证(例如 HMAC-SHA256并配套密钥管理与重放防护。本条为 V2.2 的落地约束,不在本版本报文格式中强制定义具体认证字段。

#### **6.5.3 RMA 通道风险控制(必须)**

RMA 可读写寄存器/DDR/Flash等价于高权限维护接口。为避免误用或被滥用

- **默认关闭(必须)**DACS 上电后 RMA 功能应处于关闭或只读受限状态;仅在满足运维流程的情况下才允许开启。
- **网络分区(必须)**RMA 流量必须运行在独立的维护网络/VLAN 中,禁止与数据平面同网段直连。
- **访问控制(必须)**
    - 至少实施基于五元组/ACL 的白名单(限定 SPS 主机 IP/MAC、端口范围
    - 并建议加入“物理在场”要素(例如拨码开关/跳线/维护口使能)以降低远程攻击面。
- **最小权限(建议)**:对 Flash 写入等高风险操作(固件升级)应要求额外的人工确认流程与分段校验。