HTTPbis Working GroupR. Peon
Internet-DraftGoogle, Inc
Intended status: Standards TrackH. Ruellan
Expires: July 21, 2015Canon CRF
January 17, 2015

HPACK - HTTP/2 のためのヘッダ圧縮
draft-ietf-httpbis-header-compression-latest

概要

この仕様書は HTTP/2 で使われる HTTP ヘッダフィールドを 効率的に表現する圧縮フォーマット HPACK を定義 します。

編集者ノート (RFC 編集者が削除すること)

この草案の議論は <https://lists.w3.org/Archives/Public/ietf-http-wg/> に アーカイブされる HTTPBIS ワーキンググループのメーリングリスト (ietf-http-wg@w3.org) で行われます。

ワーキンググループの情報は <http://tools.ietf.org/wg/httpbis/> 、特に HTTP/2 については <http://http2.github.io/> で見ることができます。

このドラフトの変更は Appendix D.1 に まとめられています。

Status of This Memo

This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.

Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at http://datatracker.ietf.org/drafts/current/.

Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as “work in progress”.

This Internet-Draft will expire on July 21, 2015.

Copyright Notice

Copyright © 2015 IETF Trust and the persons identified as the document authors. All rights reserved.

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.


目次

1. はじめに

HTTP/1.1 ([RFC7230] を参照) において、 ヘッダフィールドは圧縮されません。 Web ページは 12 から数百の リクエストを含むようになってきており、これらのリクエストの中の 余分なヘッダフィールドは不必要に帯域を消費し、レイテンシを 大きく増加します。

SPDY [SPDY] は最初、余分なヘッダフィールド を効率的に表現することで非常に効率的にする DEFLATE [DEFLATE] フォーマットを使用して ヘッダフィールドを圧縮することによりこの無駄に取り組みました。 しかしながら、このアプローチは CRIME 攻撃で実証された通り セキュリティリスクがあります。 ([CRIME]を参照)

この仕様書は余分なヘッダフィールドを消去し、既知のセキュリティ 攻撃への脆弱性を抑制し、そして制限された環境で使用する 制限されたメモリ要求を持つヘッダフィールドの新しい圧縮方式 HPACK を定義します。

1.1 概要

この仕様で定義されるフォーマットはヘッダフィールドのリストを 重複可能な名前と値のペアの順序付けられたコレクションとして扱います。 名前と値は不透明なオクテットの並びになることを考慮し、ヘッダ フィールドの順序は圧縮と展開の後で保存されます。

エンコーディングは名前と値のペアとインデックスされた値を マップするヘッダテーブルによって決まります。これらの ヘッダテーブルは、新しいペアをエンコードもしくはデコードする 時に増分更新を行えます。

エンコードされた形式内で、ヘッダフィールドはリテラルもしくは ヘッダテーブル内の一つの名前と値のペアへの参照として表現 されます。従って、ヘッダフィールドのリストは参照とリテラル値を 混ぜ合わせてエンコードできます。

エンコーダはヘッダテーブルに新しいエントリとして挿入する ヘッダフィールドを決定する責任があります。デコーダは エンコーダによって定められたヘッダテーブルに対する修正を行い、 その処理内でヘッダフィールドのリストを再構築します。 これによりデコーダをシンプル化し、非常に様々なエンコーダと 相互運用可能にすることができます。

ヘッダフィールドを表現するためのこれらの異なったメカニズムの使用 を解説する例は Appendix C にあります。

1.2 表記

この文書のキーワード "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", そして "OPTIONAL" は RFC 2119 [RFC2119] に記述された通りに解釈されます。

全ての数値はネットワークバイトオーダーです。特に断りが 無い限り値は符号なしです。リテラルの値は必要に応じて 10 進数または 16 進数で与えられます。

1.3 用語

この使用は下記の用語を使用します:

ヘッダフィールド:
名前と値のペア。名前と値どちらも不定なオクテットの 連続として扱われます。
動的テーブル:
動的テーブル (Section 2.3.2 を参照) は保存されたヘッダフィールドとインデックス 値を関連付けるのに使用されるヘッダテーブルです。 このテーブルは動的でエンコーディングやデコーディング のコンテキスト特有です。
静的テーブル:
静的テーブル(Section 2.3.1 を参照) は静的なヘッダフィールドとインデックス 値を関連づけるのに使用されるヘッダテーブルです。 このテーブルは順序付けられ、リードオンリーであり、 常にアクセス可能で、すべてのエンコーディングや デコーディングのコンテキストの間で共有される 可能性があります。
ヘッダリスト:
ヘッダリストは一緒にエンコードされるヘッダ フィールドの順序付けられたコレクションであり、重複した ヘッダフィールドを含むことができます。 HTTP/2 ヘッダブロックに含まれるキーと値のペアの 完全なリストがヘッダリストです。
ヘッダフィールド表現:
ヘッダフィールドはリテラルかインデックスの どちらかのエンコードされた形式で表現できます。 (Section 2.4 を参照)
ヘッダブロック:
デコード時に完全なヘッダリストを提供する ヘッダフィールド表現の順序付けられたリストです。

2. 圧縮処理の概要

この仕様ではエンコーダの為の特定のアルゴリズムについては記述 しません。代わりに、デコーダがどう処理することが期待され、 この定義で許されるエンコーディングを行う為にエンコーダに許される ことを正確に定義します。

2.1 ヘッダリストの順序

HPACK はヘッダリスト内のヘッダフィールドの順序を保存します。 エンコーダはオリジナルのヘッダリスト内の順序に従ってヘッダ ブロックのヘッダフィールド表現を順序付けなければなりません (MUST) 。 デコーダはヘッダブロック内の順序によってデコードされたヘッダ リストのヘッダフィールドを順序付けなければなりません (MUST) 。

2.2 エンコーディングとデコーディングのコンテキスト

ヘッダブロックを展開するため、デコーダはデコーディング コンテキストとして動的テーブル (Section 2.3.2 を参照) の管理のみを 必要とします。他に必要な状態はありません。

HTTP のような双方向コミュニケーションに使用される際、 エンコーディングとデコーディングの動的テーブルは 完全に独立したエンドポイントによって管理されます。 例えば、リクエストとレスポンスの動的テーブルは分離されます。

2.3 インデックステーブル

HPACK はヘッダフィールドとインデックスを関連付ける二つの テーブルを使用します。静的テーブル (Section 2.3.1 を参照) は予め定義されて おり、 (ほとんどは空の値を持った) よく使用されるヘッダフィールドを 持ちます。動的テーブル (Section 2.3.2 を 参照) は動的であり、エンコーダによってエンコードされた ヘッダリスト内で繰り返し使用されるヘッダフィールドを指すのに 使用できます。

これら二つのテーブルはインデックス値の定義のため単一のアドレス 空間内で結合されます。 (Section 2.3.3 を参照)

2.3.1 静的テーブル

静的テーブルは予め定義されたヘッダフィールドの静的 リストで構成されます。このエントリは Appendix A で定義 されます。

2.3.2 動的テーブル

動的テーブルは first-in, first-out 順で管理される ヘッダフィールドのリストで構成されます。動的テーブルの 最初であり最新のエントリは最小のインデックスに、最古の エントリは最大のインデックスになります。

動的テーブルは最初は空です。各ヘッダブロックとして追加 されるエントリは展開されています。

動的テーブルは重複するエントリを持つことができます。 従って、重複したエントリはデコーダによってエラーとして 扱われてはいけません (MUST NOT) 。

エンコーダは動的テーブルの更新のしかたを決定するので、動的 テーブルに使用されるメモリ量を制御することができます。 デコーダのメモリ要件を制限するために、動的テーブルサイズは 厳密に束縛されます (Section 4.2 を 参照) 。

ヘッダフィールド表現のリストの処理中にデコーダは動的 テーブルを更新します。(Section 3.2 を参照)

2.3.3 インデックスアドレス空間

静的テーブルと動的テーブルは単一のインデックスアドレス 空間内で結合されます。

1 から静的テーブルの長さの間の指定は静的テーブル内の 要素を参照します (Section 2.3.1 を 参照) 。

静的テーブルの長さより大きい指定は動的テーブル (Section 2.3.2 を参照) 内の 要素を参照します。静的テーブルの長さは動的テーブルの インデックスを検索するため差し引かれます。

両方のテーブルの長さの合計値より大きい指定はデコード エラーとして扱われなければなりません (MUST) 。

静的テーブルサイズ s 、動的テーブルサイズ k として、 下記の図は全体の有効なインデックスアドレス空間を 示しています。

        <----------  Index Address Space ---------->
        <-- Static  Table -->  <-- Dynamic Table -->
        +---+-----------+---+  +---+-----------+---+
        | 1 |    ...    | s |  |s+1|    ...    |s+k|
        +---+-----------+---+  +---+-----------+---+
                               ^                   |
                               |                   V
                        Insertion Point      Dropping Point

Figure 1: インデックスアドレス空間

2.4 ヘッダフィールド表現

エンコードされたヘッダフィールドはリテラルもしくは インデックスで表現できます。

リテラル表現は名前と値を指定することでヘッダフィールドを 定義します。ヘッダフィールド名はリテラル、もしくは静的テーブル または動的テーブルのエントリへの参照として表現できます。 ヘッダフィールド値はリテラルで表現されます。

3 つの異なるリテラル表現は下記のように定義されます:

  • 動的テーブルへのヘッダフィールドの追加を行わない リテラル表現 (Section 6.2.2 を参照) 。
  • 特に中継者に再エンコードされる際に、ヘッダフィールドが 常にリテラル表現を使用するような追加条件を伴う、 動的テーブルへのヘッダフィールドの追加を行わない リテラル表現 (Section 6.2.3 を参照) 。
  • ヘッダフィールドを新しいエントリとして動的テーブルの 先頭に追加するリテラル表現 (Section 6.2.1 を 参照) 。

インデックス表現は静的テーブルまたは動的テーブルの エントリへの参照としてヘッダフィールドを定義します (Section 6.1 を 参照)。

3. ヘッダブロックのデコード処理

3.1 ヘッダブロック処理

デコーダはオリジナルのヘッダリストを逐次的に再構成することで ヘッダブロックを処理します。

いったんヘッダフィールドがデコードされ再構成されたヘッダ リストに追加されたら、削除することはできません。 ヘッダリストに追加されたヘッダフィールドはアプリケーションに 安全に渡されます。

アプリケーションに結果のヘッダフィールドを渡すことで、 デコーダは動的テーブルの他に最低限の一時的なメモリ消費で 実装できます。

3.2 ヘッダフィールド表現の処理

ヘッダリストを得るためのヘッダブロックの処理をこの節で 定義します。デコード処理でうまくヘッダリストを生成する ことを確実にするため、デコーダは下記の規則に従わなければ なりません (MUST) 。

ヘッダブロックに含まれるすべてのヘッダフィールド表現は 下記に示す通り、現れた順に処理されます。様々なヘッダ フィールド表現のフォーマットの詳細と、追加の処理命令は Section 6 にあります。

インデックス表現 は 下記のアクションを 伴います:

  • 静的テーブルもしくは動的テーブルの参照されるエントリに 対応するヘッダフィールドをデコード済みヘッダリストに 追加する。

動的テーブルに 追加されていない リテラル表現 は下記のアクションを伴います:

  • ヘッダフィールドをデコード済みヘッダリストに 追加する。

