1. はじめに (Introduction)
Hypertext Transfer Protocol (HTTP) [RFC7230] は、異なるバージョン間で互換性のあるリソースレベルのセマンティクスを提供しますが、接続管理レベルでの互換性は提供しません。WebSocket など、HTTP の接続管理の詳細に依存する他のプロトコルは、新しいバージョンの HTTP に合わせて更新する必要があります。
WebSocket プロトコル [RFC6455] は、HTTP/1.1 アップグレードメカニズム ([RFC7230] のセクション 6.7) を使用して、TCP 接続を HTTP から WebSocket 接続に移行します。HTTP/2 [RFC7540] では、異なるアプローチをとる必要があります。多重化という性質上、HTTP/2 では、Upgrade や Connection リクエストヘッダーフィールドや 101 (Switching Protocols) レスポンスコードなど、接続全体にわたるヘッダーフィールドやステータスコードは許可されていません。これらはすべて [RFC6455] の開始ハンドシェイクに必要です。
HTTP/2 から WebSocket をブートストラップできるようになると、1 つの TCP 接続を両方のプロトコルで共有でき、HTTP/2 のより効率的なネットワーク利用を WebSocket に拡張できます。
本文書は、HTTP/2 の [RFC7540] セクション 8.3 で指定されている HTTP CONNECT メソッドを拡張します。この拡張により、CONNECT で通常使用される外部ホストではなく、接続する新しいプロトコル名を置き換えることができます。その結果、WebSocket (またはその他のプロトコル) のデータを伝送できる単一の HTTP/2 ストリーム上のトンネルが作成されます。接続上の他のストリームは、より拡張された CONNECT トンネル、従来の HTTP/2 データ、またはその両方の混合を伝送できます。
このトンネルストリームは、接続上の他の通常のストリームと多重化され、HTTP/2 の通常の優先順位、キャンセル、およびフロー制御機能を享受します。
トンネルストリームと本文書で定義されている開始ハンドシェイクの変更を使用して WebSocket 接続を正常に確立したストリームは、その後、従来の WebSocket プロトコルを使用し、そのストリームを [RFC6455] で参照されている TCP 接続であるかのように扱います。