WebTransport over HTTP/3: draft 02 / 07 / 15 の差分

April 7, 2026 · View on GitHub

このドキュメントは draft-ietf-webtrans-http3 の draft 02, 07, 15 の主要な差分をまとめたものである。

参照ドキュメント

  • refs/webtrans/draft-ietf-webtrans-http3-02.txt (2021-10-25)
  • refs/webtrans/draft-ietf-webtrans-http3-07.txt (2023-06-13)
  • refs/webtrans/draft-ietf-webtrans-http3-15.txt (2026-03-02)

総括

項目draft-02draft-07draft-15
:protocolwebtransportwebtransportwebtransport-h3
SETTINGS パラメータ名SETTINGS_ENABLE_WEBTRANSPORTSETTINGS_WEBTRANSPORT_MAX_SESSIONSSETTINGS_WT_ENABLED
SETTINGS コードポイント0x2b6037420xc671706a0x2c7cf000
アプリエラーコード幅8 bit32 bit32 bit
セッション終了カプセル名CLOSE_WEBTRANSPORT_SESSIONCLOSE_WEBTRANSPORT_SESSIONWT_CLOSE_SESSION
ドレインカプセルなしDRAIN_WEBTRANSPORT_SESSIONWT_DRAIN_SESSION
セッションレベルフロー制御なしなしあり (カプセルベース)
SETTINGS_ENABLE_CONNECT_PROTOCOL暗黙 (不要)サーバーのみ必須サーバーのみ必須
SETTINGS_H3_DATAGRAM不要明示的に必須明示的に必須
QUIC max_datagram_frame_size不要明示的に必須明示的に必須
reset_stream_at不要不要必須
ALPN ネゴシエーションなしなしあり (WT-Available-Protocols / WT-Protocol)
TLS エクスポーターなしなしあり (EXPORTER-WebTransport)
優先度制御なしなしRFC 9218 推奨

1. セッション確立

1.1 SETTINGS ネゴシエーション

draft-02:

  • 双方が SETTINGS_ENABLE_WEBTRANSPORT (0x2b603742) を値 1 で送信する
  • 値が 0 でも 1 でもない場合は H3_SETTINGS_ERROR
  • この設定が Extended CONNECT のサポートを暗黙に示す (別途 SETTINGS_ENABLE_CONNECT_PROTOCOL は不要)

draft-07:

  • SETTINGS_WEBTRANSPORT_MAX_SESSIONS (0xc671706a) に変更。値 > 0 でサポートを表明
  • サーバーは同時セッション上限を示す。クライアントは > 0 であればよい
  • SETTINGS_ENABLE_CONNECT_PROTOCOL = 1 がサーバーに明示的に必須
  • SETTINGS_H3_DATAGRAM = 1 が双方に明示的に必須
  • QUIC max_datagram_frame_size > 0 が双方に明示的に必須

draft-15:

  • SETTINGS_WT_ENABLED (0x2c7cf000) に変更。値 > 0 でサポートを表明
  • draft-07 の前提条件に加え、reset_stream_at トランスポートパラメータが双方に必須
  • SETTINGS_ENABLE_CONNECT_PROTOCOL はサーバーのみ送信義務がある (RFC 9220, RFC 8441 Section 3)。クライアントの送信リストには含まれない (Section 3.1)
  • セッションレベルフロー制御用の SETTINGS を追加:
    • SETTINGS_WT_INITIAL_MAX_STREAMS_UNI (0x2b64)
    • SETTINGS_WT_INITIAL_MAX_STREAMS_BIDI (0x2b65)
    • SETTINGS_WT_INITIAL_MAX_DATA (0x2b61)

1.2 Extended CONNECT

draft-02:

  • :protocol = webtransport
  • バージョンネゴシエーション用ヘッダー: Sec-Webtransport-Http3-Draft02: 1
  • サーバー応答: Sec-Webtransport-Http3-Draft: draft02

draft-07:

  • :protocol = webtransport (変更なし)
  • バージョンネゴシエーションは SETTINGS_WEBTRANSPORT_MAX_SESSIONS のコードポイント変更で実施
  • ヘッダーベースのバージョンネゴシエーションは廃止

draft-15:

  • :protocol = webtransport-h3 に変更 (Capsule ベース方式の webtransport と明確に分離)
  • アプリケーションプロトコルネゴシエーション追加:
    • WT-Available-Protocols ヘッダー (クライアント → サーバー, Structured Fields List)
    • WT-Protocol ヘッダー (サーバー → クライアント, Structured Fields Item)
    • 失敗時は WT_ALPN_ERROR でセッションを閉じる

1.3 0-RTT

全 draft 共通:

  • CONNECT は safe メソッドではないため、0-RTT パケットで WebTransport を開始できない

