付録A. HTTP/2からの移行に関する考慮事項 (Considerations for Transitioning from HTTP/2)
HTTP/3はHTTP/2の設計に基づいており、コアセマンティクスを共有しています。この付録は、HTTP/2からHTTP/3への主な違いを要約し、実装者が2つのプロトコル間の関係を理解するのに役立ちます。
A.1. ストリーム (Streams)
HTTP/3はQUICストリームを使用しますが、HTTP/2はTCP上のストリーム抽象化を使用します。主な違い:
- ストリーム識別子:HTTP/3のストリームIDはQUICによって割り当てられ、HTTP/3によっては割り当てられません
- ストリーム優先順位:HTTP/3はHTTP/2のストリーム優先順位スキームを含みません
- フロー制御:HTTP/3はQUICのフロー制御メカニズムを使用します
A.2. HTTPフレームタイプ (HTTP Frame Types)
多くのHTTP/2フレームタイプはHTTP/3で保持または変更されています:
保持されたフレームタイプ:
- DATA(0x00)- 機能は類似
- HEADERS(0x01)- 機能は類似
- SETTINGS(0x04)- 機能は類似だがコントロールストリームのみ
- PUSH_PROMISE(0x05)- 機能は類似
- GOAWAY(0x07)- 機能は類似
削除または置換されたHTTP/2フレームタイプ:
- PRIORITY(0x02)- HTTP/3で削除
- RST_STREAM(0x03)- QUICのRESET_STREAMで置換
- PING(0x06)- QUICのPINGフレームで置換
- WINDOW_UPDATE(0x08)- QUICのフロー制御で置換
- CONTINUATION(0x09)- HTTP/3では不要
HTTP/3で新しいフレームタイプ:
- CANCEL_PUSH(0x03)- サーバープッシュをキャンセル
- MAX_PUSH_ID(0x0d)- プッシュIDスペースを制御
A.3. HTTP/2設定パラメータ (HTTP/2 SETTINGS Parameters)
HTTP/3の設定はHTTP/2とは異なります:
削除された設定:
- SETTINGS_HEADER_TABLE_SIZE - QPACK設定で置換
- SETTINGS_ENABLE_PUSH - MAX_PUSH_IDで制御
- SETTINGS_MAX_CONCURRENT_STREAMS - QUICトランスポートパラメータで制御
- SETTINGS_INITIAL_WINDOW_SIZE - QUICフロー制御で置換
- SETTINGS_MAX_FRAME_SIZE - HTTP/3では不要
- SETTINGS_MAX_HEADER_LIST_SIZE - SETTINGS_MAX_FIELD_SECTION_SIZEで置換
保持された設定:
- SETTINGS_MAX_FIELD_SECTION_SIZE(0x06)- HTTP/2のSETTINGS_MAX_HEADER_LIST_SIZEに類似
A.4. HTTP/2エラーコード (HTTP/2 Error Codes)
HTTP/3は、HTTP/2のエラーコードとは異なる独自のエラーコードセットを定義しています。実装者はマッピング関係に注意する必要がありますが、直接的な1対1の対応があると仮定すべきではありません。
A.5. その他の違い (Other Differences)
接続管理:
- HTTP/3は、接続マイグレーションやマルチパスサポートを含むQUICの接続管理を使用します
- HTTP/2の接続プリアンブルは不要です
サーバープッシュ:
- HTTP/3のサーバープッシュメカニズムはHTTP/2と類似していますが、異なるフレームとストリームタイプを使用します
- プッシュIDはHTTP/3で明示的です
フィールド圧縮:
- HTTP/3はHPACKではなくQPACKを使用します
- QPACKは順序なし配信を処理するように設計されています
拡張性:
- HTTP/3はより柔軟な拡張メカニズムを提供します
- 新しいフレームタイプ、設定、ストリームタイプは交渉なしで使用できます