WebTransport 指南:串流、資料報、HTTP/3 與適用場景

技术架构

WebTransport 是一個基於 HTTP/3 的瀏覽器 API,用於用戶端和伺服器之間的雙向通訊。它在同一個連線裡提供兩類傳輸方式:可靠串流和不可靠資料報。

這讓它適合低延遲應用,但它不是 WebSocket 或 WebRTC 的萬用替代品。判斷是否該用 WebTransport,最好從你的應用資料模式開始。

WebTransport 是什麼

WebTransport 允許瀏覽器連線到 HTTP/3 伺服器,並透過兩種方式交換資料:

  • 可靠串流:有序位元組流,適合必須正確到達的資料。
  • 不可靠資料報:盡力而為的訊息,適合低延遲優先、允許遺失的資料。

它運行在安全上下文中,實際使用時應按 HTTPS 處理。它還依賴瀏覽器、伺服器、網路路徑、CDN 和代理層對 HTTP/3 的支援。

參考文件:

核心模型

可以把 WebTransport 連線理解成一個工作階段,裡面可以承載多個獨立通道。

瀏覽器
  WebTransport 工作階段
    可靠串流:聊天訊息、檔案分塊、控制命令
    可靠串流:另一個獨立操作
    資料報:玩家位置、感測器更新、即時游標
HTTP/3 伺服器

關鍵點是:不同資料可以使用不同傳輸規則。付款確認不應該像遊戲位置更新一樣傳送;遊戲位置更新也不應該被大檔案傳輸堵住。

串流與資料報

特性 串流 資料報
傳輸可靠性 可靠 盡力而為
順序 單個串流內有序 不保證順序
適合內容 檔案、命令、聊天、交易 遊戲狀態、遙測、即時游標
遺失處理 傳輸層負責可靠性 應用必須能容忍遺失
資料形態 位元組塊 獨立訊息

正確性重要時用串流。最新值比舊值更重要時,用資料報。

WebTransport 與 WebSocket

WebSocket 仍然是很多應用更簡單的預設選擇。它部署廣、代理友好、生态成熟。

WebTransport 更適合這些需求:

  • 一個工作階段裡有多個獨立串流。
  • 需要低延遲的不可靠訊息。
  • 希望減少無關資料流之間的隊頭阻塞。
  • 想使用基於 HTTP/3 的現代用戶端-伺服器傳輸。

這些情況繼續用 WebSocket:

  • 只需要一個可靠、有序的訊息流。
  • 希望最大化相容現有基礎設施。
  • 伺服器、CDN 或公司網路不能穩定處理 HTTP/3。
  • 希望維運路徑盡可能簡單。

不要因為 WebTransport 更新就遷移一個已經穩定工作的 WebSocket 應用。只有當你的資料模式真正受益於串流、資料報或 HTTP/3 特性時,遷移才有意義。

WebTransport 與 WebRTC Data Channel

WebRTC Data Channel 更偏向點對點或媒體相關即時系統。WebTransport 是用戶端到伺服器。

適合 WebRTC 的情況:

  • 瀏覽器需要點對點通訊。
  • 應用本來就包含音視訊協商。
  • 需要 WebRTC 基礎設施處理 NAT 穿透。

適合 WebTransport 的情況:

  • 瀏覽器主要和你的伺服器通訊,而不是直接和另一個瀏覽器通訊。
  • 希望使用更接近 Web 平台的 Streams API。
  • 不需要完整 WebRTC 技術棧。

如果你已經有穩定的 WebRTC 架構,WebTransport 未必能帶來足夠收益來支撐重寫。

基礎用戶端寫法

使用前一定要做功能偵測。

async function connectWebTransport(url) {
  if (!("WebTransport" in globalThis)) {
    throw new Error("WebTransport is not available in this browser.");
  }

  const transport = new WebTransport(url);

  transport.closed
    .then(() => {
      console.log("WebTransport closed normally.");
    })
    .catch((error) => {
      console.error("WebTransport closed unexpectedly:", error);
    });

  await transport.ready;
  return transport;
}

const transport = await connectWebTransport("https://example.com:4433/wt");