draft-07 以降:

  • SETTINGS パラメータは前回セッションから保持可能
  • サーバーが 0-RTT を受け入れる場合、最大セッション数を前回より減らしてはならない

draft-15:

  • フロー制御値も 0-RTT 受け入れ時に減らしてはならない

2. ストリーム

2.1 単方向ストリーム

全 draft 共通:

  • HTTP/3 ストリームタイプ 0x54
  • フォーマット: Stream Type (0x54) | Session ID | Stream Body

2.2 双方向ストリーム

全 draft 共通:

  • シグナル値 (フレームタイプ) 0x41 (WEBTRANSPORT_STREAM / WT_STREAM)
  • フォーマット: Signal Value (0x41) | Session ID | Stream Body
  • 長さフィールドを持たない (正式な HTTP/3 フレームではない)

draft-02:

  • WEBTRANSPORT_STREAM はフレームとして定義
  • リクエストストリーム上で使用

draft-07 以降:

  • ストリームの最初のバイトでのみ送信可能。それ以外の場所で受信した場合は H3_FRAME_ERROR

2.3 ストリームリセットとエラーコードマッピング

draft-02:

  • アプリケーションエラーコードは 8 bit (0x00 - 0xFF)
  • HTTP/3 エラーコード範囲: 0x52e4a40fa8db - 0x52e4a40fa9e2

draft-07 以降:

  • アプリケーションエラーコードは 32 bit (0x00000000 - 0xFFFFFFFF) に拡張
  • HTTP/3 エラーコード範囲: 0x52e4a40fa8db - 0x52e5ac983162
  • マッピング時 0x1f * N + 0x21 形式の GREASE コードポイントをスキップ

draft-15 のみ:

  • RESET_STREAM_AT フレームの使用が必須
  • ストリームヘッダー (Session ID 等) の確実な配信のため、Reliable Size をストリームヘッダーサイズ以上に設定する
  • 範囲外のエラーコードを受信した場合、ストリームはリセットされるがアプリケーションエラーコードなしとして扱う

3. データグラム

draft-02:

  • HTTP Datagrams (draft-ietf-masque-h3-datagram) を使用
  • Datagram Format Type: WEB_TRANSPORT (0xff7c00)
  • データグラム登録カプセルで Datagram Format Type を設定する方式

draft-07 以降:

  • HTTP Datagrams (RFC 9297) を使用
  • Quarter Stream ID フィールドでセッションを識別する方式に変更 (Datagram Format Type は廃止)
  • WebTransport ペイロードは HTTP Datagram Payload フィールドにそのまま格納

4. カプセルプロトコル

4.1 セッション終了カプセル

全 draft 共通 (名称は異なる):

  • コードポイント: 0x2843
  • フォーマット: Application Error Code (32 bit) | Application Error Message (UTF-8, 最大 1024 バイト)
  • 送信後に FIN を送信しなければならない (MUST)
  • カプセル後の追加データは H3_MESSAGE_ERROR でリセット
draftカプセル名
draft-02CLOSE_WEBTRANSPORT_SESSION
draft-07CLOSE_WEBTRANSPORT_SESSION
draft-15WT_CLOSE_SESSION

4.2 ドレインカプセル

draft-02: なし

draft-07 以降:

  • コードポイント: 0x78ae
  • 長さ 0
  • HTTP/3 GOAWAY の単一セッション版
  • 受信後もセッション使用は継続可能だが、可能な限り早くグレースフルに終了すべき (SHOULD)
draftカプセル名
draft-07DRAIN_WEBTRANSPORT_SESSION
draft-15WT_DRAIN_SESSION

4.3 フロー制御カプセル (draft-15 のみ)

draft-15 で追加されたセッションレベルフロー制御のためのカプセル:

カプセルコードポイント用途
WT_MAX_DATA0x190B4D3Dセッション全体のデータ量上限
WT_MAX_STREAMS (bidi)0x190B4D3F双方向ストリーム累積上限
WT_MAX_STREAMS (uni)0x190B4D40単方向ストリーム累積上限
WT_DATA_BLOCKED0x190B4D41データ送信がフロー制御でブロック
WT_STREAMS_BLOCKED (bidi)0x190B4D43双方向ストリームのブロック通知
WT_STREAMS_BLOCKED (uni)0x190B4D44単方向ストリームのブロック通知
  • 前回の値より小さい値の WT_MAX_STREAMS / WT_MAX_DATA を受信した場合は WT_FLOW_CONTROL_ERROR
  • WT_MAX_STREAMS の Maximum Streams が 2602^{60} を超えた場合は H3_DATAGRAM_ERROR
  • 全フロー制御カプセルは hop-by-hop (中継者が消費して自身の信号を生成)

4.4 禁止カプセル (draft-15 のみ)

HTTP/3 版では QUIC ネイティブのストリームレベルフロー制御を使うため、以下のカプセルは禁止:

