第 5 章:會話管理與存活檢測

本章定義 Session 的狀態機、生命週期事件、與 Terminal_Resource 的繫結規則,以及 Liveness_Detection(存活檢測)機制。本章對應藍圖 §2.3 的設計意圖。

5.1 Session 狀態機

每個 Session 在其生命週期內經歷有限狀態機的多個狀態。

5.1.1 狀態定義

SessionState = enum[
  "creating",
  "active",
  "handover_pending",
  "terminating",
  "terminated"
]
狀態說明
creating授權校驗通過,Session 正在初始化(如分配資源、設定 OS 存取控制)
activeSession 處於活躍狀態,Fay 可執行授權範圍內的操作
handover_pendingSession 正在參與控制權交接(參見第 6 章),尚未確定結果
terminatingSession 正在被終止,資源回收中,新請求被拒絕
terminatedSession 已完全終止,session_id 進入歷史記錄

5.1.2 狀態轉移圖

              ┌─────────────┐
              │   (start)   │
              └──────┬──────┘
                     │ 授權校驗通過
                     ▼
              ┌─────────────┐
              │  creating   │
              └──────┬──────┘
                     │ 資源初始化完成
                     ▼
              ┌─────────────┐  交接發起   ┌──────────────────┐
              │   active    │────────────→│ handover_pending │
              └──────┬──────┘             └──────┬───────────┘
                     │  ↑                        │
              終止條件│  │交接逾時回滾           │交接完成
                     ▼  │                        ▼
              ┌─────────────┐              ┌─────────────┐
              │ terminating │←─────────────┤ (handed off)│
              └──────┬──────┘              └─────────────┘
                     │ 資源回收完成
                     ▼
              ┌─────────────┐
              │ terminated  │
              └─────────────┘

5.1.3 狀態轉移規則

終端 MUST 僅按下表允許的轉移更新 Session 狀態:

目前狀態目標狀態觸發條件
creatingactive資源初始化完成
creatingterminating初始化失敗(如資源被其他 Session 佔用)
activehandover_pending收到針對該 Session 的交接請求
activeterminating主動釋放、心跳逾時、撤銷終止、資源不可用
handover_pendingterminating交接成功(原 Session 必須終止)或交接逾時取消
handover_pendingactive交接被新控制方拒絕(回退到原狀態)
terminatingterminated資源完全釋放、狀態持久化完成

實作 MUST NOT 進行未列出的狀態轉移。

5.1.4 狀態轉移的原子性

每次狀態轉移 MUST 滿足以下原子性要求:

  1. 狀態讀取、判斷、寫入 MUST 在臨界區內完成,外部觀察者不會看到中間狀態
  2. 狀態轉移與對應的資源操作(如 OS 存取控制下發)MUST 作為一個交易執行,要麼全部成功,要麼全部回滾

5.2 Session 建立

5.2.1 建立觸發

Session 在以下場景被建立:

  1. iFay_Runtime 發起 AuthRequest 且授權校驗通過(參見 §3.3、§4.3)
  2. 控制權交接成功後,為新控制方建立新 Session(參見第 6 章)

5.2.2 建立步驟

終端 MUST 按以下步驟建立 Session:

  1. 資源佔用預檢:檢查目標 resource_idaccess_mode 下是否可被佔用(參見 §5.3 與第 7 章讀寫鎖規則)
  2. 產生 Session_ID:分配新的 UUID v7
  3. 設定初始狀態state = "creating"
  4. 建構 Session 物件:填充 §2.5 定義的欄位
  5. 下發 OS 存取控制:透過 §1.3.2 介面告知作業系統允許該 Fay 程序以指定模式存取資源
  6. 狀態切換state: creating → active,記錄 created_atlast_heartbeat_at
  7. 返回 AuthResult:將 session_id 透過 AuthResult 回傳給 iFay_Runtime

5.2.3 建立失敗處理

