Giao thức khôi phục phiên
Trên trang này
Khôi phục phiên cho phép kết nối lại với độ trễ thấp bằng cách bỏ qua handshake X25519 đầy đủ. Client có thể thiết lập lại một phiên bảo mật bằng các bí mật đối xứng đã thương lượng trước đó và một session token hợp lệ.
Ánh xạ mã nguồn
src/Nalix.Codec/ProtocolFrames/Session/SessionResume.cssrc/Nalix.Runtime/Handlers/SessionHandlers.cssrc/Nalix.Runtime/Sessions/SessionService.cssrc/Nalix.Abstractions/Networking/Sessions/ISessionService.cssrc/Nalix.Abstractions/Networking/Sessions/ISessionFactory.cssrc/Nalix.Abstractions/Networking/Sessions/ISessionStore.cssrc/Nalix.SDK/Transport/Extensions/ResumeExtensions.cs
1. Thiết kế và lý do
Nalix dùng gói SessionResume với một máy trạng thái Stage để quản lý trạng thái phiên. Gói này hỗ trợ các giai đoạn REQUEST và RESPONSE để máy chủ có thể khôi phục hoặc từ chối phiên chỉ trong một lượt khứ hồi.
- Khôi phục nguyên tử: Máy chủ áp dụng snapshot phiên đã khôi phục và trả về một token phản hồi mới trong một lượt khứ hồi duy nhất.
- Tái nhập không trạng thái: Một phiên có thể được khôi phục ngay lập tức miễn là
SessionToken8 byte vàSecretliên quan còn hợp lệ. - Xoay vòng token: Máy chủ có thể trả về một
SessionTokenđã xoay vòng trong phản hồi thành công.
2. Handshake so với khôi phục phiên
sequenceDiagram
participant C as Client (SDK)
participant S as Server (Runtime)
Note over C, S: Option A: Full Handshake (Standard)
C->>S: SessionInit (PublicKey, Nonce)
S->>C: SessionChallenge (PublicKey, Nonce, Proof)
C->>S: SessionProof (Proof)
S->>C: SessionEstablished (Proof, SessionToken)
Note over C, S: Option B: Session Resume (Fast)
C->>S: SessionResume [Stage=REQUEST, Token=T1]
S->>C: SessionResume [Stage=RESPONSE, Token=T2, Reason=NONE]3. Đặc tả giao thức
Cấu trúc gói tin
SessionResume là một gói tín hiệu có kích thước cố định, mang theo giai đoạn, session token, proof và lý do kết quả cần thiết cho việc khôi phục.
4. Chi tiết triển khai
Logic xử lý phía máy chủ (SessionHandlers.HandleAsync)
Khi một yêu cầu SessionResume (0x0002, SESSION_SIGNAL) đến SessionHandlers.HandleAsync:
- Gói tin đến được kiểm tra để đảm bảo các trường
Stage(SessionResumeStage.REQUEST),SessionTokenvàProofđúng cấu trúc. - Máy chủ gọi
ISessionService.ConsumeAsync(packet.SessionToken, entry => ...)để xác thực và tiêu thụSessionEntryđã lưu một cách nguyên tử. - Bên trong predicate, nó xác minh
Prooftheo thời gian hằng số bằngHmacKeccak256.Computetrên bộ đệm 16 byteSessionToken (8B LE) || TimeWindow (8B LE, UnixSeconds / 30)qua các cửa sổ thời gian[t - 1, t, t + 1](các bucket 30 giây). - Nếu xác thực thành công, runtime khôi phục
Secret,Algorithm,Levelcủa kết nối và trạng thái đã lưu, đồng thời đánh dấu trạng thái handshake là đã thiết lập. - Runtime lưu kết nối đang hoạt động dưới
ConnectionIdmới (newToken) quaISessionService.SaveSessionAsync(connection), tính proof phản hồi của máy chủ (HmacKeccak256trênnewToken (8B LE) || TimeWindow (8B LE)), và gửiSessionResume(Stage = RESPONSE,SessionToken = newToken,Reason = ProtocolReason.NONE,Proof = responseProof). - Nếu xác thực, tra cứu token hoặc xác minh proof thất bại, máy chủ gửi
SessionResume(Stage = RESPONSE) vớiProtocolReasontương ứng với lỗi và đóng kết nối.
5. Bảo mật và vận hành
- Bảo mật token: Token không thay thế được bí mật đối xứng, nhưng cần được coi là dữ liệu nhạy cảm vì nó định danh một phiên đang hoạt động.
- Chính sách xoay vòng: Client phải cập nhật
session.State.SessionTokencục bộ ngay khi nhận đượcRESPONSEthành công. SDK đã làm việc này trongsrc/Nalix.SDK/Transport/Extensions/ResumeExtensions.cs. - Vô hiệu hóa: Phiên bị vô hiệu hóa khi client ngắt kết nối tường minh hoặc sau khi TTL (Time-To-Live) của session store đã cấu hình hết hạn.