Open9

WebTransport over HTTP/3

voluntasvoluntas

WebTransport over HTTP/3

概要

WebTransport [OVERVIEW]は、Webセキュリティモデルの制約を受けるクライアントが、安全な多重化トランスポートを使用してリモートサーバーと通信することを可能にするプロトコルフレームワークです。この文書は、HTTP/3 [HTTP3]に基づき、同じHTTP/3接続内で多重化された一方向性ストリーム、双方向性ストリーム、データグラムのサポートを提供するWebTransportプロトコルについて記述している。

voluntasvoluntas

1. はじめに

HTTP/3 [HTTP3]はQUIC [RFC9000]の上で定義されたプロトコルで、QUIC接続上でHTTPリクエストを多重化することができます。この文書は、WebTransport プロトコルの要件とセマンティクス[OVERVIEW]に準拠した方法で、HTTP/3 で非 HTTP データを多重化するメカニズムを定義しています。ここで説明するメカニズムを使用すると、複数の WebTransport インスタンスは、同じ HTTP/3 接続上で通常の HTTP トラフィックと同時に多重化することができます。

1.1. 用語の説明

本文書のキーワード「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「NOT RECOMMENDED」、「MAY」、「OPTIONAL」は、BCP 14 [RFC2119] [RFC8174]に記載されているように、ここに示すようにすべて大文字で表示されている場合のみ、解釈されます。

本文書は,[OVERVIEW]の1.2節で定義された用語に従っている。このドキュメントでは、WebTransport サーバーと HTTP/3 サーバーを区別しています。HTTP/3 サーバーとは、HTTP/3 接続を終了するサーバーであり、WebTransport サーバーとは、HTTP/3 サーバーを介してアクセスできる WebTransport セッションを受け入れるアプリケーションのことです。

voluntasvoluntas

2. プロトコルの概要

一般に WebTransport サーバは、権威値とパス値のペアによって識別される(それぞれ [RFC3986] セクション 3.2 と 3.3 で定義されている)。

HTTP/3接続が確立されたとき、クライアントとサーバーは、HTTP/3上のWebTransportをサポートすることを示すために、SETTINGS_ENABLE_WEBTRANSPORT設定を送信する必要があります。

WebTransport セッションは、拡張 CONNECT リクエスト[RFC8441]を送信するクライアントによって、与えられた HTTP/3 接続の内部で開始されます。サーバーがリクエストを受け入れると、WebTransportセッションが確立されます。得られたストリームはさらにCONNECTストリームと呼ばれ、そのストリームIDは接続内の所定のWebTransportセッションを一意に識別するために使用される。WebTransport セッションを確立した CONNECT ストリームの ID は、さらにセッション ID と呼ばれる。

セッションが確立された後、ピアは以下のメカニズムでデータを交換することができます。

  • クライアントは、ストリームの所有権を WebTransport に移す特殊な無限長の HTTP/3 フレームを使用して、双方向のストリームを作成できます。
  • サーバーは双方向ストリームを作成することができますが、これはHTTP/3がサーバー主導の双方向ストリームのセマンティクスを定義していないため可能です。
  • クライアントとサーバーの両方が、特別なストリーム タイプを使用して単方向ストリームを作成できます。
  • データグラムは、QUIC DATAGRAMフレーム[QUIC-DATAGRAM]を使用して送信することができる。

WebTransportセッションは、セッションを作成したCONNECTストリームが閉じられると終了します。

voluntasvoluntas

3. セッションの確立

3.1. トランスポート対応の HTTP/3 接続の確立

WebTransport のサポートを示すために、クライアントとサーバーの両方は SETTINGS フレームで SETTINGS_ENABLE_WEBTRANSPORT 値を "1" に設定して送信しなければなりません (MUST)。エンドポイントは、このパラメータがネゴシエートされていない限り、WebTransport 関連の機能を使用してはなりません (MUST NOT)。

SETTINGS_ENABLE_WEBTRANSPORTがネゴシエートされた場合、[HTTP3-DATAGRAM]に記載されているように、HTTP/3内のQUICデータグラムのサポートがネゴシエートされなければなりません (MUST)。QUICデータグラムの拡張をネゴシエートせずにWebTransportのサポートをネゴシエートすると、H3_SETTINGS_ERRORエラーが発生します (SHALL)。

HTTP3]では、クライアントのinitial_max_bidi_streamsトランスポートパラメータを0に設定する必要があります。既存の実装では、設定をネゴシエートする前にこの要件を強制する可能性があります。したがって、クライアントは、サーバーから適切なSETTINGSフレームを受信した後、クライアントが開始した双方向ストリームに対してゼロ以外のMAX_STREAMSを送信しなければなりません(MUST)。

3.2. HTTP/3の拡張CONNECT

