通用面試:如何用 Alt-Svc 平順遷移到 HTTP/3?
題干與適用場景
一個 HTTPS origin 想逐步啟用 HTTP/3:伺服器可用不同端點提供等價服務,但部分網路阻斷 UDP,客戶端也可能保留舊的替代服務快取。請解釋 Alt-Svc 的語意,並設計憑證、快取、回退、失效與觀測方案。
Alt-Svc 宣告的是同一 origin 的等價服務入口,不是重新導向,也不改變使用者可見 URL。本題考察協定遷移,不代表所有客戶端會立即改用 HTTP/3。
面試官考察點
- 能否區分 Alt-Svc、HTTP 重新導向與 DNS 服務繫結的職責。
- 能否說明替代端點仍需通過 origin 權威性與 TLS 憑證驗證。
- 能否處理 Alt-Svc 快取壽命、
clear失效、UDP 不可達與回退。 - 能否把灰度、連線成功率、協定版本與安全事件納入遷移觀測。
回答前需要釐清的問題
- 替代端點是否由同一營運方控制,憑證涵蓋哪些主機名稱?
- 客戶端、CDN、代理與防火牆是否支援 HTTP/3 與 UDP/443?
- 是否需要跨連接埠或跨主機名稱宣告,是否有嚴格 origin 邊界?
- 遷移期間如何撤銷錯誤宣告並清除客戶端快取?
- 成功指標是握手率、首位元組時間、尾延遲,還是錯誤率?
30 秒回答框架
「Alt-Svc 讓 origin 宣告一個可提供等價服務的替代端點,客戶端可在後續連線中嘗試它;它不是 3xx 重新導向,也不改變 URL。啟用 HTTP/3 時,我會先驗證替代端點的 TLS 憑證與 origin 權威性,設定短 ma 做灰度,UDP 失敗時回落到 HTTP/2 或 HTTP/1.1,並保留 clear 撤銷路徑。監控按客戶端、網路、協定版本拆分握手與尾延遲,確認安全與可用性後再延長快取。」
分步驟深入解答
1. 說明 Alt-Svc 的角色
RFC 7838 定義 Alt-Svc 回應標頭,讓客戶端發現同一 origin 的替代服務。客戶端可以繼續使用原 URL,傳輸層在能力允許時改連替代端點;應用層的 origin 語意與權限模型不能因此被繞過。
2. 先做權威性和 TLS 驗證
替代主機名稱或連接埠不能只憑回應標頭取得信任。客戶端需要依 RFC 7838 的 origin 與憑證規則驗證服務,憑證必須涵蓋實際連線名稱,伺服器也要確認替代端點不會混用其他租戶流量。跨 origin 宣告應視為高風險設定。
3. 設計漸進宣告
先只對小比例客戶端或特定區域送出 Alt-Svc,使用較短的 ma(最大年齡)觀察成功率。HTTP/3 端點可用 h3 標識;舊客戶端忽略該標頭即可繼續使用原協定。不要把一次宣告當成客戶端必然升級的承諾。
HTTP/2 200 OK
Alt-Svc: h3=":443"; ma=300
Cache-Control: private, no-store4. 處理 UDP 失敗和回退
企業防火牆、行動網路或 NAT 可能阻斷 UDP。客戶端應在連線失敗或逾時後回到原有 HTTP/2/1.1 路徑,應用請求不能因嘗試替代服務而重複產生副作用。伺服器記錄協定嘗試與回退原因,避免把網路阻斷誤判為應用故障。
5. 撤銷與快取失效
發現憑證、路由或安全問題時,送出 Alt-Svc: clear 清除客戶端的替代服務快取,並停止繼續發出舊宣告。ma 到期也會讓客戶端重新評估;灰度階段應使用足夠短的壽命,穩定後再延長,不能只依賴 CDN 清快取。
6. 協同 HTTPS DNS 記錄
RFC 9460 的 SVCB/HTTPS 記錄也能發布服務繫結參數。它與 Alt-Svc 都可幫助發現 HTTP/3,但傳播路徑、快取與維運責任不同。設計時要規定衝突時的優先順序、回滾方式與監控,避免 DNS 已切換而 HTTP 回應仍指向舊端點。
高品質示範回答
「我會把 Alt-Svc 視為同一 origin 的替代服務發現,不把它當重新導向。先驗證替代端點的 TLS 憑證、權威性與租戶隔離,再對小範圍客戶端送出 h3 與短 ma。UDP 或 HTTP/3 握手失敗時回退到 HTTP/2/1.1,確保寫入請求不重複。發現設定或安全問題就用 Alt-Svc: clear 並停止舊宣告。觀測按網路、客戶端、協定版本拆分握手率、回退率與尾延遲;若同時使用 HTTPS DNS 記錄,則定義衝突優先順序與統一回滾流程。」
常見錯誤
- 把 Alt-Svc 當 301/308 → 改變了 URL 與快取語意 → 說明它只是替代服務發現。
- 不驗證替代端點憑證 → 可能把流量送到不可信服務 → 按 origin 與 TLS 規則驗證。
- 設定很長的 ma 再做灰度 → 錯誤設定長時間滯留 → 先短壽命,穩定後延長。
- UDP 失敗就讓請求失敗 → 網路環境導致不必要中斷 → 回退到 HTTP/2 或 HTTP/1.1。
- 只清 CDN 不發 clear → 客戶端仍使用舊替代端點 → 使用 clear 並等待快取過期。
追問及應對
Alt-Svc 會改變瀏覽器網址列的 URL 嗎?
不會。它描述連線到同一 origin 的替代服務,應用仍使用原 URL;這也是它與 HTTP 重新導向的關鍵差別。
為什麼 HTTP/3 失敗不能直接重試寫入請求?
傳輸嘗試失敗不等於應用操作沒有到達。客戶端應透過冪等鍵或明確請求語意避免重複副作用,並優先在同一操作上下文中回退,而不是盲目重新建立資源。
ma=300 的含義是什麼?
它表示替代服務資訊的最大快取年齡為 300 秒。它不是 HTTP/3 連線必須保持的時間,也不保證客戶端一定在這段時間內使用或嘗試替代端點。