動的テーブルに 追加されている リテラル表現 は下記のアクションを伴います:

  • ヘッダフィールドをデコード済みヘッダリストに 追加する。
  • ヘッダフィールドは動的テーブルの先頭に挿入されます。 この挿入処理は動的テーブルの以前のエントリの削除を 引き起こす可能性があります (Section 4.4 を参照) 。

4. 動的テーブルの管理

デコーダ側のメモリ要件を制限するため、動的テーブルは サイズが制限されます。

4.1 テーブルサイズの計算

動的テーブルのサイズはそのエントリのサイズの合計値です。

エントリのサイズはその名前のオクテットの長さ (Section 5.2 で定義される 通り) と値のオクテットの長さ (Section 5.2 を参照) に 32 を加えた合計値です。

エントリのサイズはハフマンエンコーディングの適用無しの 名前と値の長さで計算されます。

注意: エントリに関連付くオーバーヘッドとして追加の 32 オクテットを付加します。例として、エントリの名前と値を 参照するための 2 つの 64 ビットポインタと、名前と値への 参照数を数える 2 つの 64 ビット整数を使うエントリ構造 は 32 オクテットのオーバーヘッドを持ちます。

4.2 最大テーブルサイズ

HPACK を使用するプロトコルは、エンコーダが動的テーブルに 使用することが許可される最大サイズを決定します。 HTTP/2 に おいて、この値は SETTINGS_HEADER_TABLE_SIZE 設定 (Section 6.5.2 of [HTTP2] を 参照) で決定されます。

エンコーダはこの最大値より小さな容量を使用することを選択する ことが可能です (Section 6.3 を 参照) が、その値はプロトコルによって設定された最大値 以下に留めなければなりません (MUST) 。

動的テーブルの最大サイズはヘッダブロックのエンコーディング中を 除き任意のタイミングでプロトコルによって変更可能です。 エンコーダによって使用される動的テーブルの最大値を変更した 後は、エンコーダはエンコーディングコンテキスト更新 (Section 6.3 を参照) によって この変更を通知しなければなりません (MUST) 。エンコーディング コンテキスト更新はヘッダテーブルサイズの変更に続いて、最初の ヘッダブロックの先頭で行わなければなりません (MUST) 。 HTTP/2 において、これは設定同期 (Section 6.5.3 of [HTTP2] を 参照) で追従します。

二つのヘッダブロックの送信の間に複数のテーブルサイズの最大値の 更新が起こる可能性があります。この場合このパラメータの値は 一度以上変更され、もし変更された値より小さい新たな最大サイズがあれば、 最小値がパラメータとしてエンコーディングコンテキスト更新内で 送信されなければなりません (MUST) 。変更された最大サイズは常に 送信され、多くて二つのエンコーディングコンテキスト更新が引き 起こされます。これはデコーダがデコーダテーブルサイズに基づき 削除を実行することを可能にするのを確実にします (Section 4.3 を参照) 。

このメカニズムで 0 の最大サイズを設定することで動的テーブル からエントリを完全にクリアして、その後に再格納することが できます。

4.3 動的テーブルサイズ変更時のエントリの削除

動的テーブルの最大サイズが減少するたびに、動的テーブルの サイズが最大サイズ以下になるまで動的テーブルの末尾から エントリが削除されます。

4.4 新しいエントリ追加時のエントリの削除

動的テーブルに新しいエントリが追加されるたびに、 動的テーブルのサイズが (最大サイズ - 新しいエントリサイズ) 以下になるかテーブルが空になるまで動的テーブルの末尾から エントリが削除されます。

もし追加されたエントリの表現が動的テーブルのエントリの名前を 参照しているなら、参照される名前はその名前が不用意に削除される のを避けるため削除を実行するより前にキャッシュされます。

もし新しいエントリのサイズが最大サイズ以下なら、エントリは テーブルに追加されます。最大サイズより大きいエントリの 追加を試みることはエラーにはなりません; テーブル全体より 大きなエントリの追加を試みるとすべてのエントリを空にすることに なり、テーブルを空にする結果になります。

5. プリミティブ型表現

HPACK エンコーディングは二つのプリミティブ型を使用します: 符号なしの可変長整数と、オクテットの文字列

5.1 整数表現

整数は名前のインデックス、ペアのインデックスまたは文字列の 長さを表現するために使用されます。処理の最適化のため、 整数表現は常にオクテットの最後で終わります。

整数は 2 つのパートで表現されます: 現在のオクテットを埋める プレフィックスとプレフィックス内に収まらない整数値のため 使用されるオクテットのオプションのリスト。プレフィックス のビット数 (N と呼ばれる) はこの整数表現のパラメータです。

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| ? | ? | ? |     Value (N)     |
+---+---+---+-------------------+

Figure 2: プレフィックス内のエンコードされた整数値 (N = 5 の場合)

整数値が十分小さい、すなわち 2N-1 未満の 場合、 N ビットプレフィックス内にエンコードされます。

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| ? | ? | ? | 1   1   1   1   1 |
+---+---+---+-------------------+
| 1 |   Value-(2^N-1) LSB (7)   |
+---+---------------------------+
               ...
+---+---------------------------+
| 0 |   Value-(2^N-1) MSB (7)   |
+---+---------------------------+

Figure 3: プレフィックスの後ろのエンコードされた整数値 (N = 5 の場合)

そうでない場合、プレフィックスの全てのビットが 1 ならその値は 2N-1 分減らされ、一個以上の オクテットのリストを使用してエンコードされます。 各オクテットの最上位ビットは継続フラグとして使用されます: リストの最終オクテットを除きこの値には 1 がセットされます。 残りのオクテットのビットは残った値をエンコードするのに 使用されます。

オクテットのリストからの整数値のデコード処理はリストの オクテットの逆順から開始します。その後、オクテット毎に 最上位ビットを除去します。オクテットの残りのビットは 連結され、その結果の値は整数値を得るために 2N-1 分加算されます。

プレフィックスサイズ N は常に 1 から 8 ビットの間です。 オクテット境界から開始する整数は 8 ビットプレフィックスを 持ちます。

整数 I を表現する擬似コードは下記の通り:

if I < 2^N - 1, encode I on N bits
else
    encode (2^N - 1) on N bits
    I = I - (2^N - 1)
    while I >= 128
         encode (I % 128 + 128) on 8 bits
         I = I / 128
    encode I on 8 bits

整数 I をデコードする擬似コードは下記の通り:

decode I from the next N bits
if I < 2^N - 1, return I
else
    M = 0
    repeat
        B = next octet
        I = I + (B & 127) * 2^M
        M = M + 7
    while B & 128 == 128
    return I

整数のエンコード処理を解説する例は Appendix C.1 にあります。

この整数表現は不定サイズの値が許可されます。エンコーダは ゼロ値の巨大な数値を送ることも可能ですが、オクテットを浪費して 整数値のオーバーフローを起こす可能性があります。 値やオクテットの長さでの過度に巨大な整数のエンコードは デコードエラーとして扱われなければなりません (MUST) 。 制限の差異は実装上の制限に基づいて、各々の整数の使用方法の違いに 合わせることができます。

5.2 文字列リテラル表現

ヘッダフィールド名とヘッダフィールド値はリテラル文字列で 表現できます。リテラル文字列は文字列リテラルの オクテットに直接、もしくはハフマン符号 ([HUFFMAN] を参照) を 使用することでオクテットの連続としてエンコードされます。

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| H |    String Length (7+)     |
+---+---------------------------+
|  String Data (Length octets)  |
+-------------------------------+

Figure 4: 文字列リテラル表現

リテラル文字列表現は下記のフィールドを含みます:

H:
1 ビットフラグ H 。文字列のオクテットがハフマン エンコーディングされているかどうかを示します。
String Length:
文字列リテラルをエンコードするのに使用された オクテットの数。 7 ビットプレフィックスの 整数としてエンコードされます。(Section 5.1 を参照)
String Data:
文字列リテラルのエンコードされたデータ。 もし H が '0' なら、エンコードされたデータは 文字列リテラルの生のオクテットです。もし H が '1' なら、エンコードされたデータは文字列リテラルを ハフマンエンコーディングされています。

ハフマンエンコーディングを使用する文字列リテラルは Appendix B で定義されるハフマン符号で エンコードされます。(リクエストの例として Appendix C.4 を、 レスポンスの例として Appendix C.6 を 参照) エンコードされたデータは文字列リテラルの各 オクテットに対応する符号のビット列です。

ハフマンエンコードされたデータは常にオクテット境界で終わる わけではないので、その後に次のオクテット境界までパディングが 挿入されます。このパディングが文字列リテラルの一部だと誤認 されることを防ぐため、符号の最上位ビットに EOS (end-of-string) に対応するシンボルが使用されます。

デコーディングにおいて、エンコードされたデータの最後の 不完全なコードはパディングだとみなされ、破棄されます。 7 ビットより大きいパディングはデコードエラーとして 扱われなければなりません (MUST) 。 EOS シンボルのコードの 最上位ビットに対応しないパディングはデコードエラーとして 扱われなければなりません (MUST) 。 EOS シンボルを含む ハフマンエンコードされた文字列リテラルはデコードエラーとして 扱われなければなりません (MUST) 。

6. バイナリフォーマット

この節では様々なヘッダフィールド表現の詳細フォーマット と、加えてエンコーディングコンテキストの更新命令について 記述します。

6.1 インデックスヘッダフィールド表現

インデックスヘッダフィールド表現は静的テーブル または動的テーブルのエントリを識別します。(Section 2.3 を参照)

インデックスヘッダフィールド表現は Section 3.2 で 記述した通り、デコードされたヘッダリストへのヘッダ フィールドの追加を発生させます。

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 1 |        Index (7+)         |
+---+---------------------------+

Figure 5: インデックスヘッダフィールド

インデックスヘッダフィールドは 1 ビットパターン '1' から開始し、マッチするペアのインデックスが後に続きます。 インデックスは 7 ビットプレフィックスの整数として表現 されます (Section 5.1 を 参照) 。

0 のインデックス値は使用されません。もしインデックスヘッダ フィールド表現でこれが見つかった場合、デコードエラーとして 扱われなければなりません (MUST) 。

6.2 リテラルヘッダフィールド表現

リテラルヘッダフィールド表現はリテラルヘッダフィールド値を 含みます。ヘッダフィールド名はリテラル、もしくは静的テーブル か動的テーブルに存在するテーブルエントリへの参照として 与えられます。 (Section 2.3 を参照)

この仕様ではリテラルヘッダフィールド表現の 3 つの形式、 インデックスを伴う、インデックスを伴わない、インデックスしない ものを定義します。

6.2.1 インデックス更新を伴うリテラルヘッダフィールド

インデックス更新を伴うリテラルヘッダフィールド表現は デコードされたヘッダリストへのヘッダフィールドの追加と 動的テーブルへの新しいエントリの挿入を発生させます。

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 1 |      Index (6+)       |
+---+---+-----------------------+
| H |     Value Length (7+)     |
+---+---------------------------+
| Value String (Length octets)  |
+-------------------------------+

Figure 6: インデックス更新を伴うリテラルヘッダフィールド - インデックスされた名前

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 1 |           0           |
+---+---+-----------------------+
| H |     Name Length (7+)      |
+---+---------------------------+
|  Name String (Length octets)  |
+---+---------------------------+
| H |     Value Length (7+)     |
+---+---------------------------+
| Value String (Length octets)  |
+-------------------------------+

Figure 7: インデックス更新を伴うリテラルヘッダフィールド - 新しい名前

インデックス更新を伴うリテラルヘッダフィールド表現は 2 ビットパターン '01' から開始します。

