第四章 邏輯幀結構
4.1 幀的組成
Logical_Frame(邏輯幀)是 DTP 的應用層幀結構,由兩部分組成:
┌─────────────────────────────────────────┐
│ Logical_Frame │
├─────────────────────────────────────────┤
│ Header(幀頭) │
│ ┌─────────────────────────────────────┐│
│ │ protocolVersion 協定版本號 ││
│ │ frameType 幀類型標識 ││
│ │ fragmentId Fragment 唯一標識 ││
│ │ agreementId 約定 ID(可壓縮) ││
│ │ originTimestamp 原始時間戳記 ││
│ │ dagDependencies DAG 依賴列表 ││
│ │ encryptionMetadata 加密中繼資料 ││
│ │ sequenceNumber 序列號 ││
│ └─────────────────────────────────────┘│
├─────────────────────────────────────────┤
│ Payload(承載資料) │
│ ┌─────────────────────────────────────┐│
│ │ 加密後的實際資料內容 ││
│ └─────────────────────────────────────┘│
└─────────────────────────────────────────┘
關鍵設計決策:
- 幀頭中的加密中繼資料本身不加密,以便接收方確定解密方式
- Logical_Frame 在終端→Fay 和 Fay→終端兩個方向使用相同的幀結構定義
- 實體傳輸需要分片時,分片操作委託給底層 Transport_Adapter 處理,Logical_Frame 保持完整性
4.2 幀類型
DTP 定義四種幀類型:
| 幀類型 | 標識 | 用途 |
|---|---|---|
| 資料幀 | data | 承載實際的 Fragment 資料 |
| 請求幀 | request | 發起資料請求或調整傳輸約定 |
| 回應幀 | response | 回覆資料請求,包含接受、拒絕或協商結果 |
| 控制幀 | control | 傳遞錯誤通知、約定終止等控制資訊 |
4.3 幀頭欄位詳解
協定版本號(protocolVersion)
{ major: number, minor: number }
標識當前幀使用的協定版本。接收方據此判斷是否相容。
幀類型標識(frameType)
標識幀的類型,決定承載資料的解析方式。
Fragment 唯一識別碼(fragmentId)
全域唯一的 UUID v4 識別碼,用於在 DAG 中參照和追蹤。
約定 ID(agreementId)
標識該 Fragment 所屬的約定。支援壓縮傳輸:當連續的 Fragment 屬於同一約定時,僅在該批次的首個 Fragment 標頭攜帶完整的 Agreement_ID,後續 Fragment 可省略(設為 null)。
接收方規則:
- 收到未攜帶 Agreement_ID 的 Fragment 時,關聯到當前上下文中最近一次宣告的 Agreement_ID
- 收到參照了未知 Agreement_ID 的 Fragment 時,丟棄該 Fragment 並傳送「約定不存在」錯誤通知
原始時間戳記(originTimestamp)
資料在來源端實際產生的時刻,使用 UTC 時區和毫秒級精度。與傳輸時間戳記分離儲存,不受傳輸延遲影響。
例如:使用者在捷運中離線記錄了 30 分鐘的心率資料,出站後批次上傳——每筆記錄保留的是實際測量時刻的時間戳記,而非上傳時刻。
DAG 依賴列表(dagDependencies)
宣告與其他 Fragment 的依賴關係,每條依賴包含:
- 目標 Fragment_ID
- 關係類型(
derived_from/annotates/supersedes)
支援宣告零個或多個依賴關係。
加密中繼資料(encryptionMetadata)
{ algorithm: string, keyVersion: number }
algorithm:加密演算法標識(如 "AES-256-GCM")keyVersion:金鑰版本號
加密中繼資料本身不加密,以便接收方確定解密參數。
序列號(sequenceNumber)
傳輸序列編號,在單次工作階段內單調遞增,用於續傳機制。每個傳輸方向維護獨立的序列號空間。
4.4 序列化與反序列化
DTP_Engine 將 Logical_Frame 物件序列化為二進位格式進行傳輸,接收方將二進位資料反序列化為 Logical_Frame 物件。
核心保證——往返一致性:對於任意有效的 Logical_Frame 物件,序列化後再反序列化應產生與原始物件等價的 Logical_Frame。
DTP_Engine 還提供格式化輸出功能(Pretty Printer),將 Logical_Frame 物件轉換為人類可讀的文字格式,便於除錯和日誌記錄。
4.5 上下文中繼資料
每個 Fragment 攜帶結構化的上下文中繼資料(ContextMetadata),包括:
- 資料類型標識(dataType):描述資料的類型
- 資料來源(source):區分硬體來源和軟體來源
- 自訂欄位(customFields):可擴充的鍵值對結構
硬體來源
當資料來源於硬體感測器時,中繼資料包含:
- 感測器類型(sensorType)
- 感測器精度(precision)
- 取樣率(samplingRate,單位 Hz)
軟體來源
當資料來源於軟體共享時,中繼資料包含:
- 來源應用程式標識(appIdentifier)
- 共享方式描述(sharingMethod)