若任一步驟失敗:

  1. 已分配的資源(如 OS 存取控制條目)MUST 被回滾
  2. Session 狀態切換到 terminating 然後立刻 terminated
  3. 返回對應的錯誤碼(如 E_RESOURCE_BUSYE_OS_INTEGRATION_FAILED

5.3 Session 與 Terminal_Resource 的繫結

5.3.1 一對一繫結

每個活躍 Session MUST 繫結到恰好一個 Resource_ID。終端透過 (resource_id, access_mode) 維護資源的佔用關係。

5.3.2 排他性與共享性規則

詳見第 7 章 §7.2 讀寫鎖矩陣。本節給出會話層面的簡化規則:

資源目前活躍 Session新 Session 請求處理
任意模式允許建立
≥1 個 readread允許建立
≥1 個 readwrite/execute/configure拒絕(E_RESOURCE_BUSY
1 個 write/execute/configure任意模式拒絕(E_RESOURCE_BUSY

5.3.3 資源不可用的級聯終止

Resource_ID 對應的資源變為不可用(如硬體斷開、軟體程序當機、作業系統回報資源消失)時:

  1. 終端 MUST 立即將所有繫結該資源的 Session 切換到 terminating
  2. 終端 MUST 向所有受影響的 iFay_Runtime 推送 SessionStateChanged 通知,reason"resource_unavailable"
  3. 資源恢復後,已終止的 Session MUST NOT 自動恢復,iFay_Runtime 需重新發起 AuthRequest 建立新 Session

5.4 Liveness_Detection(存活檢測)

存活檢測透過長連線維持應用層心跳兩個獨立訊號判定 Session 是否仍活躍。

5.4.1 長連線維持

iFay_Runtime 與終端之間 MUST 維持一條長連線通道(如 WebSocket、HTTP/2 stream、gRPC stream)。

終端 MUST 監測該長連線的狀態:

  • 連線建立:長連線訊號有效
  • 連線斷開:長連線訊號無效(包括 TCP RST、逾時無回應等)

長連線斷開 MAY 是暫時網路抖動的結果,因此 MUST NOT 單獨作為終止 Session 的依據(見 §5.4.3 雙重判定)。

5.4.2 應用層心跳

iFay_Runtime MUST 在長連線上為每個活躍 Session 週期性傳送 Heartbeat 訊息:

Heartbeat (body of ProtocolMessage) {
  required session_id      : Session_ID
  required sequence_number : uint64
}

HeartbeatAck (body of ProtocolMessage) {
  required session_id      : Session_ID
  required sequence_number : uint64
}
參數預設值範圍
心跳間隔10 秒1–60 秒
心跳逾時閾值30 秒心跳間隔 × 2 至心跳間隔 × 6

sequence_number 在每個 Session 內單調遞增,從 0 開始。

終端 MUST:

  1. 收到 Heartbeat 後立即返回 HeartbeatAck(sequence_number 與請求一致)
  2. 更新該 Session 的 last_heartbeat_at
  3. 拒絕 sequence_number 小於已記錄最大值的 Heartbeat(防止重放)

5.4.3 雙重判定

終端 MUST 僅當同時滿足以下兩個條件時才判定 Session 失效:

  1. 長連線已斷開超過心跳逾時閾值
  2. last_heartbeat_at 起的時長超過心跳逾時閾值

這種雙重判定的設計意圖是:

  • 長連線短暫抖動期間應用層心跳可能仍正常(不應誤判失效)
  • 應用層心跳停止但長連線仍在(如 Fay 卡頓)需透過心跳逾時偵測
  • 兩者同時發生才是高可信度的失效訊號

5.4.4 失效後的處理

判定失效後,終端 MUST:

  1. 切換 Session 狀態:active → terminating
  2. 釋放佔用的 Terminal_Resource
  3. 透過 OS 介面撤銷該 Fay 對資源的存取權限
  4. 等待長連線恢復或心跳恢復期間,所有針對該 Session 的請求返回 E_SESSION_TERMINATED
  5. 終端 MAY 在長連線恢復後向 iFay_Runtime 推送一次 SessionStateChanged 通知,但此時 Session 已不可恢復

5.4.5 心跳的可選模式

實作 MAY 支援以下心跳最佳化模式(須明確宣告支援):

  1. 聚合心跳:iFay_Runtime 在一條 Heartbeat 訊息中同時報告多個 Session(適用於一個 runtime 管理大量 Session 的場景)
  2. 降頻心跳:當 Session 長期未發起資源存取時,心跳間隔可放大至最長 60 秒

聚合心跳的具體格式作為可選擴充,在 schema.json 中定義為可選欄位。

5.5 Session 終止

5.5.1 終止觸發條件

觸發原因reason 欄位值觸發方
主動釋放"client_release"iFay_Runtime
心跳逾時"liveness_timeout"終端 Liveness_Detection
撤銷終止"credential_revoked"終端撤銷清單更新
資源不可用"resource_unavailable"終端 OS 整合層
憑證過期"credential_expired"終端定期檢查
交接完成"handed_over"終端交接流程
強制終止"forced"終端管理介面(如管理員操作)

5.5.2 終止步驟

終端 MUST 按以下步驟執行終止:

  1. 狀態切換{active|handover_pending} → terminating
  2. OS 資源回收:透過 §1.3.2 介面撤銷 Fay 程序的資源存取權限
  3. 釋放並行控制:將 (resource_id, access_mode) 從佔用清單中移除(參見第 7 章讀寫鎖更新)
  4. 通知 iFay_Runtime:傳送 SessionStateChanged 訊息,狀態為 terminated,附帶 reason
  5. 狀態切換terminating → terminated
  6. 持久化:MAY 將 Session 歷史記錄寫入稽核日誌

5.5.3 終止的冪等性

iFay_Runtime 發起的 SessionRelease 訊息 MUST 是冪等的:

  • 若 Session 已處於 terminatingterminated,再次釋放 MUST 返回成功(不視為錯誤)
  • 若 Session 不存在(已被回收),返回 E_SESSION_NOT_FOUND

5.5.4 終止的可觀測性

終端 MUST 至少向以下方通知 Session 終止:

  1. 該 Session 關聯的 iFay_Runtime(透過 SessionStateChanged
  2. 終端本地的資源管理子系統(用於更新可用性狀態)

終端 MAY 選擇是否通知:

  • 其他正在等待該資源的 iFay_Runtime(透過 §6 交接通知機制)
  • 稽核日誌(取決於終端實作的稽核策略)

5.6 狀態變更通知

SessionStateChanged (body of ProtocolMessage) {
  required session_id : Session_ID
  required new_state  : SessionState
  optional reason     : string
  optional details    : map<string, string>
}

終端 MUST 在以下狀態轉移發生時向 iFay_Runtime 傳送 SessionStateChanged:

  1. creating → active:Session 建立成功(也可透過 AuthResult 直接告知,二選一)
  2. active → handover_pending:Session 進入交接流程
  3. handover_pending → active:交接被取消或拒絕
  4. * → terminatingterminating → terminated:終止過程的開始與結束

5.7 Session 與憑證生命週期的關係

Session 的生命週期獨立於憑證生命週期,但終端 MUST 監控憑證狀態變化:

憑證事件Session 影響
憑證 not_after 到達關聯 Session 立即按 credential_expired 終止
憑證被撤銷(撤銷聲明到達終端)關聯 Session 立即按 credential_revoked 終止
憑證被同 ID 重新簽發(理論不可能,因 descriptor_id 不可重複使用)不適用
憑證被新版本覆蓋(更新流程)Session 不受影響(仍使用原 credential_ref 校驗)

5.8 Session 數量限制

終端 SHOULD 實作 Session 數量限制以防資源耗盡:

維度預設限制備註
單終端總活躍 Session1024可由終端策略調整
單 Fay 活躍 Session64防止單一 Fay 佔滿系統資源
單 Resource_ID 活躍 read Session32防止 read 共享被濫用

超出限制時,終端 MUST 返回 E_SESSION_LIMIT_EXCEEDED