Files
Inbox/系统基座文件/2/2.4/2.4.3 丢包检测与时序完整性机制 (Packet Loss Detection & Sequencing Integrity).md
2025-12-11 07:24:36 +08:00

121 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
tags: []
date created: 星期一, 十一月 24日 2025, 4:25:06 下午
date modified: 星期一, 十一月 24日 2025, 4:29:22 下午
---
# 2.4.3 丢包检测与时序完整性机制 (Packet Loss Detection & Sequencing Integrity)
这是显控终端的“网络听诊器”。在单向 UDP 传输模式下,显控端不仅是被动的数据消费者,更是链路质量的唯一评判者。它需要利用 2.4.2 定义的协议头字段,实时诊断出“谁丢包了”、“延迟多少”、“服务器是否过热”,并将这些隐性故障转化为显性的运维指标。
## 一、 约束输入与对齐 (Constraints & Alignment)
基于 TDP-2.4-DIST分布式补丁和 ECN-2025-001显控扁平化我们需对齐以下硬性约束
1. **多源独立性**:丢包检测必须**按站点 (StationID) 隔离**。站点 A 的网络抖动绝不能触发站点 B 的告警。
2. **时钟假设**:显控终端作为系统的一部分,假设已通过 NTP/PTP 与总控服务器同步。因此,`timestamp_us` 可用于计算绝对的端到端延迟Glass-to-Glass Latency
3. **处理策略**:显控端对于乱序包执行**立即丢弃**策略,以保证态势图的实时性。
---
## 二、 权衡分析与选项呈现 (Trade-off Matrix)
### 议题 1丢包判决逻辑 (Loss Judgment Logic)
|**选项**|**A. 简单间隙检测 (Simple Gap)**|**B. 统计窗口平滑 (Sliding Window Stats) (推荐)**|
|---|---|---|
|**机制**|只要 `Seq != Last + 1` 就报警。|维护 1 秒滑动窗口。统计窗口内的丢包率 (PLR)。仅当 `PLR > 阈值` 时报警。|
|**灵敏度**|**极高**。偶发的单个丢包也会导致界面闪烁告警,造成“狼来了”效应。|**适中**。过滤掉偶发的网络毛刺,关注持续性的链路质量恶化。|
|**适用性**|调试模式。|**生产环境标准解**。|
### 议题 2时序异常处理 (Timing Anomaly)
|**选项**|**A. 仅基于序列号 (Seq Only)**|**B. 序列号 + 时间戳双重校验 (Seq + Time) (推荐)**|
|---|---|---|
|**机制**|序列号递增即接收。|序列号递增 **且** `Timestamp > LastTimestamp`。|
|**风险**|无法检测“服务器时钟回跳”或“重放攻击”。|**高健壮性**。防止因服务器端时钟故障导致的逻辑混乱。|
---
## 三、 基线确立与实施规范
为了构建一个“可诊断”的显控终端,我们确立 **B. 统计窗口平滑** + **B. 双重校验** 为基线。
### 1. 诊断上下文状态机 (Diagnostic Context)
显控端必须为**每一个**检测到的 `station_id` 维护一个独立的诊断上下文:
```cpp
struct StationDiagnosticContext {
uint32_t station_id;
// 序列跟踪
uint64_t last_seq_id = 0;
uint64_t last_timestamp_us = 0;
// 统计窗口 (1s)
uint32_t expected_packets = 0;
uint32_t lost_packets = 0;
// 链路状态
bool connected = false;
uint64_t last_seen_local_us = 0; // 用于检测静默/断连
};
```
### 2. 核心诊断逻辑基线
显控端收到 `TrackDataBatch` 后的标准处理流水线:
- **步骤 1源识别**
- 读取 `station_id`
- 在 Map 中查找对应的 `StationDiagnosticContext`。若无,则创建新上下文(视为新站点上线)。
- **步骤 2时序完整性检查 (Sequencing)**
- **乱序/重复**`if (batch.seq <= ctx.last_seq)` -> **立即丢弃**。记录 `Out-of-Order` 计数。
- **丢包**`if (batch.seq > ctx.last_seq + 1)` -> **判定为丢包**
- 丢包数 `loss = batch.seq - ctx.last_seq - 1`
- 更新统计:`ctx.lost_packets += loss`
- **更新**`ctx.last_seq = batch.seq`
- **步骤 3端到端延迟遥测 (Latency Telemetry)**
- **计算**`latency = Now() - batch.timestamp_us`
- **诊断**
-`latency > 200ms`(典型阈值):标记为 **"High Latency"**。
-`latency < 0`:标记为 **"Clock Skew"**(时钟不同步警告)。
- **步骤 4服务器健康感知 (Server Health)**
- 读取 `throttle_level`
- **可视化**
- `Level 0`:绿色(正常)。
- `Level 1`:黄色(轻微发热)。显控端右上角显示小图标提示。
- `Level 2`:红色(严重过热)。显控端弹出 Toast 提示“数据已降级”。
### 3. 断连判定机制 (Dead Link Detection)
- **机制**:显控端需运行一个独立的 1Hz 定时器,遍历所有 `StationDiagnosticContext`
- **判据**`if (Now() - ctx.last_seen_local_us > 2000ms)`
- **动作**
- 将该 Station 标记为 **"Disconnected"**。
- 在态势图上灰置或清除该站点的所有目标。
- 触发声音告警。
---
## 总结2.4.3 基线图谱
|**诊断维度**|**字段来源**|**判定逻辑**|**显控端行为**|
|---|---|---|---|
|**丢包 (Loss)**|`batch_sequence_id`|`Current > Last + 1`|统计丢包率,不补发,仅告警。|
|**乱序 (Reorder)**|`batch_sequence_id`|`Current <= Last`|**静默丢弃**,防止画面回跳。|
|**延迟 (Latency)**|`timestamp_us`|`LocalTime - Timestamp`|超过阈值(如 200ms提示“数据滞后”。|
|**断连 (Dead)**|(本地接收时间)|`Silence > 2s`|标记站点离线,清空目标。|
|**过热 (Thermal)**|`throttle_level`|`Level > 0`|UI 显性提示用户“服务器过热/数据降级”。|
下一步行动:
至此我们已经完整定义了数据如何发2.4.1/2.4.2以及如何收2.4.3。2.4.4 热节流响应 在之前的讨论中已经涵盖(作为 Server 端行为2.4.5 的核心也在本节的延迟遥测中定义了。
**建议**:我们可以结束 **2.4 外部目标数据分发协议** 的讨论,进入 **2.5 数据结构定义与序列化规范**(虽然我们在 2.4.2 中已经定义了 Proto但可能还需要补充 C++ 内部结构体定义),或者直接进入 **第三章:异构计算架构与资源调度**
鉴于我们在 2.4.2 中已经非常详细地定义了 `.proto`,且 `02_核心数据结构.md` 已经提供了 C++ 结构体定义,我建议**跳过 2.5**(除非您有特定结构体需要深究),直接进入 **第三章**,去解决最硬核的计算资源分配问题。
**提问**:您是否确认 **2.4.3 的多站独立诊断基线**?确认后我们是否直接进入 **第三章**