第 1 章 概述與協定定位

本章界定 DTP 的協定範圍(§1.1)、協定定位(§1.2)、與 CAP 的關係(§1.3)、設計目標(§1.4)、主從模型(§1.5)與一致性等級(§1.6),並在 §1.7「版本管理與相容性」中以規範性形式給出 DTP 的版本管理規則——使本協定自帶版本說明,便於標準實作者直接查閱,無需檢索外部文件。

1.1 協定範圍

資料隧道協定(DTP)應當是 iFay 生態系統中負責終端裝置與 Fay 實例之間雙向資料傳輸的應用層協定。

DTP 必須 實作以下兩個核心資料流:

  1. 資料歸集(Data Collection):從終端(Slave)流向 Fay(Master),用於將終端產生的資料持久化到 iFay 的 Personal Data Heap。
  2. 資料注入(Data Injection):從 Fay(Master)流向終端(Slave),用於將經 iFay 過濾後的最小化資料集臨時提供給終端應用。

DTP 不得 用於其他用途。

1.2 協定定位

DTP 必須 作為應用層協定運行於既有傳輸協定之上,包括但不限於 BLE、RTSP、WebSocket、TCP。

DTP 必須 透過 Transport_Adapter 抽象層與具體傳輸協定互動(參見第 3.4 節)。DTP 核心 不得 依賴任何具體傳輸協定的實作細節。

1.3 與 CAP 的關係

DTP 必須 與控制授權協定(CAP)協同工作,遵循以下分工:

  • CAP 負責連線授權、身分驗證與金鑰交換。
  • DTP 負責協商式資料流傳輸。

DTP 實作 必須 在 CAP 完成身分驗證與金鑰交換後才開始資料傳輸。如 CAP 尚未就緒,DTP 實作 必須 拒絕傳送資料並返回 KEY_NOT_READY 錯誤(錯誤碼 2002,參見第 9 章)。

1.4 設計目標

DTP 實作 必須 滿足以下設計目標:

目標規範性要求
傳輸無關性DTP 核心邏輯 必須 與具體傳輸協定解耦
協商優先所有資料傳輸 必須 基於已達成的約定(Agreement)
資料主權主端 必須 對資料流擁有最終決策權
端對端加密負載(Payload) 必須 加密傳輸
語境保全每個資料片段 必須 攜帶結構化上下文中繼資料
可恢復性實作 必須 支援基於序列號的續傳機制

1.5 主從模型

DTP 必須 區分以下兩種角色:

  • 主端(Master):自然人使用者或 Fay(iFay / coFay)。必須 擁有資料歸集發起權和資料注入決策權。
  • 從端(Slave):軟體或硬體終端。僅可 發起資料注入申請,不得 發起資料歸集請求。

DTP 實作 必須 強制執行以下約束:

  1. 在任意時刻,一個從端 不得 同時被多於一個 Fay 作為控制者(Controller)。
  2. 控制者 邀請其他 Fay 作為旁觀者(Observer)。
  3. 旁觀者 不得 發起請求或修改約定,必須 只能接收資料流的唯讀副本。
  4. 主端發起資料歸集請求時,從端 接受。從端 拒絕,但拒絕 必須 附帶合規性理由(參見第 5.3.1 節)。
  5. 從端發起資料注入申請時,主端 必須 擁有完全決定權, 接受、拒絕或提出替代方案。

1.6 一致性等級

實作 必須 宣告其一致性等級:

  • 完整一致(Full Conformance):實作滿足所有 必須(MUST)應(SHOULD) 規則。
  • 核心一致(Core Conformance):實作滿足所有 必須(MUST) 規則,但 不滿足部分 應(SHOULD) 規則。
  • 不一致(Non-Conformance):實作不滿足某條 必須(MUST) 規則。宣告為 DTP 的實作 不得 處於此狀態。

1.7 版本管理與相容性(Version Management & Compatibility)

本節為規範性(Normative)。 本節是 DTP 版本管理規則的唯一權威來源(Single Source of Truth)。正文其他位置(含第 10 章「版本管理」與變更日誌,如有)凡涉及版本規則之處,必須 以本節為準,不得 重新定義本節已規定的規則。