もし静的テーブルまたは動的テーブルに格納されたエントリの ヘッダフィールド名に、ヘッダフィールド名とマッチする場合、 ヘッダフィールド名はそのエントリのインデックスを用いて 表現できます。この場合、エントリのインデックスは 6 ビット プレフィックスの整数値として表現されます。 (Section 5.1 を参照) この値は常に非ゼロです。

そうでなければ、ヘッダフィールド名が文字列リテラル (Section 5.2 を 参照) として表現されます。 6 ビットインデックスの 代わりに 0 値が使用され、ヘッダフィールド名が続きます。

どちらのヘッダフィールド名表現の形式も、文字列リテラル (Section 5.2 を 参照) として表現されたヘッダフィールド値が続きます。

6.2.2 インデックス更新を伴わないリテラルヘッダフィールド

インデックス更新を伴わないリテラルヘッダフィールド表現は、 動的テーブルの変更を伴わずにデコードされたヘッダリストへの ヘッダフィールドの追加を引き起こします。

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 |  Index (4+)   |
+---+---+-----------------------+
| H |     Value Length (7+)     |
+---+---------------------------+
| Value String (Length octets)  |
+-------------------------------+

Figure 8: インデックス更新を伴わないリテラルヘッダフィールド - インデックスされた名前

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 |       0       |
+---+---+-----------------------+
| H |     Name Length (7+)      |
+---+---------------------------+
|  Name String (Length octets)  |
+---+---------------------------+
| H |     Value Length (7+)     |
+---+---------------------------+
| Value String (Length octets)  |
+-------------------------------+

Figure 9: インデックス更新を伴わないリテラルヘッダフィールド - 新しい名前

インデックス更新を伴わないリテラルヘッダフィールド表現は 4 ビットパターン '0000' から開始します。

もし静的テーブルまたは動的テーブルに格納されたエントリの ヘッダフィールド名に、ヘッダフィールド名とマッチする場合、 ヘッダフィールド名はそのエントリのインデックスを用いて 表現できます。この場合、エントリのインデックスは 4 ビット プレフィックスの整数値として表現されます。 (Section 5.1 を参照) この値は常に非ゼロです。

そうでなければ、ヘッダフィールド名が文字列リテラル (Section 5.2 を 参照) として表現されます。 4 ビットインデックスの 代わりに 0 値が使用され、ヘッダフィールド名が続きます。

どちらのヘッダフィールド名表現の形式も、文字列リテラル (Section 5.2 を 参照) として表現されたヘッダフィールド値が続きます。

6.2.3 インデックスされないリテラルヘッダフィールド

インデックスされないリテラルヘッダフィールド表現は 動的テーブルの変更を伴わずにデコードされたヘッダリストへの ヘッダフィールドの追加を引き起こします。 中継者はこのヘッダフィールドのエンコードに同じ表現を 使用しなければなりません (MUST) 。

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 1 |  Index (4+)   |
+---+---+-----------------------+
| H |     Value Length (7+)     |
+---+---------------------------+
| Value String (Length octets)  |
+-------------------------------+

Figure 10: インデックスされないリテラルヘッダフィールド - インデックスされた名前

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 1 |       0       |
+---+---+-----------------------+
| H |     Name Length (7+)      |
+---+---------------------------+
|  Name String (Length octets)  |
+---+---------------------------+
| H |     Value Length (7+)     |
+---+---------------------------+
| Value String (Length octets)  |
+-------------------------------+

Figure 11: インデックスされないリテラルヘッダフィールド - 新しい名前

インデックスされないリテラルヘッダフィールド表現は 4 ビットパターン '0001' から開始します。

ヘッダフィールドがインデックスされないリテラルヘッダ フィールドとして表現される際、常にこのリテラル表現で エンコードされなければなりません (MUST) 。特に、 ピアがインデックスされないリテラルヘッダフィールド として表現されたヘッダフィールドを受け取ってそれを 送信する際、そのヘッダフィールドを転送するのに同じ 表現を使用しなければなりません (MUST) 。

この表現は圧縮によるリスクに晒されないよう ヘッダフィールド値を保護することを意図しています (詳細は Section 7.1 を 参照) 。

この表現のエンコーディングはインデクシングを伴わない リテラルヘッダフィールドと同様です (Section 6.2.2 を 参照) 。

6.3 動的テーブルサイズ更新

動的テーブルサイズ更新は動的テーブルのサイズの変更を 通知します。

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 1 |   Max size (5+)   |
+---+---------------------------+

Figure 12: 最大動的テーブルサイズの変更

動的テーブルサイズ更新は 3 ビットパターン '001' から開始し、 5 ビットプレフィックスの整数値 (Section 5.1 を参照) として 表現される新しい最大値が続きます。

新しい最大値はデコーダが受け取りエンコーダが知らせた (Section 6.5.3 of [HTTP2] を参照) SETTINGS_HEADER_TABLE_SIZE パラメータ (Section 6.5.2 of [HTTP2] を 参照) の最後の値以下でなければなりません (MUST) 。

動的テーブルの最大サイズの減少はエントリの削除を引き起こす 可能性があります。 (Section 4.3 を 参照) 。

7. セキュリティへの配慮

この節では HPACK の潜在的なセキュリティへの懸念部分について 記述します。

7.1 厳密な動的テーブルの状態

HPACK は HTTP のようなプロトコルで固有な冗長性を活用する ことによってエンコーディングをされたヘッダフィールドの長さを 減らします。この究極的なゴールは HTTP リクエストや レスポンスを送るために求められるデータの量を減らすことです。

ヘッダフィールドをエンコードするのに使用される圧縮 コンテキストは、エンコードし送信されるヘッダフィールドを 定義でき、一度エンコードされるフィールドの長さを 観測できる攻撃者によって探り当てられる可能性があります。 攻撃者がどちらも行える際、動的テーブルの状態に関する推測を 確認するためにリクエストをうまく修正することが可能です。 もし推測した値が短い長さに圧縮されるなら、攻撃者はエンコードされた 長さと推測した値が正しいという推量を確認できます。

これは TLS を用いても起こる可能性があります。なぜなら TLS がコンテンツの秘密保護を提供していても、そのコンテンツの 長さに関しては限られた保護のみしか提供されないためです。

注意:
パティングスキームは推測の増加数を与えらた推測に 関連した長さを学習することのみ強制する可能性が あるような、これらの能力を持つ攻撃者に対する限られた 保護のみ提供します。 パディングスキームは送信されたビット数を増加することに よって圧縮に対しても直接作用します。

CRIME [CRIME] のような攻撃はこれらの 一般的な攻撃者の能力の存在を証明しています。 DEFLATE [DEFLATE] の事実を悪用するこの 攻撃はプレフィックスマッチングに基づき冗長性を減らし ます。これは同時に攻撃者に文字の推測を検証する ことを許してしまい、指数関数時間の攻撃から線形時間の攻撃に してしまいます。

7.1.1 HPACK と HTTP への適応性

HPACK は緩和はしますが全体のヘッダフィールド値ではなく 個々の文字をマッチさせることを推測値に強制することによる CRIME [CRIME] に則った攻撃の完全な 防御はしません。攻撃者は推測値が正しいか否かのみを学習する ことができるため、ヘッダフィールド値の総当たり推測に 成り下がります。

特定のヘッダフィールド値の復元の可能性は、従って値の エントロピーに依存します。結果として、高エントロピーの 値はうまく復元される可能性は低くなります。しかしながら 低エントロピーの値は弱さが残ります。

この性質の攻撃は一つの HTTP/2 コネクション上で行われる 二つの互いに信用できないエンティティ制御リクエストと レスポンスの任意のタイミングで行えます。 もし共有の HPACK 実装が一つのエンティティに動的テーブルへの エントリの追加を許可し、他者がそのエントリにアクセス するなら、テーブルの状態を学習できます。

互いに信用できないエンティティからのリクエストと レスポンスがあるのは中継者がどちらかの時です:

  • 複数のクライアントからのリクエストを一つの コネクション上でオリジンサーバに送る、または
  • 複数のオリジンサーバからのレスポンスを 共有された一つのコネクション上でクライアントに送る。

Web ブラウザも異なる web オリジン [ORIGIN] によって同じコネクションで作成されるリクエストが互いに信用 できないエンティティによって作成されることを仮定する必要が あります。

7.1.2 緩和

ヘッダフィールドの機密性が求められる HTTP のユーザは 推測不可能にするのに十分なエントロピーを持つ値を 使用することができます。しかしながら、これは一般的な 解としては実用的ではありません。なぜならすべての HTTP のユーザに攻撃を緩和するためのステップを行う ことを強制することになるためです。 HTTP の使われ 方に新たな制約を加えることになります。

HTTP のユーザに制約を課すのではなく、 HPACK の実装は 動的テーブルの探り当ての可能性を制限するために圧縮の仕方を 制限することで代えることができます。

理想的な解は動的テーブルへのアクセスをヘッダフィールドを 構築するエンティティに基づいて分離することです。 テーブルに追加されるヘッダフィールド値はエンティティに 属し、その値を作成したエンティティのみが値を抽出 できます。

このオプションの圧縮性能を向上するため、信頼している エンティティは公開状態にタグ付けします。例えば、 web ブラウザは Accept-Encoding ヘッダフィールドの 値は全リクエストで使用可能にします。

ヘッダフィールドの出処の良い情報を持たないエンコーダは 代わりに、更なる推測を効率的に防ぐため、すべての将来の リクエストの懸念からすべての値が削除されることに なるヘッダフィールド値の推測を試みるような、 悪い推測の報いを受ける可能性があります。

注意:
もし攻撃者が値の再入を行える信頼できる経路を 持つ場合、動的テーブルからの値の単純な削除では 不十分である可能性があります。例えば、 web ブラウザにおいて画像を読み込むための リクエストは典型的に Cookie ヘッダフィールド (この種類の攻撃で価値あるターゲットである可能性が 高い) を含み、 web サイトは簡単に画像が 読み込まれることを強制できるので、それによって 動的テーブルのエントリはリフレッシュされます。

このレスポンスはヘッダフィールドの長さと比較して逆に 作成される場合があります。アクセス不可能とマークする ことで短い値をより素早く、長い値より高い確率で 起こる可能性があります。

圧縮を無効にするか更なる制限を行うことによって、 実装は Authorization や Cookie ヘッダフィールドなどの 価値の高いことで知られる信頼できるヘッダフィールドを 保護することを選ぶこともできます。

7.1.3 インデックスされないリテラル

ヘッダフィールドのインデックス表現の生成を止める ことは圧縮がすべてのホップで行われない場合のみ 影響します。インデックスされないリテラル (Section 6.2.3 を 参照) は中継者に特定の値が意図的にリテラルとして 送信されたことを通知するのに使用できます。中継者は インデックスを伴うインデックスされないリテラルを 使用する値を再エンコードしてはいけません (MUST NOT) 。

7.2 静的ハフマンエンコーディング

固定ハフマンエンコーディングに対する現在知られている攻撃は ありません。固定ハフマンエンコーディングテーブルを用いる ことが情報漏えいを引き起こすことを示した研究がありますが、 攻撃者は意味のある情報を復元するためにこの情報漏えいを 利用することはできないと結論付けています ([PETAL] を参照) 。

7.3 メモリ消費

攻撃者はエンドポイントがメモリを使い尽くすことを引き起こす ことを試みることができます。 HPACK はエンドポイントで 割り当てられたメモリ量のピークと状態を制限するよう設計 されています。

