BLUEPRINT
第三章 协议架构
3.1 协议分层
DTP 采用分层架构设计,从上到下依次为:
┌─────────────────────────────────────────────┐
│ 应用层 │
│ iFay / coFay / Personal Data Heap │
│ 终端应用(软件 / 硬件) │
├─────────────────────────────────────────────┤
│ DTP 协议层 │
│ DTP_Master Engine / DTP_Slave Engine │
│ ┌───────────────────────────────────────┐ │
│ │ 协商管理器 (Agreement Manager) │ │
│ │ 帧编解码器 (Frame Codec) │ │
│ │ DAG 管理器 (DAG Manager) │ │
│ │ 加密模块 (Encryption Module) │ │
│ │ 会话管理器 (Session Manager) │ │
│ │ 续传管理器 (Resume Manager) │ │
│ └───────────────────────────────────────┘ │
├─────────────────────────────────────────────┤
│ 适配层 │
│ Transport_Adapter │
├─────────────────────────────────────────────┤
│ 传输层 │
│ BLE / WebSocket / TCP / RTSP / ... │
└─────────────────────────────────────────────┘
设计原则
- 传输无关性:通过 Transport_Adapter 抽象底层传输,DTP 核心逻辑与具体传输协议解耦
- 协商优先:所有数据传输必须基于双方协商达成的约定,无"裸传输"
- 数据主权:主端对数据流拥有最终决策权,从端是数据生产方或消费方
- 端到端加密:Payload 加密传输,FayGer 运行时无法访问明文
- 语境保全:每个 Fragment 携带结构化上下文元数据,确保数据归集时语境不丢失
- 可恢复性:基于序列号的续传机制,支持连接中断后无缝恢复
3.2 核心组件
DTP_Engine
DTP 协议的核心处理引擎,分为两个变体:
- DTP_Master:运行在 Fay 侧,拥有数据归集发起权和数据注入决策权
- DTP_Slave:运行在终端侧,负责数据生产和注入申请
两者共享帧编解码、加密、DAG 管理等基础能力,但在协商权限和数据流方向上有所区别。
Transport_Adapter
底层传输协议的抽象接口。DTP_Engine 通过此接口与具体传输协议通信,实现传输无关性。支持的传输协议包括 BLE、WebSocket、TCP、RTSP 等。
当底层传输连接断开时,Transport_Adapter 向 DTP_Engine 报告连接状态变更事件,触发会话挂起和续传流程。
Agreement Manager(协商管理器)
管理约定的完整生命周期:
- 创建:发起协商请求
- 协商:处理请求和响应
- 激活:双方达成一致后生成 Agreement_ID
- 动态调整:传输过程中修改约定参数
- 终止:通过停止指令结束约定
Frame Codec(帧编解码器)
负责 Logical_Frame 的序列化(编码为二进制)和反序列化(从二进制解码),以及格式化输出(Pretty Print)。确保帧在不同平台间正确传输。
DAG Manager(DAG 管理器)
管理 Fragment 之间的有向无环图依赖关系:
- 环路检测:防止形成循环依赖
- 依赖解析:处理依赖目标尚未到达的情况
- 关系查询:查询 Fragment 的依赖和被依赖关系
Encryption Module(加密模块)
负责 Payload 的端到端加密和解密,使用 CAP 预协商的密钥。确保 FayGer 运行时环境无法访问明文数据。
Session Manager(会话管理器)
管理 DTP 会话的生命周期:
- 会话创建与关闭
- 状态持久化与恢复
- 超时检测与资源释放
Resume Manager(续传管理器)
管理基于序列号的续传机制:
- Fragment 缓存管理
- 序列号跟踪
- 断点恢复协调
3.3 DTP_Engine 状态机
DTP_Engine 的运行状态遵循以下状态机:
┌──────────────────────────────────────────┐
│ │
┌───────┐ │ ┌──────────────┐ ┌────────────────┐ │
│ Idle │──────┼─▶│WaitingForCAP │───▶│SessionEstablished│ │
│ │◀─────┼──│ │◀───│ │ │
└───────┘ │ └──────────────┘ └───────┬────────┘ │
▲ │ │ │
│ │ ▼ │
│ │ ┌─────────────┐ │
│ │ │ Negotiating │ │
│ │ └──────┬──────┘ │
│ │ │ │
│ │ ▼ │
│ │ ┌──────────────┐ │
│ │ │ Transmitting │ │
│ │ └───────┬──────┘ │
│ │ │ │
│ │ ▼ │
│ │ ┌──────────┐ ┌─────────────┐ │
└──────────┼──│ Resuming │◀─────│ Suspended │ │
│ └──────────┘ └─────────────┘ │
└──────────────────────────────────────────┘
状态转换说明:
| 当前状态 | 触发事件 | 目标状态 |
|---|---|---|
| Idle | 收到连接请求 | WaitingForCAP |
| WaitingForCAP | CAP 验证 + 密钥交换完成 | SessionEstablished |
| WaitingForCAP | CAP 失败 / 超时 | Idle |
| SessionEstablished | 发起或收到 Request_Frame | Negotiating |
| SessionEstablished | 会话超时关闭 | Idle |
| Negotiating | Agreement 达成 | Transmitting |
| Negotiating | 协商失败 / 拒绝 | SessionEstablished |
| Transmitting | 持续传输 Fragment | Transmitting |
| Transmitting | 动态调整约定 | Negotiating |
| Transmitting | 连接断开 | Suspended |
| Transmitting | Agreement 终止(无其他活跃约定) | SessionEstablished |
| Suspended | 连接恢复 + CAP 重新验证 | Resuming |
| Suspended | 会话超时 | Idle |
| Resuming | 续传握手完成 | Transmitting |
| Resuming | 恢复失败 | Idle |
3.4 主从交互时序
完整的 DTP 交互分为五个阶段:
阶段 1:CAP 预处理
- CAP 完成身份验证和密钥交换
阶段 2:DTP 会话建立
- 主端向从端发起会话建立,生成 Session_ID
阶段 3a:数据归集协商(Master 发起)
- Master 发送 Request_Frame(数据归集请求)
- Slave 回复 Response_Frame(接受/拒绝/替代方案)
- 达成 Agreement,生成 Agreement_ID
阶段 3b:数据注入协商(Slave 申请)
- Slave 发送 Request_Frame(数据注入申请)
- Master 回复 Response_Frame(接受/拒绝/替代方案)
- 达成 Agreement,生成 Agreement_ID
阶段 4:数据传输
- Slave → Master:Fragment(数据归集,携带 Agreement_ID)
- Master → Slave:Fragment(数据注入,携带 Agreement_ID)
阶段 5:连接中断与恢复
- 连接断开 → 重新建立连接(CAP 重新验证)→ 报告已接收最高序列号 → 从断点继续传输
