1. はじめに (Introduction)
HTTP/1.1 ([RFC7230]参照) では、ヘッダーフィールド (Header Field) は圧縮されません。Webページが数十から数百のリクエストを必要とするように成長するにつれて、これらのリクエストにおける冗長なヘッダーフィールドは、帯域幅を不必要に消費し、レイテンシを著しく増加させます。
SPDY [SPDY] は当初、DEFLATE [DEFLATE] 形式を使用してヘッダーフィールドを圧縮することでこの冗長性に対処しました。これは冗長なヘッダーフィールドを効率的に表現する上で非常に効果的であることが証明されました。しかし、このアプローチは、CRIME (Compression Ratio Info-leak Made Easy) 攻撃 ([CRIME]参照) によって実証されたセキュリティリスクにさらされました。
本仕様は、冗長なヘッダーフィールドを排除し、既知のセキュリティ攻撃に対する脆弱性を制限し、制約された環境での使用のための制限されたメモリ要件を持つ新しい圧縮方式であるHPACKを定義します。HPACKの潜在的なセキュリティ上の懸念については、第7節で説明されています。
HPACK形式は意図的にシンプルで柔軟性がありません。両方の特性により、実装エラーによる相互運用性やセキュリティ問題のリスクが軽減されます。拡張メカニズムは定義されていません。形式の変更は、完全な置き換えを定義することによってのみ可能です。
1.1. 概要 (Overview)
本仕様で定義される形式は、ヘッダーフィールドのリストを、重複するペアを含むことができる名前と値のペアの順序付きコレクションとして扱います。名前と値は不透明なオクテットシーケンスと見なされ、ヘッダーフィールドの順序は圧縮および解凍後も保持されます。
エンコーディング (Encoding) は、ヘッダーフィールドをインデックス値 (Index Value) にマッピングするヘッダーフィールドテーブルによって通知されます。これらのヘッダーフィールドテーブルは、新しいヘッダーフィールドがエンコードまたはデコードされるときに段階的に更新できます。
エンコードされた形式では、ヘッダーフィールドはリテラルとして表現されるか、ヘッダーフィールドテーブルのいずれか (Header Field Table) 内のヘッダーフィールドへの参照として表現されます。したがって、ヘッダーフィールドのリストは、参照とリテラル値の混合を使用してエンコードできます。
リテラル値 (Literal Value) は、直接エンコードされるか、静的ハフマン符号 (Static Huffman Code) を使用します。
エンコーダー (Encoder) は、どのヘッダーフィールドをヘッダーフィールドテーブルに新しいエントリとして挿入するかを決定する責任があります。デコーダー (Decoder) は、エンコーダーによって規定されたヘッダーフィールドテーブルへの変更を実行し、その過程でヘッダーフィールドのリストを再構築します。これにより、デコーダーはシンプルなままで、さまざまなエンコーダーと相互運用できます。
これらの異なるメカニズムを使用してヘッダーフィールドを表現する例は、付録Cで入手できます。
1.2. 表記規則 (Conventions)
本文書におけるキーワード「しなければならない (MUST)」、「してはならない (MUST NOT)」、「必須である (REQUIRED)」、「すべきである (SHALL)」、「すべきでない (SHALL NOT)」、「推奨される (SHOULD)」、「推奨されない (SHOULD NOT)」、「してもよい (RECOMMENDED)」、「可能である (MAY)」、「任意である (OPTIONAL)」は、RFC 2119 [RFC2119] に記載されているように解釈されるものとします。
すべての数値はネットワークバイトオーダーです。値は特に指定されない限り符号なしです。リテラル値は、必要に応じて10進数または16進数で提供されます。
1.3. 用語 (Terminology)
本仕様は以下の用語を使用します:
ヘッダーフィールド (Header Field): 名前と値のペア。名前と値の両方は不透明なオクテットシーケンスとして扱われます。
動的テーブル (Dynamic Table): 動的テーブル (第2.3.2節参照) は、格納されたヘッダーフィールドをインデックス値に関連付けるテーブルです。このテーブルは動的であり、エンコーディングまたはデコーディングコンテキストに固有です。
静的テーブル (Static Table): 静的テーブル (第2.3.1節参照) は、頻繁に発生するヘッダーフィールドをインデックス値に静的に関連付けるテーブルです。このテーブルは順序付けられ、読み取り専用で、常にアクセス可能であり、すべてのエンコーディングまたはデコーディングコンテキスト間で共有される場合があります。
ヘッダーリスト (Header List): ヘッダーリストは、共同でエンコードされ、重複するヘッダーフィールドを含むことができるヘッダーフィールドの順序付きコレクションです。HTTP/2ヘッダーブロックに含まれるヘッダーフィールドの完全なリストは、ヘッダーリストです。
ヘッダーフィールド表現 (Header Field Representation): ヘッダーフィールドは、エンコードされた形式でリテラルまたはインデックスとして表現できます (第2.4節参照)。
ヘッダーブロック (Header Block): デコードされると完全なヘッダーリストを生成するヘッダーフィールド表現の順序付きリスト。