圧縮状態によって使用されるメモリ量は HTTP/2 の設定 パラメータ SETTINGS_HEADER_TABLE_SIZE (Section 6.5.2 of [HTTP2] を 参照) の値を使用するデコーダによって制限されます。 この制限は動的テーブルに格納されるデータのサイズと、 加えてオーバーヘッドへの少しの配慮の両方を考慮しています。

デコーダは SETTINGS_HEADER_TABLE_SIZE パラメータに適切な 値を設定することで状態メモリの量を制限できます。 エンコーダはデコーダに許可された値未満の動的テーブル サイズを通知することで使用する状態メモリの量を制限できます。 (Section 6.3 を参照)

エンコーダやデコーダで消費される一時メモリ量は ヘッダフィールドを連続的に処理することで制限できます。 実装はヘッダフィールドの完全なリストを保持する必要は ありません。しかしながら他の理由のため完全なヘッダリストを 保持することがアプリケーションによっては必要になるかも しれないことに注意してください; HPACK がこれを強制して いないにも関わらず、アプリケーションの制限はこれを必要と するかもしれません。

7.4 実装上の制限

HPACK の実装は整数のための巨大な値、整数や長い文字列 リテラルのための長いエンコーディングがセキュリティの弱点を 生まないことを確実にすることが必要です。

実装はエンコードされた長さ (Section 5.1 を参照)と 同様、整数として受け入れる値を制限しなければ なりません。同様に、文字列リテラル(Section 5.2 を参照) として受け入れる長さを制限しなければなりません。

8. 謝辞

この仕様は下記の個人から得た有益な情報を含んでいます:

9. 参考文献

9.1 引用文献

[HTTP2]Belshe, M., Peon, R., and M. Thomson, Ed., “Hypertext Transfer Protocol version 2”, Internet-Draft draft-ietf-httpbis-http2-16 (work in progress), October 2014.
[RFC2119]Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, BCP 14, RFC 2119, March 1997.
[RFC7230]Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing”, RFC 7230, June 2014.

9.2 参考文献

[CANONICAL]Schwartz, E. and B. Kallick, “Generating a canonical prefix encoding”, Communications of the ACM Volume 7 Issue 3, pp. 166-169, March 1964, <https://dl.acm.org/citation.cfm?id=363991>.
[CRIME]Rizzo, J. and T. Duong, “The CRIME Attack”, September 2012, <https://docs.google.com/a/twist.com/presentation/d/11eBmGiHbYcHR9gL5nDyZChu_-lCa2GizeuOfaLU2HOU/edit#slide=id.g1eb6c1b5_3_6>.
[DEFLATE]Deutsch, P., “DEFLATE Compressed Data Format Specification version 1.3”, RFC 1951, May 1996.
[HUFFMAN]Huffman, D., “A Method for the Construction of Minimum Redundancy Codes”, Proceedings of the Institute of Radio Engineers Volume 40, Number 9, pp. 1098-1101, September 1952, <https://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=4051119>.
[ORIGIN]Barth, A., “The Web Origin Concept”, RFC 6454, December 2011.
[PETAL]Tan, J. and J. Nahata, “PETAL: Preset Encoding Table Information Leakage”, April 2013, <http://www.pdl.cmu.edu/PDL-FTP/associated/CMU-PDL-13-106.pdf>.
[SPDY]Belshe, M. and R. Peon, “SPDY Protocol”, Internet-Draft draft-mbelshe-httpbis-spdy-00 (work in progress), February 2012.

A. 静的テーブル定義

静的テーブル (Section 2.3.1 を参照) は 予め定義されており変更不可能なヘッダフィールドのリストで 構成されます。

静的テーブルは HTTP/2 コネクション内で交換されるメッセージとして 有効な、最も共通して使用されるヘッダフィールドをリスト化することで 作成されました。少数のヘッダフィールドの値は頻繁に使用される値として エントリに追加されています。その他のヘッダフィールドは、空の値で 追加されています。

下記のテーブルは静的テーブルを構成する予め定義されたヘッダ フィールドを列挙しています。

Table 1: 静的テーブルエントリ
インデックスヘッダ名ヘッダ値
1:authority
2:methodGET
3:methodPOST
4:path/
5:path/index.html
6:schemehttp
7:schemehttps
8:status200
9:status204
10:status206
11:status304
12:status400
13:status404
14:status500
15accept-charset
16accept-encodinggzip, deflate
17accept-language
18accept-ranges
19accept
20access-control-allow-origin
21age
22allow
23authorization
24cache-control
25content-disposition
26content-encoding
27content-language
28content-length
29content-location
30content-range
31content-type
32cookie
33date
34etag
35expect
36expires
37from
38host
39if-match
40if-modified-since
41if-none-match
42if-range
43if-unmodified-since
44last-modified
45link
46location
47max-forwards
48proxy-authenticate
49proxy-authorization
50range
51referer
52refresh
53retry-after
54server
55set-cookie
56strict-transport-security
57transfer-encoding
58user-agent
59vary
60via
61www-authenticate

Table 1 は静的テーブル内の 各エントリのインデックスを与えます。

B. ハフマン符号

下記のハフマン符号はハフマン符号化を伴う文字列リテラルの エンコーディング時に使用されます(Section 5.2 を参照)。

このハフマン符号は HTTP ヘッダの多くのサンプルで得られた 統計から生成されました。これはユニークなコード長を持つシンボルが 無いことを確実にするよう幾つかの微調整を行ったカノニカルハフマン 符号 ([CANONICAL] を参照) です。

テーブルの各行はシンボルを表現するのに使用されるコードを定義します:

sym:
表現されるシンボル。オクテットの 10 進数値です。可能で あればアスキー表現でも表記しています。特別なシンボル "EOS" は文字列リテラルの終わりを示すのに使用されます。
code as bits:
2 進数で表現されたシンボルのハフマンコード。 最上位ビット (MSB) で調整されています。
code as hex:
16 進数で表現されたシンボルのハフマンコード。 最下位ビット (LSB) で調整されています。
len:
シンボルを表現するコードのビット数。

例として、シンボル 47 (アスキー文字 "/" に対応します) のコードは 6 ビット "0", "1", "1", "0", "0", "0" から構成されます。 これは 6 ビットでエンコードされた値 0x18 (16 進数で) に対応します。

                                                     code
                       code as bits                 as hex   len
     sym              aligned to MSB                aligned   in
                                                    to LSB   bits
    (  0)  |11111111|11000                             1ff8  [13]
    (  1)  |11111111|11111111|1011000                7fffd8  [23]
    (  2)  |11111111|11111111|11111110|0010         fffffe2  [28]
    (  3)  |11111111|11111111|11111110|0011         fffffe3  [28]
    (  4)  |11111111|11111111|11111110|0100         fffffe4  [28]
    (  5)  |11111111|11111111|11111110|0101         fffffe5  [28]
    (  6)  |11111111|11111111|11111110|0110         fffffe6  [28]
    (  7)  |11111111|11111111|11111110|0111         fffffe7  [28]
    (  8)  |11111111|11111111|11111110|1000         fffffe8  [28]
    (  9)  |11111111|11111111|11101010               ffffea  [24]
    ( 10)  |11111111|11111111|11111111|111100      3ffffffc  [30]
    ( 11)  |11111111|11111111|11111110|1001         fffffe9  [28]
    ( 12)  |11111111|11111111|11111110|1010         fffffea  [28]
    ( 13)  |11111111|11111111|11111111|111101      3ffffffd  [30]
    ( 14)  |11111111|11111111|11111110|1011         fffffeb  [28]
    ( 15)  |11111111|11111111|11111110|1100         fffffec  [28]
    ( 16)  |11111111|11111111|11111110|1101         fffffed  [28]
    ( 17)  |11111111|11111111|11111110|1110         fffffee  [28]
    ( 18)  |11111111|11111111|11111110|1111         fffffef  [28]
    ( 19)  |11111111|11111111|11111111|0000         ffffff0  [28]
    ( 20)  |11111111|11111111|11111111|0001         ffffff1  [28]
    ( 21)  |11111111|11111111|11111111|0010         ffffff2  [28]
    ( 22)  |11111111|11111111|11111111|111110      3ffffffe  [30]
    ( 23)  |11111111|11111111|11111111|0011         ffffff3  [28]
    ( 24)  |11111111|11111111|11111111|0100         ffffff4  [28]
    ( 25)  |11111111|11111111|11111111|0101         ffffff5  [28]
    ( 26)  |11111111|11111111|11111111|0110         ffffff6  [28]
    ( 27)  |11111111|11111111|11111111|0111         ffffff7  [28]
    ( 28)  |11111111|11111111|11111111|1000         ffffff8  [28]
    ( 29)  |11111111|11111111|11111111|1001         ffffff9  [28]
    ( 30)  |11111111|11111111|11111111|1010         ffffffa  [28]
    ( 31)  |11111111|11111111|11111111|1011         ffffffb  [28]
