WebTransport(HTTP/3上の双方向通信)
ヘッドオブラインブロッキングに悩まされず、順序保証の要否をストリーム単位で選べる新しい双方向トランスポートです。QUIC上のストリームとデータグラム、WebSocketとの違い、ブラウザAPIまでを原理から理解できます。
- WebTransport は QUIC 上に双方向/単方向ストリームとデータグラムを提供し、順序保証と信頼性の要否を送信単位で選べるアプリ層トランスポートである。
- QUIC が各ストリームを独立に再送するため、あるストリームのパケット欠落が他ストリームを止めるヘッドオブラインブロッキングを構造的に回避する。
- WebSocket が単一の順序付きメッセージ列なのに対し、WebTransport は多重化・非順序・非信頼を混在でき、ゲームや低遅延メディアに向く。
WebSocket では足りなかったもの
/network/websocket-protocol/ は「1 本の順序付きメッセージ列を全二重で流す」ための優れた土台ですが、下地が TCP であるため二つの構造的制約を抱えます。第一に、単一の順序付きバイトストリームなので、独立した複数の論理チャネルを 1 接続で扱いたくても、それらは同じ TCP 順序に縛られます。第二に、TCP は欠落セグメントを再送し終えるまで後続データをアプリへ渡さないため、ヘッドオブラインブロッキング(HoL ブロッキング) が避けられません。1 パケットの喪失が、論理的には無関係な後続メッセージまで足止めします。
WebTransport は、この二つを QUIC の力で解く「ブラウザから使えるアプリ層トランスポート」です。HTTP/3 と同じ QUIC 接続の上に、複数の独立したストリームと、順序も再送も持たないデータグラムを同居させ、送信するデータごとに信頼性と順序保証の要否を選べるようにします。土台となる QUIC のストリーム多重化・暗号化・コネクション ID の詳細は /network/quic-internals/ を前提とします。
QUIC が HoL ブロッキングを消す仕組み
WebTransport の中核的な価値は、QUIC がストリームを独立の順序空間として扱う点に由来します。TCP では 1 本のシーケンス番号空間しかないため、番号の穴(欠落)が埋まるまで全体が待ちます。QUIC は各ストリームに独立したフロー制御とオフセットを与え、パケット喪失時の再送もそのストリームのデータだけをやり直します。
横にスクロール
TCP(WebSocket): [S1-a][S2-a][S1-b(欠落)][S2-b] ...
→ S1-b の再送完了まで S2-b もアプリに渡らない(HoL ブロッキング)
QUIC(WebTransport): ストリーム1: a → b(欠落・再送)
ストリーム2: a → b ← 1 の欠落と無関係に進む
したがって「独立した用途は独立したストリームに分ける」のが WebTransport 設計の基本方針になります。ゲームのチャットと状態同期を別ストリームにすれば、片方のパケット喪失がもう片方を止めません。なお TLS 記録層の HoL とは層が異なる話であり、ここで消えるのはあくまでトランスポート層の待ちです。
「TCP でも複数コネクションを張れば多重化できる」と思うかもしれませんが、それでは接続確立コストが線形に増え、輻輳制御も接続ごとにバラバラになります。QUIC は 1 接続内に多数のストリームを内包しつつ、輻輳制御と暗号化コンテキストは接続全体で共有します。多重化の利益と単一接続の効率を両立できるのが QUIC 由来の本質的な強みです。
三つの送信プリミティブ
WebTransport はアプリに三種類の送信手段を与えます。用途に応じて明示的に選ぶのが要点です。
| プリミティブ | 順序保証 | 信頼性(再送) | 主な用途 |
|---|---|---|---|
| 双方向ストリーム | ストリーム内で保証 | あり | 要求応答、ファイル転送、確実に届けたい制御 |
| 単方向ストリーム | ストリーム内で保証 | あり | サーバー起点の一方向イベント配信 |
| データグラム | なし | なし(届かなくても再送しない) | 位置更新、音声/映像、最新値だけ意味がある信号 |
データグラムは QUIC の DATAGRAM フレーム(RFC 9221)を土台とし、HTTP レイヤでは HTTP データグラム(RFC 9297)として運ばれます。再送しないため、古くなった位置情報を律儀に届けるより「次の新しい値」を送る方が有利な用途で威力を発揮します。逆に、順序と確実な到達が必要なら双方向ストリームを使います。両者を同じセッションで同時に使える点が、単一メッセージ列しか持たない WebSocket との決定的な差です。
ブラウザ API モデル
ブラウザからは、セッション・ストリーム・データグラムがそれぞれ Streams API のオブジェクトとして露出します。TCP ソケットのような生バイト列ではなく、ReadableStream / WritableStream を介した非同期モデルです。
// セッション確立(HTTP/3 上に張られる)
const wt = new WebTransport("https://example.com:4433/counter");
await wt.ready;
// データグラム送受信(非順序・非信頼)
const writer = wt.datagrams.writable.getWriter();
await writer.write(new Uint8Array([0x01, 0x02]));
// 双方向ストリーム(順序・信頼あり)
const stream = await wt.createBidirectionalStream();
const sw = stream.writable.getWriter();
await sw.write(new TextEncoder().encode("hello"));
// サーバーが開いた受信ストリームを受ける
for await (const incoming of wt.incomingUnidirectionalStreams) {
// incoming は ReadableStream
}
セッションはプロトコル上、HTTP/3 の拡張 CONNECT(:protocol = webtransport)で確立されます。これは HTTP/2 の Extended CONNECT(RFC 8441)と同じ発想を HTTP/3 へ持ち込んだもので、通常の HTTP/3 リクエストと同一の QUIC 接続を共有できることを意味します。つまり同じ接続でページ資源を配りながら、その中の一部を WebTransport セッションとして使えます。HTTP/3 が既存 HTTP とどう連続しているかは /network/http-versions/ が背景になります。
WebTransport は QUIC 上でのみ動き、TLS 1.3 が常に必須です。WebSocket の ws://(平文)に相当する非暗号化モードは存在しません。加えて、公的に検証可能な証明書だけでなく、事前に証明書ハッシュ(serverCertificateHashes)を渡して短命な自己署名証明書で接続する経路も規定されており、P2P 的な用途やローカル開発で使えます。ただしこの経路はハッシュの有効期間や配布方法に運用上の注意が要ります。
WebSocket との使い分け
両者は競合するというより、必要とする性質が違います。順序付き単一チャネルで十分なチャットやシンプルな通知なら WebSocket が依然として簡潔です。一方、多数の独立チャネルを多重化したい、HoL ブロッキングを避けたい、信頼性を犠牲にしても最新値の低遅延到達を優先したい、という要件が一つでも強いなら WebTransport が適します。
| 観点 | WebSocket | WebTransport |
|---|---|---|
| 下位トランスポート | TCP(TLS 上) | QUIC(TLS 1.3 内包) |
| 多重化 | 単一の順序付きメッセージ列 | 複数ストリーム+データグラムを同居 |
| HoL ブロッキング | TCP 由来で発生しうる | ストリーム独立再送で回避 |
| 非信頼配送 | 不可(常に順序・再送) | データグラムで可能 |
| 接続移行 | IP 変化で切断(TCP 4 タプル依存) | コネクション ID で経路変更に追随 |
押さえるべきは 4 点。(1) WebTransport は QUIC/HTTP/3 上のアプリ層トランスポートで、ストリーム(順序・信頼あり)とデータグラム(非順序・非信頼)を混在できる。(2) HoL ブロッキング回避は QUIC のストリーム独立再送が根拠で、WebTransport 独自機能ではない。(3) セッションは拡張 CONNECT(:protocol = webtransport)で HTTP/3 接続を共有して張る。(4) 平文フォールバックは無く TLS 1.3 が必須。「WebTransport が HoL を直接解決する」と書くと因果が不正確です。
低遅延用途での位置づけ
リアルタイムメディアや対戦ゲームの領域では、これまで /network/webrtc-ice-stun-turn/ の DataChannel(SCTP over DTLS)が「ブラウザで非信頼・非順序を選べる」数少ない手段でした。WebTransport は、その選択肢をクライアント・サーバー型に近い簡潔なモデルで提供します。WebRTC が P2P とメディア交渉のために重い ICE/SDP 折衝を要するのに対し、WebTransport はサーバーへの単純な接続で多重化ストリームとデータグラムを得られるため、サーバー集約型の低遅延配信や状態同期では構成が明快になります。
要するに WebTransport は、「順序保証と信頼性は本来アプリが送信ごとに選ぶべきもの」という QUIC の設計思想を、そのままブラウザ API へ引き上げたトランスポートです。全部を順序付き・再送ありで縛る WebSocket と、P2P とメディアに特化した WebRTC の中間で、サーバー型の低遅延双方向通信という空白を埋める位置にあります。
ネットワークの記事ガイド
WebTransport(HTTP/3上の双方向通信)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
WebTransport
比較で見る軸
難易度: advanced / カテゴリ: ネットワーク / タグ数: 5
導入後に効く点
QUIC が各ストリームを独立に再送するため、あるストリームのパケット欠落が他ストリームを止めるヘッドオブラインブロッキングを構造的に回避する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ネットワーク
- タグ数
- 5
判断チェックリスト
- 自社の用途が「WebTransport / QUIC」に近いか確認する。
- 強みである「WebTransport は QUIC 上に双方向/単方向ストリームとデータグラムを提供し、順序保証と信頼性の要否を送信単位で選べるアプリ層トランスポートである。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。