2. 圧縮プロセスの概要 (Compression Process Overview)
本仕様は、エンコーダーの特定のアルゴリズムを記述していません。代わりに、デコーダーがどのように動作することが期待されるかを正確に定義し、エンコーダーがこの定義が許可する任意のエンコーディングを生成できるようにします。
2.1. ヘッダーリストの順序 (Header List Ordering)
HPACKは、ヘッダーリスト内のヘッダーフィールドの順序を保持します。エンコーダーは、元のヘッダーリストでの順序に従って、ヘッダーブロック内のヘッダーフィールド表現を順序付けしなければなりません (MUST)。デコーダーは、ヘッダーブロック内の順序に従って、デコードされたヘッダーリスト内のヘッダーフィールドを順序付けしなければなりません (MUST)。
2.2. エンコーディングとデコーディングのコンテキスト (Encoding and Decoding Contexts)
ヘッダーブロックを解凍するために、デコーダーはデコーディングコンテキストとして動的テーブル (第2.3.2節参照) を維持するだけで済みます。他の動的状態は必要ありません。
HTTPなどの双方向通信に使用される場合、エンドポイントによって維持されるエンコーディングおよびデコーディング動的テーブルは完全に独立しています。つまり、リクエストとレスポンスの動的テーブルは分離されています。
2.3. インデックステーブル (Indexing Tables)
HPACKは、ヘッダーフィールドをインデックスに関連付けるために2つのテーブルを使用します。静的テーブル (第2.3.1節参照) は事前定義されており、一般的なヘッダーフィールド (ほとんどが空の値) を含んでいます。動的テーブル (第2.3.2節参照) は動的であり、エンコーダーがエンコードされたヘッダーリストで繰り返されるヘッダーフィールドをインデックス化するために使用できます。
これらの2つのテーブルは、インデックス値を定義するための単一のアドレス空間に結合されます (第2.3.3節参照)。
2.3.1. 静的テーブル (Static Table)
静的テーブルは、事前定義された静的なヘッダーフィールドのリストで構成されます。そのエントリは付録Aで定義されています。
2.3.2. 動的テーブル (Dynamic Table)
動的テーブルは、先入れ先出し順序で維持されるヘッダーフィールドのリストで構成されます。動的テーブルの最初の最新エントリは最も低いインデックスにあり、動的テーブルの最も古いエントリは最も高いインデックスにあります。
動的テーブルは最初は空です。エントリは、各ヘッダーブロックが解凍されるときに追加されます。
動的テーブルには重複エントリ (つまり、同じ名前と同じ値を持つエントリ) を含めることができます。したがって、重複エントリはデコーダーによってエラーとして扱ってはなりません (MUST NOT)。
エンコーダーは動的テーブルの更新方法を決定するため、動的テーブルによって使用されるメモリ量を制御できます。デコーダーのメモリ要件を制限するために、動的テーブルのサイズは厳密に制限されています (第4.2節参照)。
デコーダーは、ヘッダーフィールド表現のリストの処理中に動的テーブルを更新します (第3.2節参照)。
2.3.3. インデックスアドレス空間 (Index Address Space)
静的テーブルと動的テーブルは、単一のインデックスアドレス空間に結合されます。
1から静的テーブルの長さまで (両端を含む) のインデックスは、静的テーブル内の要素を参照します (第2.3.1節参照)。
静的テーブルの長さより厳密に大きいインデックスは、動的テーブル内の要素を参照します (第2.3.2節参照)。静的テーブルの長さを減算して、動的テーブルへのインデックスを見つけます。
両方のテーブルの長さの合計より厳密に大きいインデックスは、デコーディングエラーとして扱わなければなりません (MUST)。
静的テーブルサイズがsで動的テーブルサイズがkの場合、次の図は有効なインデックスアドレス空間全体を示しています。
<---------- Index Address Space ---------->
<-- Static Table --> <-- Dynamic Table -->
+---+-----------+---+ +---+-----------+---+
| 1 | ... | s | |s+1| ... |s+k|
+---+-----------+---+ +---+-----------+---+
^ |
| V
Insertion Point Dropping Point
図1: インデックスアドレス空間
2.4. ヘッダーフィールド表現 (Header Field Representation)
エンコードされたヘッダーフィールドは、インデックスまたはリテラルとして表現できます。
インデックス付き表現 (Indexed Representation) は、静的テーブルまたは動的テーブルのいずれかのエントリへの参照としてヘッダーフィールドを定義します (第6.1節参照)。
リテラル表現 (Literal Representation) は、その名前と値を指定することによってヘッダーフィールドを定義します。ヘッダーフィールド名は、リテラルとして表現されるか、静的テーブルまたは動的テーブルのいずれかのエントリへの参照として表現されます。ヘッダーフィールド値はリテラルとして表現されます。
3つの異なるリテラル表現が定義されています:
-
動的テーブルの先頭に新しいエントリとしてヘッダーフィールドを追加するリテラル表現 (第6.2.1節参照)。
-
動的テーブルにヘッダーフィールドを追加しないリテラル表現 (第6.2.2節参照)。
-
動的テーブルにヘッダーフィールドを追加せず、特に中間者によって再エンコードされるときに、このヘッダーフィールドが常にリテラル表現を使用するという追加の規定があるリテラル表現 (第6.2.3節参照)。この表現は、圧縮することによってリスクにさらされないヘッダーフィールド値を保護することを目的としています (詳細については第7.1節を参照)。
これらのリテラル表現のいずれかの選択は、機密性の高いヘッダーフィールド値を保護するために、セキュリティ上の考慮事項によって導かれることがあります (第7.1節参照)。