第六章 資料傳輸

6.1 雙向資料流

DTP 支援兩個方向的資料傳輸,互不干擾:

方向名稱說明
Terminal → Fay資料歸集將終端產生的資料持久化儲存到 Personal Data Heap
Fay → Terminal資料注入經過 iFay 過濾和判斷後的最小化資料集

兩個方向使用相同的 Logical_Frame 格式和處理流程,但維護獨立的序列號空間和續傳狀態。

6.2 資料歸集流程(Terminal → Fay)

完整的資料歸集流程經過以下步驟:

終端應用程式
  │
  ▼ 提交資料
DTP_Slave Engine
  │ 1. 附加上下文中繼資料
  │ 2. 建構 LogicalFrame (Header + Payload)
  │ 3. 加密 Payload
  │ 4. 序列化 LogicalFrame
  │
  ▼ send(binary_data)
Transport_Adapter
  │
  ▼ onReceive(binary_data)
DTP_Master Engine
  │ 1. 反序列化 LogicalFrame
  │ 2. 驗證 Agreement_ID
  │ 3. 解密 Payload
  │ 4. 驗證 DAG 依賴
  │ 5. 更新序列號 + 傳送確認
  │
  ▼ 儲存
Personal Data Heap

6.3 資料注入流程(Fay → Terminal)

完整的資料注入流程經過以下步驟:

Personal Data Heap
  │
  ▼ 查詢並過濾資料
DTP_Master Engine
  │ 1. 建構 Fragment + 上下文中繼資料
  │ 2. 建構 LogicalFrame
  │ 3. 加密 Payload
  │ 4. 序列化 LogicalFrame
  │
  ▼ send(binary_data)
Transport_Adapter
  │
  ▼ onReceive(binary_data)
DTP_Slave Engine
  │ 1. 反序列化 LogicalFrame
  │ 2. 驗證 Agreement_ID
  │ 3. 解密 Payload
  │ 4. 更新序列號 + 傳送確認
  │
  ▼ 交付資料
終端應用程式

6.4 Agreement_ID 壓縮傳輸

為減少傳輸開銷,DTP 支援 Agreement_ID 的壓縮傳輸:

  • 當連續的 Fragment 屬於同一約定時,僅在該批次的首個 Fragment 標頭攜帶完整的 Agreement_ID
  • 後續 Fragment 的 agreementId 欄位設為 null,表示沿用上一個

接收方處理規則:

  1. 收到攜帶 Agreement_ID 的 Fragment → 更新當前上下文的 Agreement_ID
  2. 收到未攜帶 Agreement_ID 的 Fragment → 關聯到當前上下文中最近一次宣告的 Agreement_ID
  3. 收到參照了未知 Agreement_ID 的 Fragment → 丟棄並傳送錯誤通知

範例:

Fragment 1: agreementId = "abc-123"  ← 完整 ID
Fragment 2: agreementId = null       ← 沿用 "abc-123"
Fragment 3: agreementId = null       ← 沿用 "abc-123"
Fragment 4: agreementId = "def-456"  ← 新約定,完整 ID
Fragment 5: agreementId = null       ← 沿用 "def-456"

6.5 序列號管理

單調遞增

每個 Fragment 攜帶傳輸序列號(Sequence_Number),在單次工作階段內單調遞增。

雙向獨立

資料歸集方向和資料注入方向維護完全獨立的序列號空間:

資料歸集方向 (collection):  seq 1, 2, 3, 4, 5 ...
資料注入方向 (injection):   seq 1, 2, 3, 4, 5 ...

一個方向的序列號變化不影響另一個方向。

6.6 原始時間戳記保全

DTP 確保每個 Fragment 的原始時間戳記(Origin_Timestamp)在整個傳輸過程中保持不變:

  • 記錄資料在來源端實際產生的時刻,而非傳輸時刻
  • 使用 UTC 時區和毫秒級精度
  • 經過序列化、加密、傳輸、解密、反序列化後,時間戳記與傳送前完全一致
  • 接收方保留原始的 Origin_Timestamp 不做修改

這確保了即使資料延遲上傳(如離線場景),iFay 也能還原真實的時間線。

6.7 DAG 依賴驗證

接收方在接收 Fragment 時進行 DAG 依賴驗證:

  1. 環路偵測:驗證新 Fragment 的依賴關係不會在 DAG 中形成環路。若偵測到環路,拒絕該 Fragment
  2. 依賴解析:若依賴目標 Fragment 尚未到達,將當前 Fragment 標記為「依賴待解析」狀態並快取
  3. 延遲解析:當被依賴的 Fragment 到達後,自動解析之前快取的 Fragment