Zum Hauptinhalt springen

4. Verwaltung der dynamischen Tabelle (Dynamic Table Management)

Um die Speicheranforderungen auf der Decoderseite zu begrenzen, ist die Größe der dynamischen Tabelle eingeschränkt.

4.1. Berechnung der Tabellengröße (Calculating Table Size)

Die Größe der dynamischen Tabelle ist die Summe der Größen ihrer Einträge.

Die Größe eines Eintrags ist die Summe der Länge seines Namens in Oktetten (wie in Abschnitt 5.2 definiert), der Länge seines Wertes in Oktetten und 32.

Die Größe eines Eintrags wird unter Verwendung der Länge seines Namens und Wertes ohne angewendete Huffman-Kodierung berechnet.

Hinweis: Die zusätzlichen 32 Oktette berücksichtigen einen geschätzten Overhead, der mit einem Eintrag verbunden ist. Zum Beispiel hätte eine Eintragsstruktur, die zwei 64-Bit-Zeiger verwendet, um auf den Namen und den Wert des Eintrags zu verweisen, und zwei 64-Bit-Ganzzahlen zum Zählen der Anzahl der Referenzen auf den Namen und Wert, 32 Oktette Overhead.

4.2. Maximale Tabellengröße (Maximum Table Size)

Protokolle, die HPACK verwenden, bestimmen die maximale Größe, die der Encoder für die dynamische Tabelle verwenden darf. In HTTP/2 wird dieser Wert durch den Parameter SETTINGS_HEADER_TABLE_SIZE bestimmt (siehe Abschnitt 6.5.2 von [HTTP2]).

Ein Encoder kann wählen, weniger Kapazität als diese maximale Größe zu verwenden (siehe Abschnitt 6.3), aber die gewählte Größe MUSS kleiner oder gleich dem vom Protokoll festgelegten Maximum bleiben.

Eine Änderung der maximalen Größe der dynamischen Tabelle wird über eine Aktualisierung der dynamischen Tabellengröße signalisiert (siehe Abschnitt 6.3). Diese Aktualisierung der dynamischen Tabellengröße MUSS am Anfang des ersten Header-Blocks nach der Änderung der dynamischen Tabellengröße erfolgen. In HTTP/2 folgt dies einer Einstellungsbestätigung (siehe Abschnitt 6.5.3 von [HTTP2]).

Mehrere Aktualisierungen der maximalen Tabellengröße können zwischen der Übertragung zweier Header-Blöcke auftreten. Für den Fall, dass diese Größe in diesem Intervall mehr als einmal geändert wird, MUSS die kleinste maximale Tabellengröße, die in diesem Intervall auftritt, in einer Aktualisierung der dynamischen Tabellengröße signalisiert werden. Die endgültige maximale Größe wird immer signalisiert, was zu maximal zwei Aktualisierungen der dynamischen Tabellengröße führt. Dies stellt sicher, dass der Decoder in der Lage ist, basierend auf Reduzierungen der dynamischen Tabellengröße eine Entfernung durchzuführen (siehe Abschnitt 4.3).

Dieser Mechanismus kann verwendet werden, um Einträge vollständig aus der dynamischen Tabelle zu löschen, indem eine maximale Größe von 0 festgelegt wird, die anschließend wiederhergestellt werden kann.

4.3. Entfernung von Einträgen bei Größenänderung (Entry Eviction When Dynamic Table Size Changes)

Wann immer die maximale Größe für die dynamische Tabelle reduziert wird, werden Einträge vom Ende der dynamischen Tabelle entfernt, bis die Größe der dynamischen Tabelle kleiner oder gleich der maximalen Größe ist.

4.4. Entfernung von Einträgen beim Hinzufügen neuer Einträge (Entry Eviction When Adding New Entries)

Bevor ein neuer Eintrag zur dynamischen Tabelle hinzugefügt wird, werden Einträge vom Ende der dynamischen Tabelle entfernt, bis die Größe der dynamischen Tabelle kleiner oder gleich (maximale Größe - neue Eintragsgröße) ist oder bis die Tabelle leer ist.

Wenn die Größe des neuen Eintrags kleiner oder gleich der maximalen Größe ist, wird dieser Eintrag zur Tabelle hinzugefügt. Es ist kein Fehler, zu versuchen, einen Eintrag hinzuzufügen, der größer als die maximale Größe ist; ein Versuch, einen Eintrag hinzuzufügen, der größer als die maximale Größe ist, führt dazu, dass die Tabelle von allen vorhandenen Einträgen geleert wird und eine leere Tabelle entsteht.

Ein neuer Eintrag kann auf den Namen eines Eintrags in der dynamischen Tabelle verweisen, der beim Hinzufügen dieses neuen Eintrags zur dynamischen Tabelle entfernt wird. Implementierungen sollten darauf achten, den referenzierten Namen nicht zu löschen, wenn der referenzierte Eintrag aus der dynamischen Tabelle entfernt wird, bevor der neue Eintrag eingefügt wird.