' ' ( 32)  |010100                                       14  [ 6]
'!' ( 33)  |11111110|00                                 3f8  [10]
'"' ( 34)  |11111110|01                                 3f9  [10]
'#' ( 35)  |11111111|1010                               ffa  [12]
'$' ( 36)  |11111111|11001                             1ff9  [13]
'%' ( 37)  |010101                                       15  [ 6]
'&' ( 38)  |11111000                                     f8  [ 8]
''' ( 39)  |11111111|010                                7fa  [11]
'(' ( 40)  |11111110|10                                 3fa  [10]
')' ( 41)  |11111110|11                                 3fb  [10]
'*' ( 42)  |11111001                                     f9  [ 8]
'+' ( 43)  |11111111|011                                7fb  [11]
',' ( 44)  |11111010                                     fa  [ 8]
'-' ( 45)  |010110                                       16  [ 6]
'.' ( 46)  |010111                                       17  [ 6]
'/' ( 47)  |011000                                       18  [ 6]
'0' ( 48)  |00000                                         0  [ 5]
'1' ( 49)  |00001                                         1  [ 5]
'2' ( 50)  |00010                                         2  [ 5]
'3' ( 51)  |011001                                       19  [ 6]
'4' ( 52)  |011010                                       1a  [ 6]
'5' ( 53)  |011011                                       1b  [ 6]
'6' ( 54)  |011100                                       1c  [ 6]
'7' ( 55)  |011101                                       1d  [ 6]
'8' ( 56)  |011110                                       1e  [ 6]
'9' ( 57)  |011111                                       1f  [ 6]
':' ( 58)  |1011100                                      5c  [ 7]
';' ( 59)  |11111011                                     fb  [ 8]
'<' ( 60)  |11111111|1111100                           7ffc  [15]
'=' ( 61)  |100000                                       20  [ 6]
'>' ( 62)  |11111111|1011                               ffb  [12]
'?' ( 63)  |11111111|00                                 3fc  [10]
'@' ( 64)  |11111111|11010                             1ffa  [13]
'A' ( 65)  |100001                                       21  [ 6]
'B' ( 66)  |1011101                                      5d  [ 7]
'C' ( 67)  |1011110                                      5e  [ 7]
'D' ( 68)  |1011111                                      5f  [ 7]
'E' ( 69)  |1100000                                      60  [ 7]
'F' ( 70)  |1100001                                      61  [ 7]
'G' ( 71)  |1100010                                      62  [ 7]
'H' ( 72)  |1100011                                      63  [ 7]
'I' ( 73)  |1100100                                      64  [ 7]
'J' ( 74)  |1100101                                      65  [ 7]
'K' ( 75)  |1100110                                      66  [ 7]
'L' ( 76)  |1100111                                      67  [ 7]
'M' ( 77)  |1101000                                      68  [ 7]
'N' ( 78)  |1101001                                      69  [ 7]
'O' ( 79)  |1101010                                      6a  [ 7]
'P' ( 80)  |1101011                                      6b  [ 7]
'Q' ( 81)  |1101100                                      6c  [ 7]
'R' ( 82)  |1101101                                      6d  [ 7]
'S' ( 83)  |1101110                                      6e  [ 7]
'T' ( 84)  |1101111                                      6f  [ 7]
'U' ( 85)  |1110000                                      70  [ 7]
'V' ( 86)  |1110001                                      71  [ 7]
'W' ( 87)  |1110010                                      72  [ 7]
'X' ( 88)  |11111100                                     fc  [ 8]
'Y' ( 89)  |1110011                                      73  [ 7]
'Z' ( 90)  |11111101                                     fd  [ 8]
'[' ( 91)  |11111111|11011                             1ffb  [13]
'\' ( 92)  |11111111|11111110|000                     7fff0  [19]
']' ( 93)  |11111111|11100                             1ffc  [13]
'^' ( 94)  |11111111|111100                            3ffc  [14]
'_' ( 95)  |100010                                       22  [ 6]
'`' ( 96)  |11111111|1111101                           7ffd  [15]
'a' ( 97)  |00011                                         3  [ 5]
'b' ( 98)  |100011                                       23  [ 6]
'c' ( 99)  |00100                                         4  [ 5]
'd' (100)  |100100                                       24  [ 6]
'e' (101)  |00101                                         5  [ 5]
'f' (102)  |100101                                       25  [ 6]
'g' (103)  |100110                                       26  [ 6]
'h' (104)  |100111                                       27  [ 6]
'i' (105)  |00110                                         6  [ 5]
'j' (106)  |1110100                                      74  [ 7]
'k' (107)  |1110101                                      75  [ 7]
'l' (108)  |101000                                       28  [ 6]
'm' (109)  |101001                                       29  [ 6]
'n' (110)  |101010                                       2a  [ 6]
'o' (111)  |00111                                         7  [ 5]
'p' (112)  |101011                                       2b  [ 6]
'q' (113)  |1110110                                      76  [ 7]
'r' (114)  |101100                                       2c  [ 6]
's' (115)  |01000                                         8  [ 5]
't' (116)  |01001                                         9  [ 5]
'u' (117)  |101101                                       2d  [ 6]
'v' (118)  |1110111                                      77  [ 7]
'w' (119)  |1111000                                      78  [ 7]
'x' (120)  |1111001                                      79  [ 7]
'y' (121)  |1111010                                      7a  [ 7]
'z' (122)  |1111011                                      7b  [ 7]
'{' (123)  |11111111|1111110                           7ffe  [15]
'|' (124)  |11111111|100                                7fc  [11]
'}' (125)  |11111111|111101                            3ffd  [14]
'~' (126)  |11111111|11101                             1ffd  [13]
    (127)  |11111111|11111111|11111111|1100         ffffffc  [28]
    (128)  |11111111|11111110|0110                    fffe6  [20]
    (129)  |11111111|11111111|010010                 3fffd2  [22]
    (130)  |11111111|11111110|0111                    fffe7  [20]
    (131)  |11111111|11111110|1000                    fffe8  [20]
    (132)  |11111111|11111111|010011                 3fffd3  [22]
    (133)  |11111111|11111111|010100                 3fffd4  [22]
    (134)  |11111111|11111111|010101                 3fffd5  [22]
    (135)  |11111111|11111111|1011001                7fffd9  [23]
    (136)  |11111111|11111111|010110                 3fffd6  [22]
    (137)  |11111111|11111111|1011010                7fffda  [23]
    (138)  |11111111|11111111|1011011                7fffdb  [23]
    (139)  |11111111|11111111|1011100                7fffdc  [23]
    (140)  |11111111|11111111|1011101                7fffdd  [23]
    (141)  |11111111|11111111|1011110                7fffde  [23]
    (142)  |11111111|11111111|11101011               ffffeb  [24]
    (143)  |11111111|11111111|1011111                7fffdf  [23]
    (144)  |11111111|11111111|11101100               ffffec  [24]
    (145)  |11111111|11111111|11101101               ffffed  [24]
    (146)  |11111111|11111111|010111                 3fffd7  [22]
    (147)  |11111111|11111111|1100000                7fffe0  [23]
    (148)  |11111111|11111111|11101110               ffffee  [24]
    (149)  |11111111|11111111|1100001                7fffe1  [23]
    (150)  |11111111|11111111|1100010                7fffe2  [23]
    (151)  |11111111|11111111|1100011                7fffe3  [23]
    (152)  |11111111|11111111|1100100                7fffe4  [23]
    (153)  |11111111|11111110|11100                  1fffdc  [21]
    (154)  |11111111|11111111|011000                 3fffd8  [22]
    (155)  |11111111|11111111|1100101                7fffe5  [23]
    (156)  |11111111|11111111|011001                 3fffd9  [22]
    (157)  |11111111|11111111|1100110                7fffe6  [23]
    (158)  |11111111|11111111|1100111                7fffe7  [23]
    (159)  |11111111|11111111|11101111               ffffef  [24]
    (160)  |11111111|11111111|011010                 3fffda  [22]
    (161)  |11111111|11111110|11101                  1fffdd  [21]
    (162)  |11111111|11111110|1001                    fffe9  [20]
    (163)  |11111111|11111111|011011                 3fffdb  [22]
    (164)  |11111111|11111111|011100                 3fffdc  [22]
    (165)  |11111111|11111111|1101000                7fffe8  [23]
    (166)  |11111111|11111111|1101001                7fffe9  [23]
    (167)  |11111111|11111110|11110                  1fffde  [21]
    (168)  |11111111|11111111|1101010                7fffea  [23]
    (169)  |11111111|11111111|011101                 3fffdd  [22]
    (170)  |11111111|11111111|011110                 3fffde  [22]
    (171)  |11111111|11111111|11110000               fffff0  [24]
    (172)  |11111111|11111110|11111                  1fffdf  [21]
    (173)  |11111111|11111111|011111                 3fffdf  [22]
    (174)  |11111111|11111111|1101011                7fffeb  [23]
    (175)  |11111111|11111111|1101100                7fffec  [23]
    (176)  |11111111|11111111|00000                  1fffe0  [21]
    (177)  |11111111|11111111|00001                  1fffe1  [21]
    (178)  |11111111|11111111|100000                 3fffe0  [22]
    (179)  |11111111|11111111|00010                  1fffe2  [21]
    (180)  |11111111|11111111|1101101                7fffed  [23]
    (181)  |11111111|11111111|100001                 3fffe1  [22]
    (182)  |11111111|11111111|1101110                7fffee  [23]
    (183)  |11111111|11111111|1101111                7fffef  [23]
    (184)  |11111111|11111110|1010                    fffea  [20]
    (185)  |11111111|11111111|100010                 3fffe2  [22]
    (186)  |11111111|11111111|100011                 3fffe3  [22]
    (187)  |11111111|11111111|100100                 3fffe4  [22]
    (188)  |11111111|11111111|1110000                7ffff0  [23]
    (189)  |11111111|11111111|100101                 3fffe5  [22]
    (190)  |11111111|11111111|100110                 3fffe6  [22]
    (191)  |11111111|11111111|1110001                7ffff1  [23]
    (192)  |11111111|11111111|11111000|00           3ffffe0  [26]
    (193)  |11111111|11111111|11111000|01           3ffffe1  [26]
    (194)  |11111111|11111110|1011                    fffeb  [20]
    (195)  |11111111|11111110|001                     7fff1  [19]
    (196)  |11111111|11111111|100111                 3fffe7  [22]
    (197)  |11111111|11111111|1110010                7ffff2  [23]
    (198)  |11111111|11111111|101000                 3fffe8  [22]
    (199)  |11111111|11111111|11110110|0            1ffffec  [25]
    (200)  |11111111|11111111|11111000|10           3ffffe2  [26]
    (201)  |11111111|11111111|11111000|11           3ffffe3  [26]
    (202)  |11111111|11111111|11111001|00           3ffffe4  [26]
    (203)  |11111111|11111111|11111011|110          7ffffde  [27]
    (204)  |11111111|11111111|11111011|111          7ffffdf  [27]
    (205)  |11111111|11111111|11111001|01           3ffffe5  [26]
    (206)  |11111111|11111111|11110001               fffff1  [24]
    (207)  |11111111|11111111|11110110|1            1ffffed  [25]
    (208)  |11111111|11111110|010                     7fff2  [19]
    (209)  |11111111|11111111|00011                  1fffe3  [21]
    (210)  |11111111|11111111|11111001|10           3ffffe6  [26]
    (211)  |11111111|11111111|11111100|000          7ffffe0  [27]
    (212)  |11111111|11111111|11111100|001          7ffffe1  [27]
    (213)  |11111111|11111111|11111001|11           3ffffe7  [26]
    (214)  |11111111|11111111|11111100|010          7ffffe2  [27]
    (215)  |11111111|11111111|11110010               fffff2  [24]
    (216)  |11111111|11111111|00100                  1fffe4  [21]
    (217)  |11111111|11111111|00101                  1fffe5  [21]
    (218)  |11111111|11111111|11111010|00           3ffffe8  [26]
    (219)  |11111111|11111111|11111010|01           3ffffe9  [26]
    (220)  |11111111|11111111|11111111|1101         ffffffd  [28]
    (221)  |11111111|11111111|11111100|011          7ffffe3  [27]
    (222)  |11111111|11111111|11111100|100          7ffffe4  [27]
    (223)  |11111111|11111111|11111100|101          7ffffe5  [27]
    (224)  |11111111|11111110|1100                    fffec  [20]
    (225)  |11111111|11111111|11110011               fffff3  [24]
    (226)  |11111111|11111110|1101                    fffed  [20]
    (227)  |11111111|11111111|00110                  1fffe6  [21]
    (228)  |11111111|11111111|101001                 3fffe9  [22]
    (229)  |11111111|11111111|00111                  1fffe7  [21]
    (230)  |11111111|11111111|01000                  1fffe8  [21]
    (231)  |11111111|11111111|1110011                7ffff3  [23]
    (232)  |11111111|11111111|101010                 3fffea  [22]
    (233)  |11111111|11111111|101011                 3fffeb  [22]
    (234)  |11111111|11111111|11110111|0            1ffffee  [25]
    (235)  |11111111|11111111|11110111|1            1ffffef  [25]
    (236)  |11111111|11111111|11110100               fffff4  [24]
    (237)  |11111111|11111111|11110101               fffff5  [24]
    (238)  |11111111|11111111|11111010|10           3ffffea  [26]
    (239)  |11111111|11111111|1110100                7ffff4  [23]
    (240)  |11111111|11111111|11111010|11           3ffffeb  [26]
    (241)  |11111111|11111111|11111100|110          7ffffe6  [27]
    (242)  |11111111|11111111|11111011|00           3ffffec  [26]
    (243)  |11111111|11111111|11111011|01           3ffffed  [26]
    (244)  |11111111|11111111|11111100|111          7ffffe7  [27]
    (245)  |11111111|11111111|11111101|000          7ffffe8  [27]
    (246)  |11111111|11111111|11111101|001          7ffffe9  [27]
    (247)  |11111111|11111111|11111101|010          7ffffea  [27]
    (248)  |11111111|11111111|11111101|011          7ffffeb  [27]
    (249)  |11111111|11111111|11111111|1110         ffffffe  [28]
    (250)  |11111111|11111111|11111101|100          7ffffec  [27]
    (251)  |11111111|11111111|11111101|101          7ffffed  [27]
    (252)  |11111111|11111111|11111101|110          7ffffee  [27]
    (253)  |11111111|11111111|11111101|111          7ffffef  [27]
    (254)  |11111111|11111111|11111110|000          7fffff0  [27]
    (255)  |11111111|11111111|11111011|10           3ffffee  [26]
EOS (256)  |11111111|11111111|11111111|111111      3fffffff  [30]

C. 

リクエストとレスポンス両方の、ハフマン符号化を伴う場合と 伴わない場合の、整数、ヘッダフィールド表現そしてヘッダ フィールドのリストのすべてのエンコーディングを含む 数多くの例があります。

C.1 整数表現の例

この節では (Section 5.1 を 参照) に詳細がある整数値の表現の例を記述します。

C.1.1 例 1: 5 ビットプレフィックスを用いた 10 のエンコーディング

値 10 は 5 ビットプレフィックスでエンコードされます。

  • 10 は 31 (25 - 1) より小いので 5 ビットプレフィックスを用いて表現されます。
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| X | X | X | 0 | 1 | 0 | 1 | 0 |   10 stored on 5 bits
+---+---+---+---+---+---+---+---+

C.1.2 例 2: 5 ビットプレフィックスを用いた 1337 のエンコーディング

値 I=1337 は 5 ビットプレフィックスでエンコードされます。

  • 1337 は 31 (25 - 1) より大きい。
    • 5 ビットプレフィックスは 最大値(31) で 満たされます。
  • I = 1337 - (25 - 1) = 1306.
    • I (1306) は 128 以上で、 while ループ本体が実行します:
      • I % 128 == 26
      • 26 + 128 == 154
      • 154 は 7 ビットでエンコードされます: 10011010
      • I に 10 がセットされます (1306 / 128 == 10)
      • I は 128 より大きくなく、 while ループは終了します。
    • 10 になった I は 8 ビットでエンコードされます: 00001010.
  • 処理終了。
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| X | X | X | 1 | 1 | 1 | 1 | 1 |  Prefix = 31, I = 1306
| 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |  1306>=128, encode(154), I=1306/128
| 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |  10<128, encode(10), done
+---+---+---+---+---+---+---+---+

C.1.3 例 3: オクテット境界で開始する 42 のエンコーディング

値 42 はオクテット境界から開始しエンコードされます。 これは 8 ビットプレフィックスが使用されることを示します。

  • 42 は 255 (28 - 1) 以下であり 8 ビットプレフィックスを用いて表現されます。
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |   42 stored on 8 bits
+---+---+---+---+---+---+---+---+

C.2 ヘッダフィールド表現の例

この節では幾つかの個々の表現の例を掲載します。

C.2.1 インデックスを伴うリテラルヘッダフィールド

ヘッダフィールド表現はリテラル名とリテラル値を使用します。 ヘッダフィールドは動的テーブルに追加されます。

エンコードするヘッダリスト:

custom-key: custom-header

エンコードされたデータの 16 進数ダンプ:

400a 6375 7374 6f6d 2d6b 6579 0d63 7573 | @.custom-key.cus
746f 6d2d 6865 6164 6572                | tom-header

デコード処理:

40                                      | == Literal indexed ==
0a                                      |   Literal name (len = 10)
6375 7374 6f6d 2d6b 6579                | custom-key
0d                                      |   Literal value (len = 13)
6375 7374 6f6d 2d68 6561 6465 72        | custom-header
                                        | -> custom-key: custom-head\
                                        |   er

動的テーブル (デコード後):

[  1] (s =  55) custom-key: custom-header
      Table size:  55

デコードされたヘッダリスト:

custom-key: custom-header

C.2.2 インデックスを伴わないリテラルヘッダフィールド

ヘッダフィールド表現はリテラル名とリテラル値を使用します。 ヘッダフィールドは動的テーブルに追加されません。

エンコードするヘッダリスト:

:path: /sample/path

エンコードされたデータの 16 進数ダンプ:

040c 2f73 616d 706c 652f 7061 7468      | ../sample/path

デコード処理:

04                                      | == Literal not indexed ==
                                        |   Indexed name (idx = 4)
                                        |     :path
0c                                      |   Literal value (len = 12)
2f73 616d 706c 652f 7061 7468           | /sample/path
                                        | -> :path: /sample/path

動的テーブル (デコード後): 空

デコードされたヘッダリスト:

:path: /sample/path

C.2.3 インデックスされないリテラルヘッダフィールド

ヘッダフィールド表現はリテラル名とリテラル値を使用します。 ヘッダフィールドは動的テーブルに追加されず、中継者に 再エンコードされる場合同じ表現を使わなければなりません。

エンコードするヘッダリスト:

password: secret

エンコードされたデータの 16 進数ダンプ:

1008 7061 7373 776f 7264 0673 6563 7265 | ..password.secre
74                                      | t

デコード処理:

10                                      | == Literal never indexed ==
08                                      |   Literal name (len = 8)
7061 7373 776f 7264                     | password
06                                      |   Literal value (len = 6)
7365 6372 6574                          | secret
                                        | -> password: secret

動的テーブル (デコード後): 空

デコードされたヘッダリスト:

password: secret

C.2.4 インデックスヘッダフィールド

このヘッダフィールド表現は静的テーブルにインデックスされたヘッダ フィールドを使用します。

エンコードするヘッダリスト:

:method: GET

エンコードされたデータの 16 進ダンプ:

82                                      | .

デコード処理:

82                                      | == Indexed - Add ==
                                        |   idx = 2
                                        | -> :method: GET

動的テーブル (デコード後): 空

デコードされたヘッダリスト:

:method: GET

C.3 ハフマン符号化を伴わないリクエストの例

この節は同じコネクションにおける HTTP リクエストに対応した 幾つかの連続したヘッダリストを示します。

C.3.1 一個目のリクエスト

エンコードするヘッダリスト:

:method: GET
:scheme: http
:path: /
:authority: www.example.com

エンコードされたデータの 16 進数ダンプ:

8286 8441 0f77 7777 2e65 7861 6d70 6c65 | ...A.www.example
2e63 6f6d                               | .com

デコード処理:

82                                      | == Indexed - Add ==
                                        |   idx = 2
                                        | -> :method: GET
86                                      | == Indexed - Add ==
                                        |   idx = 6
                                        | -> :scheme: http
84                                      | == Indexed - Add ==
                                        |   idx = 4
                                        | -> :path: /
41                                      | == Literal indexed ==
                                        |   Indexed name (idx = 1)
                                        |     :authority
0f                                      |   Literal value (len = 15)
7777 772e 6578 616d 706c 652e 636f 6d   | www.example.com
                                        | -> :authority: www.example\
                                        |   .com

動的テーブル (デコード後):

[  1] (s =  57) :authority: www.example.com
      Table size:  57

デコードされたヘッダリスト:

:method: GET
:scheme: http
:path: /
:authority: www.example.com

C.3.2 二個目のリクエスト

エンコードするヘッダリスト:

:method: GET
:scheme: http
:path: /
:authority: www.example.com
cache-control: no-cache

エンコードされたデータの 16 進数ダンプ:

8286 84be 5808 6e6f 2d63 6163 6865      | ....X.no-cache

デコード処理:

82                                      | == Indexed - Add ==
                                        |   idx = 2
                                        | -> :method: GET
86                                      | == Indexed - Add ==
                                        |   idx = 6
                                        | -> :scheme: http
84                                      | == Indexed - Add ==
                                        |   idx = 4
                                        | -> :path: /
be                                      | == Indexed - Add ==
                                        |   idx = 62
                                        | -> :authority: www.example\
                                        |   .com
58                                      | == Literal indexed ==
                                        |   Indexed name (idx = 24)
                                        |     cache-control
08                                      |   Literal value (len = 8)
6e6f 2d63 6163 6865                     | no-cache
                                        | -> cache-control: no-cache

動的テーブル (デコード後):

[  1] (s =  53) cache-control: no-cache
[  2] (s =  57) :authority: www.example.com
      Table size: 110

デコードされたヘッダリスト:

:method: GET
:scheme: http
:path: /
:authority: www.example.com
cache-control: no-cache

C.3.3 三個目のリクエスト

エンコードするヘッダリスト:

:method: GET
:scheme: https
:path: /index.html
:authority: www.example.com
custom-key: custom-value

エンコードされたデータの 16 進数ダンプ:

8287 85bf 400a 6375 7374 6f6d 2d6b 6579 | ....@.custom-key
0c63 7573 746f 6d2d 7661 6c75 65        | .custom-value

デコード処理:

82                                      | == Indexed - Add ==
                                        |   idx = 2
                                        | -> :method: GET
87                                      | == Indexed - Add ==
                                        |   idx = 7
                                        | -> :scheme: https
85                                      | == Indexed - Add ==
                                        |   idx = 5
                                        | -> :path: /index.html
bf                                      | == Indexed - Add ==
                                        |   idx = 63
                                        | -> :authority: www.example\
                                        |   .com
40                                      | == Literal indexed ==
0a                                      |   Literal name (len = 10)
6375 7374 6f6d 2d6b 6579                | custom-key
0c                                      |   Literal value (len = 12)
6375 7374 6f6d 2d76 616c 7565           | custom-value
                                        | -> custom-key: custom-valu\
                                        |   e

動的テーブル (デコード後):

[  1] (s =  54) custom-key: custom-value
[  2] (s =  53) cache-control: no-cache
[  3] (s =  57) :authority: www.example.com
      Table size: 164

デコードされたヘッダリスト:

:method: GET
:scheme: https
:path: /index.html
:authority: www.example.com
custom-key: custom-value

C.4 ハフマン符号化を伴うリクエストの例

この節では前節と同じ例を示しますが、リテラル値にハフマン符号化を 行います。

C.4.1 一個目のリクエスト

エンコードするヘッダリスト:

:method: GET
:scheme: http
:path: /
:authority: www.example.com

エンコードされたデータの 16 進数ダンプ:

8286 8441 8cf1 e3c2 e5f2 3a6b a0ab 90f4 | ...A......:k....
ff                                      | .

デコード処理:

82                                      | == Indexed - Add ==
                                        |   idx = 2
                                        | -> :method: GET
86                                      | == Indexed - Add ==
                                        |   idx = 6
                                        | -> :scheme: http
84                                      | == Indexed - Add ==
                                        |   idx = 4
                                        | -> :path: /
41                                      | == Literal indexed ==
                                        |   Indexed name (idx = 1)
                                        |     :authority
8c                                      |   Literal value (len = 12)
                                        |     Huffman encoded:
f1e3 c2e5 f23a 6ba0 ab90 f4ff           | .....:k.....
                                        |     Decoded:
                                        | www.example.com
                                        | -> :authority: www.example\
                                        |   .com

動的テーブル (デコード後):

[  1] (s =  57) :authority: www.example.com
      Table size:  57

デコードされたヘッダリスト:

:method: GET
:scheme: http
:path: /
:authority: www.example.com

C.4.2 二個目のリクエスト

エンコードするヘッダリスト:

:method: GET
:scheme: http
:path: /
:authority: www.example.com
cache-control: no-cache

エンコードされたデータの 16 進数ダンプ:

8286 84be 5886 a8eb 1064 9cbf           | ....X....d..

デコード処理:

82                                      | == Indexed - Add ==
                                        |   idx = 2
                                        | -> :method: GET
86                                      | == Indexed - Add ==
                                        |   idx = 6
                                        | -> :scheme: http
84                                      | == Indexed - Add ==
                                        |   idx = 4
                                        | -> :path: /
be                                      | == Indexed - Add ==
                                        |   idx = 62
                                        | -> :authority: www.example\
                                        |   .com
58                                      | == Literal indexed ==
                                        |   Indexed name (idx = 24)
                                        |     cache-control
86                                      |   Literal value (len = 6)
                                        |     Huffman encoded:
a8eb 1064 9cbf                          | ...d..
                                        |     Decoded:
                                        | no-cache
                                        | -> cache-control: no-cache

動的テーブル (デコード後):

[  1] (s =  53) cache-control: no-cache
[  2] (s =  57) :authority: www.example.com
      Table size: 110

デコードされたヘッダリスト:

:method: GET
:scheme: http
:path: /
:authority: www.example.com
cache-control: no-cache

C.4.3 三個目のリクエスト

エンコードするヘッダリスト:

:method: GET
:scheme: https
:path: /index.html
:authority: www.example.com
custom-key: custom-value

エンコードされたデータの 16 進数ダンプ:

8287 85bf 4088 25a8 49e9 5ba9 7d7f 8925 | ....@.%.I.[.}..%
a849 e95b b8e8 b4bf                     | .I.[....

デコード処理:

82                                      | == Indexed - Add ==
                                        |   idx = 2
                                        | -> :method: GET
87                                      | == Indexed - Add ==
                                        |   idx = 7
                                        | -> :scheme: https
85                                      | == Indexed - Add ==
                                        |   idx = 5
                                        | -> :path: /index.html
bf                                      | == Indexed - Add ==
                                        |   idx = 63
                                        | -> :authority: www.example\
                                        |   .com
40                                      | == Literal indexed ==
88                                      |   Literal name (len = 8)
                                        |     Huffman encoded:
25a8 49e9 5ba9 7d7f                     | %.I.[.}.
                                        |     Decoded:
                                        | custom-key
89                                      |   Literal value (len = 9)
                                        |     Huffman encoded:
25a8 49e9 5bb8 e8b4 bf                  | %.I.[....
                                        |     Decoded:
                                        | custom-value
                                        | -> custom-key: custom-valu\
                                        |   e

動的テーブル (デコード後):

[  1] (s =  54) custom-key: custom-value
[  2] (s =  53) cache-control: no-cache
[  3] (s =  57) :authority: www.example.com
      Table size: 164

デコードされたヘッダリスト:

:method: GET
:scheme: https
:path: /index.html
:authority: www.example.com
custom-key: custom-value

C.5 ハフマン符号化を伴わないレスポンスの例

この節は同じコネクションにおける HTTP レスポンスに対応した 幾つかの連続したヘッダリストを示します。 HTTP/2 設定パラメータ SETTINGS_HEADER_TABLE_SIZE は幾つかの削除を起こすため、 256 オクテットの値で設定されています。

C.5.1 一個目のレスポンス

エンコードするヘッダリスト:

:status: 302
cache-control: private
date: Mon, 21 Oct 2013 20:13:21 GMT
location: https://www.example.com

エンコードされたデータの 16 進数ダンプ:

4803 3330 3258 0770 7269 7661 7465 611d | H.302X.privatea.
4d6f 6e2c 2032 3120 4f63 7420 3230 3133 | Mon, 21 Oct 2013
2032 303a 3133 3a32 3120 474d 546e 1768 |  20:13:21 GMTn.h
7474 7073 3a2f 2f77 7777 2e65 7861 6d70 | ttps://www.examp
6c65 2e63 6f6d                          | le.com

デコード処理:

48                                      | == Literal indexed ==
                                        |   Indexed name (idx = 8)
                                        |     :status
03                                      |   Literal value (len = 3)
3330 32                                 | 302
                                        | -> :status: 302
58                                      | == Literal indexed ==
                                        |   Indexed name (idx = 24)
                                        |     cache-control
07                                      |   Literal value (len = 7)
7072 6976 6174 65                       | private
                                        | -> cache-control: private
61                                      | == Literal indexed ==
                                        |   Indexed name (idx = 33)
                                        |     date
1d                                      |   Literal value (len = 29)
4d6f 6e2c 2032 3120 4f63 7420 3230 3133 | Mon, 21 Oct 2013
2032 303a 3133 3a32 3120 474d 54        |  20:13:21 GMT
                                        | -> date: Mon, 21 Oct 2013 \
                                        |   20:13:21 GMT
6e                                      | == Literal indexed ==
                                        |   Indexed name (idx = 46)
                                        |     location
17                                      |   Literal value (len = 23)
6874 7470 733a 2f2f 7777 772e 6578 616d | https://www.exam
706c 652e 636f 6d                       | ple.com
                                        | -> location: https://www.e\
                                        |   xample.com

動的テーブル (デコード後):

[  1] (s =  63) location: https://www.example.com
[  2] (s =  65) date: Mon, 21 Oct 2013 20:13:21 GMT
[  3] (s =  52) cache-control: private
[  4] (s =  42) :status: 302
      Table size: 222

デコードされたヘッダリスト:

:status: 302
cache-control: private
date: Mon, 21 Oct 2013 20:13:21 GMT
location: https://www.example.com

C.5.2 二個目のレスポンス

(":status", "307") ヘッダフィールドの追加を行える領域を解放するため (":status", "302") ヘッダフィールドは動的テーブルから削除されます。

エンコードするヘッダリスト:

:status: 307
cache-control: private
date: Mon, 21 Oct 2013 20:13:21 GMT
location: https://www.example.com

エンコードされたデータの 16 進数ダンプ:

4803 3330 37c1 c0bf                     | H.307...

デコード処理:

48                                      | == Literal indexed ==
                                        |   Indexed name (idx = 8)
                                        |     :status
03                                      |   Literal value (len = 3)
3330 37                                 | 307
                                        | - evict: :status: 302
                                        | -> :status: 307
c1                                      | == Indexed - Add ==
                                        |   idx = 65
                                        | -> cache-control: private
c0                                      | == Indexed - Add ==
                                        |   idx = 64
                                        | -> date: Mon, 21 Oct 2013 \
                                        |   20:13:21 GMT
bf                                      | == Indexed - Add ==
                                        |   idx = 63
                                        | -> location: https://www.e\
                                        |   xample.com

動的テーブル (デコード後):

[  1] (s =  42) :status: 307
[  2] (s =  63) location: https://www.example.com
[  3] (s =  65) date: Mon, 21 Oct 2013 20:13:21 GMT
[  4] (s =  52) cache-control: private
      Table size: 222

デコードされたヘッダリスト:

:status: 307
cache-control: private
date: Mon, 21 Oct 2013 20:13:21 GMT
location: https://www.example.com

C.5.3 三個目のレスポンス

このヘッダリストの処理中幾つかのヘッダフィールドが動的テーブルから 削除されます。

エンコードするヘッダリスト:

:status: 200
cache-control: private
date: Mon, 21 Oct 2013 20:13:22 GMT
location: https://www.example.com
content-encoding: gzip
set-cookie: foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1

エンコードされたデータの 16 進数ダンプ:

88c1 611d 4d6f 6e2c 2032 3120 4f63 7420 | ..a.Mon, 21 Oct
3230 3133 2032 303a 3133 3a32 3220 474d | 2013 20:13:22 GM
54c0 5a04 677a 6970 7738 666f 6f3d 4153 | T.Z.gzipw8foo=AS
444a 4b48 514b 425a 584f 5157 454f 5049 | DJKHQKBZXOQWEOPI
5541 5851 5745 4f49 553b 206d 6178 2d61 | UAXQWEOIU; max-a
6765 3d33 3630 303b 2076 6572 7369 6f6e | ge=3600; version
3d31                                    | =1

デコード処理:

88                                      | == Indexed - Add ==
                                        |   idx = 8
                                        | -> :status: 200
c1                                      | == Indexed - Add ==
                                        |   idx = 65
                                        | -> cache-control: private
61                                      | == Literal indexed ==
                                        |   Indexed name (idx = 33)
                                        |     date
1d                                      |   Literal value (len = 29)
4d6f 6e2c 2032 3120 4f63 7420 3230 3133 | Mon, 21 Oct 2013
2032 303a 3133 3a32 3220 474d 54        |  20:13:22 GMT
                                        | - evict: cache-control: pr\
                                        |   ivate
                                        | -> date: Mon, 21 Oct 2013 \
                                        |   20:13:22 GMT
c0                                      | == Indexed - Add ==
                                        |   idx = 64
                                        | -> location: https://www.e\
                                        |   xample.com
5a                                      | == Literal indexed ==
                                        |   Indexed name (idx = 26)
                                        |     content-encoding
04                                      |   Literal value (len = 4)
677a 6970                               | gzip
                                        | - evict: date: Mon, 21 Oct\
                                        |    2013 20:13:21 GMT
                                        | -> content-encoding: gzip
77                                      | == Literal indexed ==
                                        |   Indexed name (idx = 55)
                                        |     set-cookie
38                                      |   Literal value (len = 56)
666f 6f3d 4153 444a 4b48 514b 425a 584f | foo=ASDJKHQKBZXO
5157 454f 5049 5541 5851 5745 4f49 553b | QWEOPIUAXQWEOIU;
206d 6178 2d61 6765 3d33 3630 303b 2076 |  max-age=3600; v
6572 7369 6f6e 3d31                     | ersion=1
                                        | - evict: location: https:/\
                                        |   /www.example.com
                                        | - evict: :status: 307
                                        | -> set-cookie: foo=ASDJKHQ\
                                        |   KBZXOQWEOPIUAXQWEOIU; ma\
                                        |   x-age=3600; version=1

動的テーブル (デコード後):

[  1] (s =  98) set-cookie: foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age\
                 =3600; version=1
[  2] (s =  52) content-encoding: gzip
[  3] (s =  65) date: Mon, 21 Oct 2013 20:13:22 GMT
      Table size: 215

デコードされたヘッダリスト:

:status: 200
cache-control: private
date: Mon, 21 Oct 2013 20:13:22 GMT
location: https://www.example.com
content-encoding: gzip
set-cookie: foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1

C.6 ハフマン符号化を伴うレスポンスの例

この節は同じコネクションにおける HTTP レスポンスに対応した 幾つかの連続したヘッダリストを示します。 HTTP/2 設定パラメータ SETTINGS_HEADER_TABLE_SIZE は幾つかの削除を起こすため、 256 オクテットの値で設定されています。削除メカニズムはデコードされた リテラル値の長さを使用するため、前節と同じ削除処理が起こります。

C.6.1 一個目のレスポンス

エンコードするヘッダリスト:

:status: 302
cache-control: private
date: Mon, 21 Oct 2013 20:13:21 GMT
location: https://www.example.com

エンコードされたデータの 16 進数ダンプ:

4882 6402 5885 aec3 771a 4b61 96d0 7abe | H.d.X...w.Ka..z.
9410 54d4 44a8 2005 9504 0b81 66e0 82a6 | ..T.D. .....f...
2d1b ff6e 919d 29ad 1718 63c7 8f0b 97c8 | -..n..)...c.....
e9ae 82ae 43d3                          | ....C.

デコード処理:

48                                      | == Literal indexed ==
                                        |   Indexed name (idx = 8)
                                        |     :status
82                                      |   Literal value (len = 2)
                                        |     Huffman encoded:
6402                                    | d.
                                        |     Decoded:
                                        | 302
                                        | -> :status: 302
58                                      | == Literal indexed ==
                                        |   Indexed name (idx = 24)
                                        |     cache-control
85                                      |   Literal value (len = 5)
                                        |     Huffman encoded:
aec3 771a 4b                            | ..w.K
                                        |     Decoded:
                                        | private
                                        | -> cache-control: private
61                                      | == Literal indexed ==
                                        |   Indexed name (idx = 33)
                                        |     date
96                                      |   Literal value (len = 22)
                                        |     Huffman encoded:
d07a be94 1054 d444 a820 0595 040b 8166 | .z...T.D. .....f
e082 a62d 1bff                          | ...-..
                                        |     Decoded:
                                        | Mon, 21 Oct 2013 20:13:21 \
                                        | GMT
                                        | -> date: Mon, 21 Oct 2013 \
                                        |   20:13:21 GMT
6e                                      | == Literal indexed ==
                                        |   Indexed name (idx = 46)
                                        |     location
91                                      |   Literal value (len = 17)
                                        |     Huffman encoded:
9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 | .)...c.........C
d3                                      | .
                                        |     Decoded:
                                        | https://www.example.com
                                        | -> location: https://www.e\
                                        |   xample.com

動的テーブル (デコード後):

[  1] (s =  63) location: https://www.example.com
[  2] (s =  65) date: Mon, 21 Oct 2013 20:13:21 GMT
[  3] (s =  52) cache-control: private
[  4] (s =  42) :status: 302
      Table size: 222

デコードされたヘッダリスト:

:status: 302
cache-control: private
date: Mon, 21 Oct 2013 20:13:21 GMT
location: https://www.example.com

C.6.2 二個目のレスポンス

(":status", "307") ヘッダフィールドの追加を行える領域を解放するため (":status", "302") ヘッダフィールドは動的テーブルから削除されます。

エンコードするヘッダリスト:

:status: 307
cache-control: private
date: Mon, 21 Oct 2013 20:13:21 GMT
location: https://www.example.com

エンコードされたデータの 16 進数ダンプ:

4883 640e ffc1 c0bf                     | H.d.....

デコード処理:

48                                      | == Literal indexed ==
                                        |   Indexed name (idx = 8)
                                        |     :status
83                                      |   Literal value (len = 3)
                                        |     Huffman encoded:
640e ff                                 | d..
                                        |     Decoded:
                                        | 307
                                        | - evict: :status: 302
                                        | -> :status: 307
c1                                      | == Indexed - Add ==
                                        |   idx = 65
                                        | -> cache-control: private
c0                                      | == Indexed - Add ==
                                        |   idx = 64
                                        | -> date: Mon, 21 Oct 2013 \
                                        |   20:13:21 GMT
bf                                      | == Indexed - Add ==
                                        |   idx = 63
                                        | -> location: https://www.e\
                                        |   xample.com

動的テーブル (デコード後):

[  1] (s =  42) :status: 307
[  2] (s =  63) location: https://www.example.com
[  3] (s =  65) date: Mon, 21 Oct 2013 20:13:21 GMT
[  4] (s =  52) cache-control: private
      Table size: 222

デコードされたヘッダリスト:

:status: 307
cache-control: private
date: Mon, 21 Oct 2013 20:13:21 GMT
location: https://www.example.com

C.6.3 三個目のレスポンス

このヘッダリストの処理中幾つかのヘッダフィールドが動的テーブルから 削除されます。

エンコードするヘッダリスト:

:status: 200
cache-control: private
date: Mon, 21 Oct 2013 20:13:22 GMT
location: https://www.example.com
content-encoding: gzip
set-cookie: foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1

エンコードされたデータの 16 進数ダンプ:

88c1 6196 d07a be94 1054 d444 a820 0595 | ..a..z...T.D. ..
040b 8166 e084 a62d 1bff c05a 839b d9ab | ...f...-...Z....
77ad 94e7 821d d7f2 e6c7 b335 dfdf cd5b | w..........5...[
3960 d5af 2708 7f36 72c1 ab27 0fb5 291f | 9`..'..6r..'..).
9587 3160 65c0 03ed 4ee5 b106 3d50 07   | ..1`e...N...=P.

デコード処理:

88                                      | == Indexed - Add ==
                                        |   idx = 8
                                        | -> :status: 200
c1                                      | == Indexed - Add ==
                                        |   idx = 65
                                        | -> cache-control: private
61                                      | == Literal indexed ==
                                        |   Indexed name (idx = 33)
                                        |     date
96                                      |   Literal value (len = 22)
                                        |     Huffman encoded:
d07a be94 1054 d444 a820 0595 040b 8166 | .z...T.D. .....f
e084 a62d 1bff                          | ...-..
                                        |     Decoded:
                                        | Mon, 21 Oct 2013 20:13:22 \
                                        | GMT
                                        | - evict: cache-control: pr\
                                        |   ivate
                                        | -> date: Mon, 21 Oct 2013 \
                                        |   20:13:22 GMT
c0                                      | == Indexed - Add ==
                                        |   idx = 64
                                        | -> location: https://www.e\
                                        |   xample.com
5a                                      | == Literal indexed ==
                                        |   Indexed name (idx = 26)
                                        |     content-encoding
83                                      |   Literal value (len = 3)
                                        |     Huffman encoded:
9bd9 ab                                 | ...
                                        |     Decoded:
                                        | gzip
                                        | - evict: date: Mon, 21 Oct\
                                        |    2013 20:13:21 GMT
                                        | -> content-encoding: gzip
77                                      | == Literal indexed ==
                                        |   Indexed name (idx = 55)
                                        |     set-cookie
ad                                      |   Literal value (len = 45)
                                        |     Huffman encoded:
94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 | .........5...[9`
d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 | ..'..6r..'..)...
3160 65c0 03ed 4ee5 b106 3d50 07        | 1`e...N...=P.
                                        |     Decoded:
                                        | foo=ASDJKHQKBZXOQWEOPIUAXQ\
                                        | WEOIU; max-age=3600; versi\
                                        | on=1
                                        | - evict: location: https:/\
                                        |   /www.example.com
                                        | - evict: :status: 307
                                        | -> set-cookie: foo=ASDJKHQ\
                                        |   KBZXOQWEOPIUAXQWEOIU; ma\
                                        |   x-age=3600; version=1

動的テーブル (デコード後):

[  1] (s =  98) set-cookie: foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age\
                 =3600; version=1
[  2] (s =  52) content-encoding: gzip
[  3] (s =  65) date: Mon, 21 Oct 2013 20:13:22 GMT
      Table size: 215

デコードされたヘッダリスト:

:status: 200
cache-control: private
date: Mon, 21 Oct 2013 20:13:22 GMT
location: https://www.example.com
content-encoding: gzip
set-cookie: foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1

D. 変更点 (公開前に RFC 編集者が削除すること)

D.1 draft-ietf-httpbis-header-compression-09 からの変更点

  • ヘッダテーブルを動的テーブルにリネーム。
  • 整数表現の更新。
  • 編集上の修正。

D.2 draft-ietf-httpbis-header-compression-08 からの変更点

  • リファレンスセットの削除。
  • ヘッダ排出の削除。
  • SETTINGS_HEADER_TABLE_SIZE パラメータの幾つかの明示的な扱いの 変更。
  • ヘッダセットをヘッダリストにして、強制的に順序付けられるよう変更。
  • 例の更新。
  • ヘッダテーブルと静的テーブルの場所の交換。

D.3 draft-ietf-httpbis-header-compression-07 からの変更点

  • インデックス値 0 の古い記述を削除。
  • SETTINGS_HEADER_TABLE_SIZE 更新後のテーブルサイズの 最大値の通知に関する解説の追加。
  • セキュリティの懸念点の書き換え。
  • 多くの編集上の解説と改良。
  • 表記の節の追加。
  • ドキュメントのアウトラインの改訂。
  • 静的テーブルの更新。エントリ 16 は値に "gzip, deflate" を持つようにする。
  • Google から提供されたデータセットを元にハフマンテーブルを 更新。

D.4 draft-ietf-httpbis-header-compression-06 からの変更点

  • 圧縮されてはいけないリテラルヘッダを含むフォーマットの更新。
  • セキュリティの懸念点の更新。
  • 整数エンコーディングの例を付録に移動。
  • ハフマンテーブルの更新。
  • 静的ヘッダテーブルの更新 (ステータス値の追加と削除) 。
  • 例の更新。

D.5 draft-ietf-httpbis-header-compression-05 からの変更点

  • 例を刷新。
  • リクエストとレスポンスのハフマンテーブルを一つのみにした。
  • SETTINGS_HEADER_TABLE_SIZE と独立した動的テーブルサイズの 最大値を追加。
  • 整数デコードの擬似コードを追加。
  • 例の改良 (不要な削除処理を除去) 。

D.6 draft-ietf-httpbis-header-compression-04 からの変更点

  • 例の更新: 仕様内の変更を考慮し、更なる特徴を示す。
  • 'バイト' と 'オクテット' の両方を使用する代わりに 'オクテット' に統一。
  • リファレンスセットを空にする挙動の追加。
  • 編集上の変更と説明。
  • 静的テーブルに "host" ヘッダを追加。
  • (NULL- かカンマ区切りの) 値のリストを順序付け。

D.7 draft-ietf-httpbis-header-compression-03 からの変更点

  • 大量の編集上の変更; 新しいエントリの削除 / 追加の説明を 変更。
  • 代理インデクシングを削除。
  • issue #258 に従い、初期ヘッダを静的ヘッダに変更。
  • issue #259 に従い、静的ヘッダの 'リクエスト' と 'レスポンス' を合併。
  • issue #233 に従い、インデックス 0 に追加される新しい ヘッダを指定し、巨大なインデックスから失効する文章を 変更。

D.8 draft-ietf-httpbis-header-compression-02 からの変更点

  • 整数エンコーディングの擬似コードのエラーを修正。

D.9 draft-ietf-httpbis-header-compression-01 からの変更点

  • ヘッダエンコーディングの節のリファクタリング: 定義と処理規則の分離。
  • 後方互換性の無い変更: issue #214 に従いリファレンス セット管理を更新。これはリファレンスセットと削除動作の 間の作用の仕方を変更します。また、幾つかの特定ケースに おけるリファレンスセットの動作も変更します。
  • 後方互換性の無い変更: issue #188 に従い、初期 ヘッダリストを修正。
  • 32 オクテットエントリ構造の例を追加 (issue #191) 。
  • ヘッダセットの完全な節を追加。幾つかの文章の再追加。 得られた幾つかの記述の明確化。重複したヘッダエントリ のエンコーディングに関する文章を追加。ヘッダセットに 関する幾つかの言語の明確化。アプリケーションが より素早くメモリを解放できるようにする内容を含む ヘッダ削除の節の文章を追加。セキュリティの懸念点の節 の情報を追加。

D.10 draft-ietf-httpbis-header-compression-00 からの変更点

  • 整数表現アルゴリズムにおけるバグと欠点の修正。
  • 文書タイトルの変更。
  • ヘッダマッチングの解説の書き換え。
  • ヘッダ排出の定義の変更。
  • 圧縮コンテキストがどのくらいメモリを使うべきかに影響する 設定名の変更。
  • "特定のユースケース" 節の削除
  • インデックスが一つのオクテット内に含むことができることに 関する不正確な記述を修正
  • 演算コードの説明を追加
  • 導入からセキュリティクレームを削除

Authors' Addresses

Roberto Peon
Google, Inc
Email: fenix@google.com

Hervé Ruellan
Canon CRF
Email: herve.ruellan@crf.canon.fr