第 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 存取控制) |
active | Session 處於活躍狀態,Fay 可執行授權範圍內的操作 |
handover_pending | Session 正在參與控制權交接(參見第 6 章),尚未確定結果 |
terminating | Session 正在被終止,資源回收中,新請求被拒絕 |
terminated | Session 已完全終止,session_id 進入歷史記錄 |
5.1.2 狀態轉移圖
┌─────────────┐
│ (start) │
└──────┬──────┘
│ 授權校驗通過
▼
┌─────────────┐
│ creating │
└──────┬──────┘
│ 資源初始化完成
▼
┌─────────────┐ 交接發起 ┌──────────────────┐
│ active │────────────→│ handover_pending │
└──────┬──────┘ └──────┬───────────┘
│ ↑ │
終止條件│ │交接逾時回滾 │交接完成
▼ │ ▼
┌─────────────┐ ┌─────────────┐
│ terminating │←─────────────┤ (handed off)│
└──────┬──────┘ └─────────────┘
│ 資源回收完成
▼
┌─────────────┐
│ terminated │
└─────────────┘
5.1.3 狀態轉移規則
終端 MUST 僅按下表允許的轉移更新 Session 狀態:
| 目前狀態 | 目標狀態 | 觸發條件 |
|---|---|---|
creating | active | 資源初始化完成 |
creating | terminating | 初始化失敗(如資源被其他 Session 佔用) |
active | handover_pending | 收到針對該 Session 的交接請求 |
active | terminating | 主動釋放、心跳逾時、撤銷終止、資源不可用 |
handover_pending | terminating | 交接成功(原 Session 必須終止)或交接逾時取消 |
handover_pending | active | 交接被新控制方拒絕(回退到原狀態) |
terminating | terminated | 資源完全釋放、狀態持久化完成 |
實作 MUST NOT 進行未列出的狀態轉移。
5.1.4 狀態轉移的原子性
每次狀態轉移 MUST 滿足以下原子性要求:
- 狀態讀取、判斷、寫入 MUST 在臨界區內完成,外部觀察者不會看到中間狀態
- 狀態轉移與對應的資源操作(如 OS 存取控制下發)MUST 作為一個交易執行,要麼全部成功,要麼全部回滾
5.2 Session 建立
5.2.1 建立觸發
Session 在以下場景被建立:
- iFay_Runtime 發起 AuthRequest 且授權校驗通過(參見 §3.3、§4.3)
- 控制權交接成功後,為新控制方建立新 Session(參見第 6 章)
5.2.2 建立步驟
終端 MUST 按以下步驟建立 Session:
- 資源佔用預檢:檢查目標
resource_id在access_mode下是否可被佔用(參見 §5.3 與第 7 章讀寫鎖規則) - 產生 Session_ID:分配新的 UUID v7
- 設定初始狀態:
state = "creating" - 建構 Session 物件:填充 §2.5 定義的欄位
- 下發 OS 存取控制:透過 §1.3.2 介面告知作業系統允許該 Fay 程序以指定模式存取資源
- 狀態切換:
state: creating → active,記錄created_at和last_heartbeat_at - 返回 AuthResult:將
session_id透過 AuthResult 回傳給 iFay_Runtime
5.2.3 建立失敗處理
若任一步驟失敗:
- 已分配的資源(如 OS 存取控制條目)MUST 被回滾
- Session 狀態切換到
terminating然後立刻terminated - 返回對應的錯誤碼(如
E_RESOURCE_BUSY、E_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 個 read | read | 允許建立 |
| ≥1 個 read | write/execute/configure | 拒絕(E_RESOURCE_BUSY) |
| 1 個 write/execute/configure | 任意模式 | 拒絕(E_RESOURCE_BUSY) |
5.3.3 資源不可用的級聯終止
當 Resource_ID 對應的資源變為不可用(如硬體斷開、軟體程序當機、作業系統回報資源消失)時:
- 終端 MUST 立即將所有繫結該資源的 Session 切換到
terminating - 終端 MUST 向所有受影響的 iFay_Runtime 推送
SessionStateChanged通知,reason為"resource_unavailable" - 資源恢復後,已終止的 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:
- 收到 Heartbeat 後立即返回 HeartbeatAck(
sequence_number與請求一致) - 更新該 Session 的
last_heartbeat_at - 拒絕
sequence_number小於已記錄最大值的 Heartbeat(防止重放)
5.4.3 雙重判定
終端 MUST 僅當同時滿足以下兩個條件時才判定 Session 失效:
- 長連線已斷開超過心跳逾時閾值
- 自
last_heartbeat_at起的時長超過心跳逾時閾值
這種雙重判定的設計意圖是:
- 長連線短暫抖動期間應用層心跳可能仍正常(不應誤判失效)
- 應用層心跳停止但長連線仍在(如 Fay 卡頓)需透過心跳逾時偵測
- 兩者同時發生才是高可信度的失效訊號
5.4.4 失效後的處理
判定失效後,終端 MUST:
- 切換 Session 狀態:
active → terminating - 釋放佔用的 Terminal_Resource
- 透過 OS 介面撤銷該 Fay 對資源的存取權限
- 等待長連線恢復或心跳恢復期間,所有針對該 Session 的請求返回
E_SESSION_TERMINATED - 終端 MAY 在長連線恢復後向 iFay_Runtime 推送一次
SessionStateChanged通知,但此時 Session 已不可恢復
5.4.5 心跳的可選模式
實作 MAY 支援以下心跳最佳化模式(須明確宣告支援):
- 聚合心跳:iFay_Runtime 在一條 Heartbeat 訊息中同時報告多個 Session(適用於一個 runtime 管理大量 Session 的場景)
- 降頻心跳:當 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 按以下步驟執行終止:
- 狀態切換:
{active|handover_pending} → terminating - OS 資源回收:透過 §1.3.2 介面撤銷 Fay 程序的資源存取權限
- 釋放並行控制:將 (resource_id, access_mode) 從佔用清單中移除(參見第 7 章讀寫鎖更新)
- 通知 iFay_Runtime:傳送
SessionStateChanged訊息,狀態為terminated,附帶 reason - 狀態切換:
terminating → terminated - 持久化:MAY 將 Session 歷史記錄寫入稽核日誌
5.5.3 終止的冪等性
iFay_Runtime 發起的 SessionRelease 訊息 MUST 是冪等的:
- 若 Session 已處於
terminating或terminated,再次釋放 MUST 返回成功(不視為錯誤) - 若 Session 不存在(已被回收),返回
E_SESSION_NOT_FOUND
5.5.4 終止的可觀測性
終端 MUST 至少向以下方通知 Session 終止:
- 該 Session 關聯的 iFay_Runtime(透過
SessionStateChanged) - 終端本地的資源管理子系統(用於更新可用性狀態)
終端 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:
creating → active:Session 建立成功(也可透過 AuthResult 直接告知,二選一)active → handover_pending:Session 進入交接流程handover_pending → active:交接被取消或拒絕* → terminating與terminating → 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 數量限制以防資源耗盡:
| 維度 | 預設限制 | 備註 |
|---|---|---|
| 單終端總活躍 Session | 1024 | 可由終端策略調整 |
| 單 Fay 活躍 Session | 64 | 防止單一 Fay 佔滿系統資源 |
| 單 Resource_ID 活躍 read Session | 32 | 防止 read 共享被濫用 |
超出限制時,終端 MUST 返回 E_SESSION_LIMIT_EXCEEDED。