[RFC8441]では、SETTINGS_ENABLE_CONNECT_PROTOCOL パラメーターによって有効になる拡張 CONNECT メソッドをセクション 4 で定義しています。そのパラメータは HTTP/2 でのみ定義されています。このドキュメントでは、HTTP/3 の拡張 CONNECT のサポートを示す新しい多目的パラメータを作成しません。代わりに、SETTINGS_ENABLE_WEBTRANSPORT の設定は、エンドポイントが拡張 CONNECT をサポートすることを意味します。

3.3. 新しいセッションの作成

WebTransport セッションは HTTP/3 で確立されるので、https URI スキーム [RFC7230] を使って識別されます。

新しい WebTransport セッションを作成するには、クライアントは HTTP CONNECT リクエストを送信します。その際、:protocol 疑似ヘッダ・フィールド([RFC8441])には、webtransport を設定しなければなりません。:scheme フィールドは https でなければなりません。また、:authority と :path の両方が設定されていなければなりません(これらのフィールドは希望する WebTransport サーバを示します)。リクエストにはOriginヘッダー[RFC6454]を設定しなければなりません。

protocol フィールドに webtransport が設定された拡張 CONNECT リクエストを受信すると、HTTP/3 サーバーは指定された :authority と :path の値に関連付けられた WebTransport サーバーがあるかどうかを確認できます。存在しない場合は、ステータスコード404(セクション6.5.4, [RFC7231])で応答するべきです(SHOULD)。そうでない場合は、ステータスコード200で応答してセッションを受け入れてもよい(MAY)。WebTransport サーバは、Origin ヘッダを検証して、指定されたオリジンが当該サーバへのアクセスを許可されていることを確認しなければなりません(MUST)。

クライアントから見ると、200 のレスポンスを受信した時点で WebTransport セッションが確立されます。サーバー側から見ると、200レスポンスを送信した時点でセッションが確立されます。どちらのエンドポイントも、セッションが確立する前に、そのセッション上でストリームを開いたり、データグラムを送信したりしてはいけません(MUST NOT)。HTTP/3上のWebTransportは0-RTTをサポートしていません。

3.4. 同時セッション数の制限

WebTransport のセッションは、HTTP CONNECT リクエストで確立されるため、フロー制御の観点からは、通常の HTTP リクエストと同様に、ストリームのフロー制御にカウントされます。このドキュメントでは、セッション用に別のフロー制御メカニズムを導入したり、HTTP リクエストを WebTransport データ ストリームから分離したりすることはしていません。サーバーが受信するリクエストの割合を制限する必要がある場合は、別のメカニズムを使用できます。

  • HTTP3] で定義されている HTTP_REQUEST_REJECTED エラーコードは、受信側の HTTP/3 スタックに、リクエストが何らかの形で処理されなかったことを示します。
  • HTTP ステータスコード 429 は、レート制限 [RFC6585] によりリクエストが拒否されたことを示します。前述の方法とは異なり、この信号はアプリケーションに直接伝わります。
voluntasvoluntas

4. WebTransportの機能

HTTP/3 上の WebTransport は、[概要] に記載されている以下の機能を提供します: どちらかのエンドポイントから開始される一方向ストリーム、双方向ストリーム、およびデータグラム。

セッションIDは、異なるWebTransportセッションに属するストリームとデータグラムを分断するために使用されます。ワイヤ上では、セッションIDは[QUIC-TRANSPORT]で説明されているQUIC可変長整数スキームを使用してエンコードされます。

4.1. 一方向ストリーム

一度確立すると、両方のエンドポイントは一方向性ストリームを開くことができます。HTTP/3の一方向性ストリームタイプは0x54でなければなりません。ストリームの本文は、ストリームタイプ、可変長整数でエンコードされたセッションID、ユーザー指定のストリームデータの順になります(図1)。

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                           0x54 (i)                          ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Session ID (i)                       ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                         Stream Body                         ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

図1:一方向性のWebTransportストリーム・フォーマット

4.2. クライアントが開始する双方向ストリーム

WebTransport クライアントは、HTTP/3 双方向ストリームを開き、WEBTRANSPORT_STREAM (type=0x41) タイプの HTTP/3 フレームを送信することで、双方向ストリームを開始できます。フレームのフォーマットは、フレームタイプ、可変長整数でエンコードされたセッションID、ユーザーが指定したストリームデータの順になります (図2)。フレームは、ストリームの終了まで継続する。

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                           0x41 (i)                          ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Session ID (i)                       ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                         Stream Body                         ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

図2:WEBTRANSPORT_STREAM フレームフォーマット

4.3. サーバーが開始する双方向ストリーム

