WebTransportとは?HTTP/3上の双方向通信の仕組みと実装・採用判断を解説
WebTransportは、ブラウザからHTTP/3サーバへ接続し、双方向・単方向のストリームと信頼性のないデータグラムを1本のコネクションに多重化して扱うWeb APIです。2026年3月にSafari 26.4が対応してBaselineに入り、主要ブラウザで動く土台がそろいました。ただしIETFの仕様は第16版の草案のままで、実装の版ずれはそのまま接続失敗として表に出ます。この記事では、QUICとの関係、クライアントAPIの構造、拡張CONNECTで成立するサーバ側の仕組み、証明書とインフラの条件、そして見送るべき場面までを実装視点で整理しました。
まとめ|WebTransportを採用してよい条件と先に決めておく要件
先に結論を置きます。WebTransportが効くのは、ブラウザとサーバの間で独立した複数の流れを同時に走らせたい場合と、取りこぼしを許容してでも遅延を詰めたいデータを送りたい場合の二つです。逆に、1本の順序付きチャネルで足りるチャットや通知だけなら、WebSocketから乗り換える理由はありません。
採用を決める前に確認すべき要件は三つ。UDPの443番が経路上で通ること、前段のロードバランサやCDNがHTTP/3を終端して拡張CONNECTを通せること、そして通らなかった利用者を既存方式へ落とす縮退経路を持つことです。この三つのうち一つでも欠けると、ブラウザ側のコードが正しくても接続そのものが成立しません。
仕様の現在地も判断材料に入ります。draft-ietf-webtrans-http3 は第16版・In WG Last Call(最新改訂は2026年7月6日)で、標準化前です。サーバライブラリとブラウザが同じ版を実装していることを確認し、版が動いたら追従する体制まで含めて採否を決めてください。
WebTransportの定義とHTTP/3・QUIC上で動く通信モデル
WebTransportは単独のプロトコルではなく、QUICの機能をブラウザから使えるようにするための枠組みとAPIの組み合わせです。土台の性質を押さえておくと、後段のインフラ要件の理由がそのまま説明できます。
W3C草案とIETF draft-16という2026年8月時点の仕様の現在地
仕様は二層に分かれています。ブラウザから見えるAPIはW3Cが定め、2026年3月版のWorking Draftが最新です。編集者にはGoogle・Mozilla・Appleが並び、実装3社が同じ文書を書いている状態にあります。
プロトコル側はIETFのWEBTRANS WGが担当し、枠組みを定める draft-ietf-webtrans-overview が第12版(2026年3月2日)、HTTP/3への束縛が draft-ietf-webtrans-http3 第16版(2026年7月6日改訂・In WG Last Call)、HTTP/2への束縛が draft-ietf-webtrans-http2 第14版です。WG Last Callは最終確認の段階ですが、RFCではありません。破壊的変更が入りうる前提でバージョンを固定し、サーバ・クライアント双方の実装版を記録しておく運用が要ります。
QUIC上の単方向・双方向ストリームとデータグラムの三層構造
WebTransportが提供する抽象は三つです。単方向ストリーム(片方向の信頼性ある転送)、双方向ストリーム(全二重)、そしてデータグラム(到達も順序も保証しない小さなメッセージ)。この三つが同一のHTTP/3コネクション上に多重化されます。
暗号化は下位のQUICがTLS 1.3で行うため、接続先は常に https: スキームです。UDP上に信頼性とコネクション概念を再構築するというQUICの性質は、そのままWebTransportの挙動を決めます。トランスポート層の仕組みはQUICがTCPと何を変えたかを先に読むと理解が速く、本記事ではその上でブラウザに何が見えるかに絞ります。
WebSocketと分かれる多重化とHead-of-Line遮断の扱い
WebSocketは1本のTCP接続上に1本の順序付きメッセージ列を作ります。したがって大きなメッセージが詰まると後続が待たされ、Head-of-Line遮断が起きる。WebTransportは独立したストリームを並べられるため、片方が詰まってももう片方は進みます。
もう一つの差はデータグラムの有無です。WebSocketには「届かなくてもよいから速く」という選択肢がなく、再送が遅延として跳ね返ります。ハンドシェイクやフレーム構造といったWebSocket自体の仕組みはWebSocketの仕組みと実装解説に、SSEやWebRTCを含めた方式の横並び比較はSSE・WebSocket・WebRTCの性能比較にまとめてあるため、本記事では比較表を置かず、WebTransport側の実装条件に紙面を使います。
クライアントAPIの接続確立からストリームとデータグラムの送受信
APIの表面積は小さく、Promiseとストリームの標準的な組み合わせで書けます。落とし穴は生成順序と、ReadableStreamの読み方にあります。
new WebTransport()からready解決までの接続確立手順
接続の開始点はコンストラクタです。new WebTransport("https://example.com:4433/wt") のようにHTTPSのURLを渡し、ready の解決を待ってから送受信を始めます。ポート番号は既定の443以外を使う構成が多く、その場合はURLに明示します。
終了系のプロパティとメソッドも先に押さえておきます。closed はセッション終了時に解決するPromiseで、サーバ側からの切断理由を受け取る口です。明示的に閉じるときは close() にエラーコードと理由文字列を渡せます。接続統計は getStats() がHTTP/3コネクションの情報を返すため、往復遅延やパケット損失を画面側で観測して縮退判断に使えます。
createBidirectionalStreamで開く双方向ストリームの読み書き
クライアントから開く際の操作は createBidirectionalStream() または createUnidirectionalStream() の呼び出しです。前者は読み書き両方のストリームを持つオブジェクト、後者はWritableStreamを返します。サーバから開かれたストリームは incomingBidirectionalStreams と incomingUnidirectionalStreams をReadableStreamとして読むことで受け取ります。
ここでChromeの制約が効きます。公式ドキュメントがReadableStreamの非同期イテレータを未提供と明記しているため、for await ではなく getReader() を取ってループを回す書き方が必要です。ストリーム間の送信優先度を制御したい場合は createSendGroup() でグループを作り、まとめて順序を指定します。
MTU制限と欠落・順序入れ替わりを前提にしたデータグラム設計指針
データグラムは datagrams プロパティ経由で、WritableStreamとReadableStreamの組として扱います。Chrome公式ドキュメントは、個々のパケットが下位コネクションのMTUに制限され、送信が成功するとは限らず、届いた場合も任意の順序で到着しうると明記しています。
したがってアプリケーション側の設計が決まります。差分を送ると1個の欠落で状態がずれるため、送るのは「その時点の完全な状態」にする。位置情報やカーソル座標、センサ値のように、次の値が来れば前の値が不要になるデータが向いています。順序判定用に単調増加のシーケンス番号を載せ、受信側は古い番号を捨てる。この二点だけで、欠落と入れ替わりの大半は実害なく吸収できます。
congestionControlとreliabilityで変える接続の性格
コンストラクタの第2引数で接続の性格を指定できます。設定値は限られていて、意味を取り違えると効かない指定になります。
| オプション | 既定値 | 効き方 |
|---|---|---|
| allowPooling | false | 他セッションとの接続共有 |
| congestionControl | “default” | 輻輳制御の傾向をヒント |
| requireUnreliable | false | HTTP/2への降格を禁止 |
| serverCertificateHashes | なし | Web PKI以外で証明書検証 |
congestionControl は "throughput" と "low-latency" を選べますが、仕様上あくまでユーザーエージェントへのヒントで、指定どおりのアルゴリズムが選ばれる保証はありません。読み取り専用の reliability プロパティは、確立した接続が信頼性のある転送だけを支えるのか、信頼性のない転送も使えるのかを返します。データグラムを前提にした機能なら、この値を見てから機能を出し分けるのが安全です。
サーバ実装と証明書要件:draft-16対応ライブラリと自己署名の条件
サーバ側は既存のWebサーバに機能を足す形にはなりません。HTTP/3を終端し、拡張CONNECTを受け付ける実装が必要です。
拡張CONNECTとSETTINGSで成立するセッションの仕組み
セッションは拡張CONNECTリクエストで始まります。クライアントは擬似ヘッダ :protocol に webtransport-h3 を、:scheme に https を設定し、ブラウザからの接続ではOriginヘッダが必須です。サーバは2xxで応じるとセッションが成立します。
その前提として、サーバは SETTINGS_WT_ENABLED・SETTINGS_ENABLE_CONNECT_PROTOCOL・SETTINGS_H3_DATAGRAM をいずれも値1で送る必要があり、フロー制御には SETTINGS_WT_INITIAL_MAX_STREAMS_UNI、SETTINGS_WT_INITIAL_MAX_STREAMS_BIDI、SETTINGS_WT_INITIAL_MAX_DATA が用意されています。ストリームは先頭の種別値で見分け、単方向が 0x54、双方向が 0x41、その後ろに可変長整数のセッションIDが続く構造です。終了時は WT_CLOSE_SESSION カプセル(型 0x2843)が32ビットのアプリケーションエラーコードと最大1024バイトのメッセージを運びます。この構造を知っていると、前段プロキシで落ちる箇所の切り分けが一気に速くなります。
webtransport-go・aioquicなどdraft-16実装の選び方
選定基準は実装している草案の版です。ブラウザ側とサーバ側で版が違うと、ハンドシェイクが通らないか、データグラムだけ流れないといった形で不具合が出ます。
- Go:quic-go/webtransport-go v0.12.0(2026年7月28日公開)。READMEにdraft-16実装と明記され、フロー制御とセッションプーリングに対応。サポート対象はGoの最新2リリース
- Python:aioquic 1.3.0(2025年10月11日公開)。QUICとHTTP/3の実装にWebTransportのサンプルが同梱される
- Rust:wtransport など、QUIC実装の上に構築されたライブラリ群
まず確認するのはリポジトリのREADMEに書かれた対応draft番号で、次がリリース日です。半年以上更新の止まった実装は、草案の改訂に追従できていない可能性を疑ってください。
有効期間14日未満とECDSA P-256を課す自己署名証明書の条件
開発環境で公的な証明書を用意できない場合、serverCertificateHashes でWeb PKIを迂回できます。ただし制約が具体的です。ハッシュのアルゴリズムは sha-256、値はArrayBuffer等のバイト列で渡します。
証明書側の条件は三つ。有効期間が2週間未満であること、現在時刻が有効期間内にあること、公開鍵がECDSA secp256r1(NIST P-256)を最低限含みRSA鍵を含まないこと。加えて専用コネクションでのみ有効なため、allowPooling が true の状態で指定するとTypeErrorになります。有効期間が2週間未満という条件は、この機能が本番運用向けではなく開発とテスト向けだと明示しているのと同じです。本番はWeb PKIの証明書を使い、証明書ハッシュ方式は社内検証環境に限定してください。
インフラ要件:UDP 443の疎通・LB/CDN対応・縮退設計の勘所
WebTransportで最初に詰まるのはコードではなく経路です。ここを検証せずに実装へ入ると、手元では動くのに一部の利用者だけ繋がらないという形で終盤に露見します。
UDP 443の閉塞とファイアウォール設定確認という最初の関門
QUICはUDP上で動くため、TCPの443番が通ることは何の保証にもなりません。企業ネットワークやモバイルキャリアの一部ではUDPが遮断され、そこではWebTransportの接続が成立しません。
Chromeの公式ドキュメントはHTTP/3のみの対応と記載しており、HTTP/2への自動降格は期待できない。したがって設計上の意味は明確です。接続失敗は例外ではなく通常フローの一つとして扱い、失敗率を計測する仕組みを最初から入れる。社内システムなら、対象拠点のファイアウォールでUDP 443の外向き通信が許可されているかを実装着手前に確認します。
ロードバランサとCDNのHTTP/3対応可否とセッション維持
前段の構成も条件を課します。L7のロードバランサやCDNがHTTP/3を終端する場合、拡張CONNECTと :protocol 擬似ヘッダをそのまま背後へ通せるかが分かれ目です。通常のHTTPリクエストとして解釈する実装では、CONNECTが405や400で弾かれます。
回避策は、WebTransportのエンドポイントだけ別ホスト名に切り出し、L4(UDP)でアプリケーションサーバへ直接届ける構成です。この場合はQUICのコネクションIDに基づく分散が必要で、単純な送信元IPとポートのハッシュではNAT越しの経路変更でセッションが切れます。CDNを前段に置く構成では、対象パスをキャッシュ対象外にするだけでは足りず、そもそもWebTransportのパススルーに対応しているかをベンダー資料で確認してください。
WebSocketへ縮退するフォールバック経路と切替の判断基準
実装は二系統になります。機能検出は "WebTransport" in window で行い、未対応ブラウザと接続失敗の両方を既存方式へ寄せる。切替の判定は ready にタイムアウトを設け、数秒で解決しなければ縮退させる形が扱いやすい構成です。
縮退先の選択は用途で決まります。双方向のやり取りが要るならWebSocketの実装と運用判断、サーバからの一方向配信で足りるならSSEの仕組みと実装が候補です。二系統を保守し続けるコストは小さくないため、フォールバック実装まで含めた工数で採否を判断してください。
採用判断:WebTransportが効く条件と見送るべき三つの場面
ここからは判断を言い切ります。WebTransportは既存方式の上位互換ではなく、条件が合ったときだけ利益が出る選択肢です。
採用してよい条件:多数ストリームと欠落許容が同居する通信要件
採用してよいのは次の条件が重なるときです。ブラウザとサーバの間に独立した流れが3本以上あり(たとえば制御チャネル、大きなファイル転送、状態通知が並走する構成)、うち一部は欠落を許容できる。そしてサーバとネットワーク構成を自社で制御できる。
具体的には、ブラウザ上の共同編集ツールでカーソル位置と編集内容を分離して送る構成、産業機器の遠隔監視で高頻度のセンサ値と設定変更コマンドを同居させる構成が該当します。ここでWebSocketを使うと、大きな転送が制御メッセージを詰まらせるか、チャネルごとに接続を増やすかの二択になる。多重化がそのまま設計の簡潔さに変わる場面が、WebTransportの持ち場です。
見送る条件:既存WebSocketで足りる構成と運用要員の不足
見送るべき場面は三つあります。第一に、流れが1本で順序保証が要る用途。チャット、通知、進捗表示はWebSocketで完結し、乗り換えは接続失敗の経路を増やすだけです。
第二に、UDP 443の疎通やCDNのパススルーを自社で確認・変更できない構成。前段のインフラを他部門やベンダーが握っていて条件を変えられないなら、実装前に見送りを決めたほうが損失は小さくなります。第三に、草案の改訂へ追従する担当者を置けない体制。draft-16は標準化前で、ライブラリ側の破壊的変更が起こりえます。年単位で塩漬けにする前提の社内システムには向きません。なお、映像や音声そのものを扱うならWebTransportではなくWebRTCのSFU構成と実装判断が先に来ます。
段階移行の順序と、社内システム連携で発注前に決めておく設計範囲
移行するなら順序を守ります。既存のWebSocket経路を残したまま新経路を並走させ、接続成功率と遅延を実測し、数値が出てから切り替える。最初から全面移行を計画すると、UDPが通らない利用者の存在が発覚した時点で計画が止まります。
発注や外部委託を伴う場合、設計範囲を先に切っておくと見積もりが安定します。決めておくのは、対象ブラウザの下限バージョン、フォールバックの有無と縮退先、前段インフラの担当分界点、そして草案改訂時の追従責任の所在です。既存の業務システムと接続する部分まで含めて設計を固めたい場合は、API開発・システム連携の相談窓口で通信方式の選定から一緒に詰められます。
よくある質問
実装検討の場でよく挙がる質問に、仕様と公式ドキュメントの記述に沿って答えます。
WebTransportはWebSocketの置き換えになりますか?
用途によります。独立した複数のストリームを並走させたい場合や、欠落を許容してでも遅延を詰めたいデータがある場合は、WebTransportのほうが構成が簡潔になります。一方で1本の順序付きチャネルで足りる用途では、WebSocketのほうが対応環境が広く、前段インフラの制約も少ない。UDPが遮断される環境が残る以上、当面は置き換えではなく併用が現実的な構成です。
WebTransportはHTTP/2でも使えますか?
仕様としては draft-ietf-webtrans-http2(第14版)でHTTP/2への束縛が定義されていますが、Chromeの公式ドキュメントはHTTP/3のみの対応と記載しています。2026年8月時点でブラウザから使えるのはHTTP/3経由と考えてください。なお requireUnreliable を true にすると、HTTP/3が使えないときにHTTP/2で接続を張ることを禁止できます。
自己署名証明書でも接続できますか?
できます。コンストラクタのオプション serverCertificateHashes にSHA-256のハッシュを渡すと、Web PKIによる検証の代わりにハッシュ照合で認証します。ただし証明書の有効期間が2週間未満であること、公開鍵がECDSA secp256r1を含みRSA鍵を含まないこと、allowPooling がfalseであることが条件です。条件から分かるとおり開発・検証用の機能で、本番は通常の証明書を使います。
データグラムはどのくらいの大きさまで送れますか?
下位コネクションのMTUに制限されます。固定値ではなく経路によって変わるため、アプリケーション側で上限を仮定せず、送信前にサイズを確認する実装にします。加えて到達も順序も保証されないため、1メッセージで意味が完結する内容だけを載せてください。分割が必要なサイズのデータは、データグラムではなくストリームを使うのが正しい切り分けです。
仕様が草案のまま本番で使って問題ありませんか?
条件付きで可能です。draft-ietf-webtrans-http3 は第16版・In WG Last Callで、標準化前ながら実装は主要ブラウザに入っています。実務上のリスクは仕様変更そのものより、サーバライブラリの追従漏れによる版ずれです。使用ライブラリの対応draft番号を記録し、リリースを監視し、フォールバック経路を残す。この三点を運用に組み込めるなら本番投入は現実的で、組み込めないなら見送りが妥当な判断になります。
関連記事
- QUIC(通信プロトコル)とは?HTTP/3を支える仕組みとTCPとの違いを実装視点で解説:WebTransportの土台となるトランスポート層
- WebSocketとは?仕組み・ハンドシェイクからNode.js実装・運用の判断まで実装者向けに解説:縮退先となる既存方式の仕組み
- SSEとWebSocketの違いと使い分け|WebRTC・WebTransportまで性能比較:4方式の横並び比較と性能の目安
- SSE(Server-Sent Events)とは|仕組み・WebSocketとの違い・実装を解説:単方向配信で足りる場合の選択肢
- WebRTCとは?P2Pの仕組み・ICE/STUN/TURNからSFU選定・実装・運用判断まで実装者向けに解説:映像・音声を扱う場合の選択肢