第 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(兩級、無 PATCH;MAJOR、MINOR 均為非負整數)訊框標頭 protocolVersion 欄位、schema 檔名是
文件狀態(Document Status)文件生命週期列舉 Draft / Final / Deprecated / Obsolete(任一時刻恰取一個值)front matter 的 status 欄位否
編輯版次(Editorial Edition)勘誤與澄清以發布日期錨定的 YYYY-MM-DD(如 2025-10-25)front 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 遞增 MINOR 或 MAJOR,且 不得 將其偽裝為勘誤(編輯版次)發布。

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

落地表

落點放什麼規範性約束
線信封 protocolVersion 欄位MAJOR.MINOR僅 放 MAJOR.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)為規則錨點。