WebTransport サーバーは、HTTP/3 接続内で双方向ストリームを開くことで、双方向ストリームを開始することができます。HTTP/3 はサーバー主導の双方向ストリームのセマンティクスを定義していないので、このドキュメントは SETTINGS_ENABLE_WEBTRANSPORT オプションがネゴシエートされたすべての HTTP/3 コネクションのそのようなストリームのセマンティクスのための規範的なリファレンスであることに注意してください。これらのストリームのフォーマットは、可変長整数でエンコードされたセッションIDの後に、ユーザーが指定したストリームデータが続くものとします(図3)。

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Session ID (i)                       ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                         Stream Body                         ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

図3:サーバー起動型の双方向ストリームフォーマット

4.4. データグラム

データグラムは、[QUIC-DATAGRAM]および[HTTP3-DATAGRAM]で定義されたDATAGRAMフレームを使用して送信することができます。SETTINGS_ENABLE_WEBTRANSPORTオプションがネゴシエートされたすべてのHTTP/3接続では、フロー識別子はセッションIDに設定されます。つまり、データグラムの形式は、セッションIDの後に、ユーザが指定したペイロードが続くものとします(図4)。

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Session ID (i)                       ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Datagram Body                        ...
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
voluntasvoluntas

5. セッションの終了

HTTP/3 上の WebTransport セッションは、いずれかのエンドポイントが、セッションを開始した CONNECT リクエストに関連するストリームを閉じたときに終了します。セッションが終了したことを知ると、エンドポイントは新しいデータグラムの送信を停止し、セッションに関連するすべてのストリームをリセットしなければなりません(MUST)。

voluntasvoluntas

6.セキュリティに関する考察

HTTP/3 上の WebTransport は、[OVERVIEW] で WebTransport プロトコルに課せられたすべてのセキュリティ要件を満たしているため、クライアントが信頼できない場合でも、クライアントとサーバー間の通信を安全に行うことができます。

HTTP/3上のWebTransportは、QUICトランスポート・パラメータの使用による明示的なオプトインを必要とします。これは、HTTP/3サーバが明示的にサポートしていることを保証することで、潜在的なプロトコル・コンフュージョン攻撃を回避します。また、Originヘッダを使用することで、信頼できるオリジンから来ていないWebベースのクライアントからのアクセスを拒否することができます。

HTTP/3を経由するHTTPトラフィックと同様に、WebTransportは1つの接続内で異なるオリジンへのトラフィックをプールします。オリジンが異なるということは、信頼ドメインが異なることを意味します。つまり、実装では、各トランスポートを同じ接続上の他のトランスポートに対して敵対する可能性があるものとして扱わなければなりません。すべてのトランスポートが輻輳制御とフロー制御のコンテクストを共有しているので、単一のクライアントが積極的にリソースを使い切ると、他のトランスポートがストールする原因になる。したがって、ユーザーエージェントは、接続内の各トランスポートが制御されたリソースの合理的なシェアを得ることを保証する公正なスキームを実装すべきです。これは、データを送信するときと新しいストリームを開くときの両方に適用されます。

voluntasvoluntas

7. IANAに関する検討事項

7.1. アップグレードトークンの登録

RFC7230]で設立されたレジストリ「Hypertext Transfer Protocol (HTTP) Upgrade Token Registry」に、以下のエントリが追加されます。

webtransport」ラベルは、WebTransport のプロトコルとして使用される HTTP/3 を識別します。

値を示しています。
ウェブトランスポート
説明
HTTP/3上のWebTransport
リファレンス
このドキュメントと[I-D.kinnear-webtransport-http2]を参照してください。

7.2. HTTP/3 SETTINGSパラメータ登録

HTTP3]で確立された "HTTP/3 Settings "レジストリに、以下のエントリが追加されます。

SETTINGS_ENABLE_WEBTRANSPORTパラメータは、指定されたHTTP/3接続がWebTransport対応であることを示します。

設定の名前
SETTINGS_ENABLE_WEBTRANSPORT
値: 0x2b603742
0x2b603742
デフォルトです。
0
仕様です。
このドキュメント

7.3. フレームタイプの登録

以下のエントリは [HTTP3] によって確立された "HTTP/3 Frame Type" レジストリに追加されます。

WEBTRANSPORT_STREAM フレームは、HTTP/3 のクライアントが開始した双方向ストリームを WebTransport で使用することを許可します。

コードは
0x54
フレームタイプ。
WEBTRANSPORT_STREAM
仕様です。
このドキュメント

7.4. ストリームタイプの登録

HTTP3]によって確立された「HTTP/3 Stream Type」レジストリに、以下のエントリが追加されます。

WebTransport stream "タイプは、WebTransportによる一方向性ストリームの使用を可能にします。

コードは
0x41
ストリームタイプ。
WebTransport ストリーム
仕様です。
このドキュメント
Sender:
両方