カプセルコードポイント
WT_MAX_STREAM_DATA0x190B4D3E
WT_STREAM_DATA_BLOCKED0x190B4D42

受信した場合はセッションエラーとして処理する。


5. セッション終了

5.1 終了条件

全 draft 共通:

  1. CONNECT ストリームがクリーンまたは異常に閉じられた場合
  2. セッション終了カプセルが送信または受信された場合

5.2 終了時の処理

draft-02:

  • 関連する全ストリームをリセットする (MUST)
  • エラーコードの指定なし

draft-07 以降:

  • 関連する全ストリームの送信側をリセットし、受信側の読み取りを中断する (MUST)
  • エラーコードとして WEBTRANSPORT_SESSION_GONE (0x170d7b68) / WT_SESSION_GONE を使用

5.3 QUIC CONNECTION_CLOSE との連携

draft-07 以降:

  • セッション終了カプセル送信後に即座に QUIC CONNECTION_CLOSE を送るとピアがカプセルを受信する前に接続が閉じる可能性がある
  • CONNECT ストリームのデータが ACK されるまで待ってから CONNECTION_CLOSE を送るべき (SHOULD)

6. エラーコード

6.1 プロトコルエラーコード

エラーコードコードポイントdraft-02draft-07draft-15
H3_WEBTRANSPORT_BUFFERED_STREAM_REJECTED / WT_BUFFERED_STREAM_REJECTED0x3994bd84ありありあり
WEBTRANSPORT_SESSION_GONE / WT_SESSION_GONE0x170d7b68なしありあり
WT_FLOW_CONTROL_ERROR0x045d4487なしなしあり
WT_ALPN_ERROR0x0817b3ddなしなしあり
WT_REQUIREMENTS_NOT_MET0x212c0d48なしなしあり

6.2 HTTP/3 既存エラーコードの使用

エラーコード用途適用 draft
H3_ID_ERROR不正なセッション ID全 draft
H3_FRAME_ERRORWEBTRANSPORT_STREAM / WT_STREAM の不正な位置での受信draft-07 以降
H3_MESSAGE_ERRORセッション終了カプセル後の追加データ受信全 draft
H3_SETTINGS_ERRORSETTINGS 値の不正 / 0-RTT でのフロー制御値減少全 draft
H3_REQUEST_REJECTED / HTTP_REQUEST_REJECTEDセッション数超過時のリクエスト拒否全 draft
H3_DATAGRAM_ERRORWT_MAX_STREAMS の値超過draft-15
H3_EXCESSIVE_LOAD不審な使用パターンdraft-15

7. フロー制御 (draft-15 のみ)

draft-15 ではセッションレベルのフロー制御が追加された。これは QUIC のコネクションレベルフロー制御と類似の仕組みをセッション単位で提供する。

7.1 有効化条件

  • 両エンドポイントが SETTINGS_WT_INITIAL_MAX_STREAMS_UNI, SETTINGS_WT_INITIAL_MAX_STREAMS_BIDI, SETTINGS_WT_INITIAL_MAX_DATA のうち少なくとも1つを非ゼロ値で送信した場合に有効
  • フロー制御が無効の場合、同時セッションは 1 つに制限される

7.2 制御の種類

制御対象初期値の SETTINGS動的更新カプセルブロック通知カプセル
単方向ストリーム数SETTINGS_WT_INITIAL_MAX_STREAMS_UNIWT_MAX_STREAMS (uni)WT_STREAMS_BLOCKED (uni)
双方向ストリーム数SETTINGS_WT_INITIAL_MAX_STREAMS_BIDIWT_MAX_STREAMS (bidi)WT_STREAMS_BLOCKED (bidi)
データ量SETTINGS_WT_INITIAL_MAX_DATAWT_MAX_DATAWT_DATA_BLOCKED

7.3 ストリームレベルフロー制御

  • HTTP/3 版では QUIC ネイティブのストリームレベルフロー制御を使用する
  • WT_MAX_STREAM_DATA / WT_STREAM_DATA_BLOCKED カプセルは HTTP/3 版では禁止

8. draft-15 のみの新機能

8.1 RESET_STREAM_AT の必須化

reset_stream_at トランスポートパラメータが前提条件に追加された。ストリームリセット時にストリームヘッダー (Session ID) の確実な配信を保証するため、Reliable Size をヘッダーサイズ以上に設定する必要がある。

参照: draft-ietf-quic-reliable-stream-reset-07

8.2 TLS キーイングマテリアルエクスポーター

セッションごとの TLS エクスポーターの導出メカニズム:

  • ラベル: EXPORTER-WebTransport
  • コンテキスト: WebTransport Exporter Context 構造体 (Session ID 64 bit + アプリケーション提供のラベルとコンテキスト)

8.3 優先度制御

