第四章 邏輯幀結構

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)