BLUEPRINT
第六章 資料傳輸
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,表示沿用上一個
接收方處理規則:
- 收到攜帶 Agreement_ID 的 Fragment → 更新當前上下文的 Agreement_ID
- 收到未攜帶 Agreement_ID 的 Fragment → 關聯到當前上下文中最近一次宣告的 Agreement_ID
- 收到參照了未知 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 依賴驗證:
- 環路偵測:驗證新 Fragment 的依賴關係不會在 DAG 中形成環路。若偵測到環路,拒絕該 Fragment
- 依賴解析:若依賴目標 Fragment 尚未到達,將當前 Fragment 標記為「依賴待解析」狀態並快取
- 延遲解析:當被依賴的 Fragment 到達後,自動解析之前快取的 Fragment