RFC 9218 の Extensible Priorities を WebTransport セッション全体 (ストリーム、データグラム、カプセル含む) に適用することが推奨される。セッション内の優先度シグナリングはアプリケーションプロトコルに委ねられる。

8.4 WT_REQUIREMENTS_NOT_MET エラーコード

WebTransport の前提条件 (SETTINGS / トランスポートパラメータ) が満たされない場合に接続を閉じるための専用エラーコード (0x212c0d48)。


9. IANA 登録コードポイントの変遷

HTTP/3 SETTINGS

SETTINGSコードポイントdraft
SETTINGS_ENABLE_WEBTRANSPORT0x2b603742draft-02
SETTINGS_WEBTRANSPORT_MAX_SESSIONS0xc671706adraft-07
SETTINGS_WT_ENABLED0x2c7cf000draft-15
SETTINGS_WT_INITIAL_MAX_STREAMS_UNI0x2b64draft-15
SETTINGS_WT_INITIAL_MAX_STREAMS_BIDI0x2b65draft-15
SETTINGS_WT_INITIAL_MAX_DATA0x2b61draft-15

HTTP/3 フレームタイプ

フレームコードポイントdraft
WEBTRANSPORT_STREAM / WT_STREAM0x41全 draft

HTTP/3 ストリームタイプ

ストリームコードポイントdraft
WebTransport 単方向ストリーム0x54全 draft

カプセルタイプ

カプセルコードポイントdraft
CLOSE_WEBTRANSPORT_SESSION / WT_CLOSE_SESSION0x2843全 draft
DRAIN_WEBTRANSPORT_SESSION / WT_DRAIN_SESSION0x78aedraft-07 以降
WT_MAX_DATA0x190B4D3Ddraft-15
WT_MAX_STREAM_DATA (禁止)0x190B4D3Edraft-15
WT_MAX_STREAMS (bidi)0x190B4D3Fdraft-15
WT_MAX_STREAMS (uni)0x190B4D40draft-15
WT_DATA_BLOCKED0x190B4D41draft-15
WT_STREAM_DATA_BLOCKED (禁止)0x190B4D42draft-15
WT_STREAMS_BLOCKED (bidi)0x190B4D43draft-15
WT_STREAMS_BLOCKED (uni)0x190B4D44draft-15

HTTP/3 エラーコード

エラーコードコードポイントdraft
WT_BUFFERED_STREAM_REJECTED0x3994bd84全 draft
WT_SESSION_GONE0x170d7b68draft-07 以降
WT_FLOW_CONTROL_ERROR0x045d4487draft-15
WT_ALPN_ERROR0x0817b3dddraft-15
WT_REQUIREMENTS_NOT_MET0x212c0d48draft-15
WT_APPLICATION_ERROR 範囲0x52e4a40fa8db - 0x52e5ac983162draft-07 以降 (draft-02 は 8 bit 範囲)

10. SETTINGS_ENABLE_CONNECT_PROTOCOL の送信義務

SETTINGS_ENABLE_CONNECT_PROTOCOL (0x08) は RFC 8441 Section 3 で定義されたサーバーからクライアントへの設定であり、クライアントに送信義務はない。

Upon receipt of SETTINGS_ENABLE_CONNECT_PROTOCOL with a value of 1, a client MAY use the Extended CONNECT as defined in this document when creating new streams. Receipt of this parameter by a server does not have any impact. --- RFC 8441 Section 3

RFC 9220 も同様に「a new HTTP/2 setting sent by a server to allow the client to use Extended CONNECT」と定義している。

draft-ietf-webtrans-http3-15 Section 3.1 では、サーバーとクライアントの送信リストを明確に分離している:

サーバーが送信するもの:

  • SETTINGS_WT_ENABLED (値 > 0)
  • SETTINGS_ENABLE_CONNECT_PROTOCOL (値 1)
  • SETTINGS_H3_DATAGRAM (値 1)
  • max_datagram_frame_size transport parameter (値 > 0)
  • reset_stream_at transport parameter (空)

クライアントが送信するもの:

  • SETTINGS_H3_DATAGRAM (値 1)
  • max_datagram_frame_size transport parameter (値 > 0)
  • reset_stream_at transport parameter (空)
  • ドラフト版のみ: SETTINGS_WT_ENABLED (ドラフト固有コードポイント)

クライアントの送信リストに SETTINGS_ENABLE_CONNECT_PROTOCOL は含まれない。サーバーはクライアントが SETTINGS_ENABLE_CONNECT_PROTOCOL を送信しなくても WebTransport CONNECT リクエストを受理しなければならない。

nghttp3 (ngtcp2) は RFC に準拠し、クライアント側では enable_connect_protocol = 0 に強制設定して SETTINGS フレームに含めない (nghttp3_conn.c line 420)。