本節按以下固定順序組織:三條正交版本軸(§1.7.1)→ MAJOR.MINOR 語義與變更判定(§1.7.2)→ 版本協商與相容性規則(§1.7.3)→ 編輯版次與勘誤(§1.7.4)→ 版本號落地表與實作者須知(§1.7.5)。

1.7.1 三條正交版本軸

DTP 的版本資訊 必須 沿三條相互正交的軸獨立管理。這三條軸 不得 合併為單一版本號;每條軸擁有獨立的取值空間、記錄位置與演進規則,且一條軸的變更 不得 強制另外兩條軸隨之變更(正交性的可觀測定義)。

含義取值空間記錄位置進入線格式?
協定版本(Protocol Version)互通契約dtp/MAJOR.MINOR(兩級、無 PATCHMAJORMINOR 均為非負整數)訊框標頭 protocolVersion 欄位、schema 檔名
文件狀態(Document Status)文件生命週期列舉 Draft / Final / Deprecated / Obsolete(任一時刻恰取一個值)front matter 的 status 欄位
編輯版次(Editorial Edition)勘誤與澄清以發布日期錨定的 YYYY-MM-DD(如 2025-10-25front matter 的 date 欄位與發布目錄名

關於文件狀態與目錄的關鍵約束(完整目錄約定與定稿治理流程見第 10 章,其規則錨點以本節為準):

  • 文件狀態 必須 是 front matter 標記,不得 編碼進檔案路徑或目錄名。
  • 某個已發布版次當前是 Final 還是 Deprecated / Obsolete 由其檔案的 status 欄位決定,不得 依據目錄名判斷。

1.7.2 MAJOR.MINOR 語義與變更判定

MAJOR(主版本)

MAJOR 用於破壞互通的變更。判定基準:若一個嚴格按 MAJOR.0 舊版實作的對端會拒絕或誤解新報文,則該變更為破壞互通變更。此類變更包括但不限於:

  • 變更權威 schema 欄位的語義;
  • 移除報文或錯誤碼;
  • 重定義錯誤碼;
  • 變更狀態機的吸收態(absorbing state)。

WHEN 發生一次破壞互通的變更,MAJOR 必須 遞增 1,且 MINOR 必須 歸零(重置為 0)。

不同 MAJOR 之間 保證互通。

MINOR(次版本)

MINOR 用於向後相容的增補,包括但不限於:新增可選欄位、新增報文、新增錯誤碼、新增參數、新增屬性。判定基準:嚴格按 MAJOR.0 舊版實作的對端既不會拒絕、也不會誤解新報文。

WHEN 發生一次向後相容的增補,MINOR 必須 遞增 1,MAJOR 必須 保持不變。在同一 MAJOR 內,較高 MINOR 必須 向後相容至 MAJOR.0

變更判定規則(有序、可判定)

對任一變更,必須 按以下順序判定其落點,產出唯一檔位:

  1. 若嚴格實作 MAJOR.0 舊版的對端會拒絕或誤解新報文 → 判定為 MAJOR
  2. 否則,若該變更新增了線格式可見內容(訊框標頭/報文/錯誤碼/參數等線上可見結構)→ 判定為 MINOR
  3. 否則(僅文字變更、無線格式變化)→ 變更協定版本,改用編輯版次(見 §1.7.4)。
  4. 若一處變更可同時匹配多個檔位,必須 取較高檔位。

1.7.3 版本協商與相容性規則

本小節為規範性

線格式約束

  • 協定版本的 MAJOR.MINOR 進入線格式(即訊框標頭 protocolVersion 欄位與 schema 檔名)。
  • 協定版本 必須 始終進入線格式;實作 不得 提供將協定版本排除出線格式的設定。
  • 文件狀態與編輯版次 不得 進入線格式。實作 不得 依據文件狀態或編輯版次改變報文處理行為——即:線格式完全相同的兩條訊息,其處理結果 不得 因這兩條軸取值不同而產生差異。
  • IF 接收到的訊息在線格式中缺失協定版本資訊(訊框標頭缺少 protocolVersion,或缺少 major / minor 子欄位,或其值非非負整數),THEN 實作 必須 以協定錯誤拒絕該訊息,且 不得 以預設或推斷版本進行處理。

協商規則

  • WHEN 進行握手或引導(bootstrap),雙方 必須 各自宣告其支援的協定版本集合,該集合 不得 為空。
  • 版本選擇 必須 遵循:先取雙方共同支援的最高 MAJOR,再取該 MAJOR 下雙方共同支援的最高 MINOR
  • 較高 MINOR 的一方 必須 能夠服務較低 MINOR 的對端:必須 按對端宣告的較低版本語義處理其報文,不得 僅因對端 MINOR 較低而拒絕。
  • IF 雙方不存在任何共同支援的 MAJOR,THEN 實作 必須 直接以協定錯誤拒絕,且 不得 進行盡力而為(best-effort)的降級。(該錯誤的具體綁定見第 10 章 VERSION_INCOMPATIBLE / 7001。)
  • WHEN 接收到 MAJOR 相同但 MINOR 更高的報文,實作 必須 以自身最高 MINOR 的語義解讀已知欄位並 忽略 不識別的可選欄位,不得 拒絕、丟棄或報錯。

憑證與密碼套件

  • WHEN 進行版本滾動升級,實作 必須 保持既有的、未過期的憑證或權杖(credentials / tokens)繼續有效,不得 僅因版本變更而使其失效。
  • WHERE 協定已具備密碼套件(cipher-suite)協商機制,版本協商 必須 複用同一口徑(各自宣告、取共同最高)。

協商時序(Hello / Hello_Ack)與「會話內版本一致、不得中途切換」的操作機制見第 10 章。

1.7.4 編輯版次與勘誤

本小節描述的約束為**非規範性(Non-normative)**治理約束,但其「不得偽裝升級」一條對協定版本號的正確性具有約束力。

  • WHEN 定稿後進行純文字勘誤(訂正錯字、補充範例、澄清表述、修復連結),必須 保持協定版本號(MAJOR.MINOR)不變;該勘誤 必須 由一個新的發布日期目錄承載,既有的已發布目錄 必須 保持凍結,從而舊引用與連結 不得 被破壞。
  • 編輯版次 在變更日誌(如有)中以 Editorial 類目登記;front matter 必須edition / date 欄位標註其版次。
  • 編輯版次 允許非規範性改動,不得 觸及線格式語義、規範性陳述、錯誤碼、狀態機或互通行為。
  • 硬約束:IF 一項修改觸及線格式語義,THEN 必須 按 §1.7.2 遞增 MINORMAJOR,且 不得 將其偽裝為勘誤(編輯版次)發布。

1.7.5 版本號落地表與實作者須知

落地表

落點放什麼規範性約束
線信封 protocolVersion 欄位MAJOR.MINORMAJOR.MINOR,不含其他級別
schema 檔名跟隨 MAJOR.MINOR不得 隨編輯版次重新命名(保持引用穩定)
content-typeapplication/dtp標識協定族;其 version= 參數 作閘道路由便利, 屬於線格式語義
front matter status / date文件治理標記 進入線格式
git tagdtp-v<MAJOR.MINOR>-<狀態>tag 必須 同時涵蓋正文 + 測試向量 + schema

實作者須知(必讀)

  • 判斷互通 看協定版本(MAJOR.MINOR),不得 依據文件狀態或編輯版次。
  • 同一 MAJOR 必須 向下相容至 MAJOR.0
  • 不得 把勘誤(編輯版次)當作協定升級。
  • 不得 依賴 schema 檔名來編碼編輯版次。
  • Draft 期間 相容性承諾。

完整的目錄與狀態約定、以及定稿(Draft → Final)的標準動作見第 10 章「協定演進與治理」;其中涉及的 git tag 格式、狀態列舉與編輯版次定義,必須 以本節(§1.7)為規則錨點。