生產環境要把這段封裝到降級邏輯裡。如果 WebTransport 不可用或連線失敗,根據功能切換到 WebSocket、Server-Sent Events 或普通 HTTP。

傳送資料報

資料報適合頻繁狀態更新,尤其是舊訊息很快失去價值的場景。

const writer = transport.datagrams.writable.getWriter();
const encoder = new TextEncoder();

await writer.write(encoder.encode(JSON.stringify({
  type: "cursor",
  x: 240,
  y: 180,
  t: Date.now()
})));

設計資料報時,每條訊息都應該能獨立理解,不要依賴前面的每一條資料報都被收到。

適合資料報的內容:

  • 目前玩家位置。
  • 最新游標位置。
  • 感測器讀數。
  • 輸入狀態或線上心跳。
  • 即時預覽狀態。

不適合資料報的內容:

  • 付款操作。
  • 帳戶變更。
  • 需要嚴格順序的文件編輯。
  • 任何必須稽核的操作。

使用可靠串流

如果接收方必須按順序拿到所有位元組,就用串流。

const stream = await transport.createBidirectionalStream();
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
const encoder = new TextEncoder();
const decoder = new TextDecoder();

await writer.write(encoder.encode("hello"));

const { value } = await reader.read();
if (value) {
  console.log(decoder.decode(value));
}

await writer.close();

互不相關的操作應該放到不同串流裡。這樣大檔案傳輸不會阻塞小的控制訊息。

上線前檢查清單

上線 WebTransport 前,要檢查整條鏈路:

  • 目標使用者的瀏覽器支援情況。
  • 伺服器是否支援 HTTP/3。
  • TLS 憑證和安全上下文設定。
  • UDP 和 QUIC 在防火牆、公司網路中的表現。
  • CDN 或反向代理是否支援。
  • 長連線工作階段下的負載平衡行為。
  • 連線失敗率、重試率和降級使用率監控。
  • 串流的背壓處理。
  • 資料報訊息大小限制。
  • 工作階段建立時的驗證和授權。

最難的部分往往不是瀏覽器 API,而是網路和伺服器部署。

降級策略

一個實用的降級策略可以是:

優先嘗試 WebTransport
  如果不可用或連線失敗:
    用 WebSocket 承接雙向可靠訊息
  如果不需要雙向:
    用 Server-Sent Events 做伺服器推送
  如果即時性不是必須:
    用 fetch 輪詢

即使傳輸方式變化,產品體驗也要保持可預期。例如儀表板可以在降級後變成較慢的輪詢;即時遊戲則可能需要停用對應房間。

適合使用 WebTransport 的場景

當應用同時有可靠資料和低延遲盡力而為資料時,WebTransport 值得評估:

  • 多人遊戲狀態加可靠比賽事件。
  • 協同編輯游標加可靠文件操作。
  • 高频遙測加可靠控制命令的即時儀表板。
  • 遠端設備控制中的狀態更新和命令流。
  • 需要伺服器即時資料通道的媒體相關應用。

共同特徵是混合流量:有些資料必須到達,有些資料必須新鮮。

不適合使用的場景

這些情況應避免使用 WebTransport:

  • 普通 REST 或 fetch API 已經夠用。
  • 一個 WebSocket 訊息流就能乾淨解決問題。
  • 需要相容較舊瀏覽器。
  • 部署鏈路不能穩定支援 HTTP/3。
  • 需要瀏覽器點對點通訊。
  • 團隊不想維護傳輸層降級邏輯。

新的傳輸技術只有在解決真實產品痛點時才有價值。

總結

WebTransport 給瀏覽器應用提供了基於 HTTP/3 的現代用戶端-伺服器傳輸,支援可靠串流和不可靠資料報。它的價值不是「全面替代 WebSocket」,而是讓一個工作階段能承載不同即時資料,並按不同可靠性要求傳輸。

如果你的應用真的需要這種彈性,就搭配功能偵測、降級方案和生產監控一起上線。

本站提供瀏覽器本地工具,免註冊即可試用 →

#WebTransport#HTTP/3#QUIC#实时通信#流式传输