メインコンテンツまでスキップ

4. 動的テーブルの管理 (Dynamic Table Management)

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

4.1. テーブルサイズの計算 (Calculating Table Size)

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

エントリのサイズは、その名前の長さ (オクテット単位、第5.2節で定義) と、その値の長さ (オクテット単位)、および32の合計です。

エントリのサイズは、ハフマン符号化を適用せずに、その名前と値の長さを使用して計算されます。

: 追加の32オクテットは、エントリに関連する推定オーバーヘッドを考慮しています。たとえば、エントリの名前と値を参照するために2つの64ビットポインターを使用し、名前と値への参照の数をカウントするために2つの64ビット整数を使用するエントリ構造には、32オクテットのオーバーヘッドがあります。

4.2. 最大テーブルサイズ (Maximum Table Size)

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

エンコーダーは、この最大サイズよりも少ない容量を使用することを選択できますが (第6.3節参照)、選択されたサイズは、プロトコルによって設定された最大値以下である必要があります (MUST)。

動的テーブルの最大サイズの変更は、動的テーブルサイズ更新を介して通知されます (第6.3節参照)。この動的テーブルサイズ更新は、動的テーブルサイズの変更に続く最初のヘッダーブロックの先頭で発生しなければなりません (MUST)。HTTP/2では、これは設定確認に続きます ([HTTP2]の第6.5.3節参照)。

2つのヘッダーブロックの送信間に、最大テーブルサイズへの複数の更新が発生する可能性があります。このサイズがこの間隔で複数回変更される場合、その間隔で発生する最小の最大テーブルサイズが動的テーブルサイズ更新で通知されなければなりません (MUST)。最終的な最大サイズは常に通知されるため、最大で2つの動的テーブルサイズ更新が発生します。これにより、デコーダーが動的テーブルサイズの削減に基づいて削除を実行できるようになります (第4.3節参照)。

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

4.3. 動的テーブルサイズ変更時のエントリ削除 (Entry Eviction When Dynamic Table Size Changes)

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

4.4. 新しいエントリ追加時のエントリ削除 (Entry Eviction When Adding New Entries)

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

新しいエントリのサイズが最大サイズ以下の場合、そのエントリはテーブルに追加されます。最大サイズより大きいエントリを追加しようとすることはエラーではありません。最大サイズより大きいエントリを追加しようとすると、テーブルは既存のすべてのエントリが空になり、空のテーブルになります。

新しいエントリは、この新しいエントリを動的テーブルに追加するときに削除される動的テーブル内のエントリの名前を参照できます。参照されたエントリが新しいエントリを挿入する前に動的テーブルから削除された場合、実装は参照された名前を削除しないように注意する必要があります。