2. Übersicht des Komprimierungsprozesses (Compression Process Overview)
Diese Spezifikation beschreibt keinen spezifischen Algorithmus für einen Encoder. Stattdessen definiert sie genau, wie ein Decoder arbeiten soll, wodurch Encoder jede Kodierung erzeugen können, die diese Definition erlaubt.
2.1. Reihenfolge der Header-Liste (Header List Ordering)
HPACK bewahrt die Reihenfolge der Header-Felder in der Header-Liste. Ein Encoder MUSS Header-Feld-Darstellungen im Header-Block entsprechend ihrer Reihenfolge in der ursprünglichen Header-Liste ordnen. Ein Decoder MUSS Header-Felder in der dekodierten Header-Liste entsprechend ihrer Reihenfolge im Header-Block ordnen.
2.2. Kodierungs- und Dekodierungskontexte (Encoding and Decoding Contexts)
Um Header-Blöcke zu dekomprimieren, muss ein Decoder nur eine dynamische Tabelle (siehe Abschnitt 2.3.2) als Dekodierungskontext beibehalten. Kein anderer dynamischer Zustand ist erforderlich.
Bei bidirektionaler Kommunikation, wie in HTTP, sind die vom Endpunkt verwalteten Kodierungs- und Dekodierungs-Dynamiktabellen völlig unabhängig, d.h. die Anfrage- und Antwort-Dynamiktabellen sind getrennt.
2.3. Indizierungstabellen (Indexing Tables)
HPACK verwendet zwei Tabellen zur Verknüpfung von Header-Feldern mit Indizes. Die statische Tabelle (siehe Abschnitt 2.3.1) ist vordefiniert und enthält gängige Header-Felder (die meisten davon mit leerem Wert). Die dynamische Tabelle (siehe Abschnitt 2.3.2) ist dynamisch und kann vom Encoder verwendet werden, um in den kodierten Header-Listen wiederholte Header-Felder zu indizieren.
Diese beiden Tabellen werden zu einem einzigen Adressraum kombiniert, um Indexwerte zu definieren (siehe Abschnitt 2.3.3).
2.3.1. Statische Tabelle (Static Table)
Die statische Tabelle besteht aus einer vordefinierten statischen Liste von Header-Feldern. Ihre Einträge sind in Anhang A definiert.
2.3.2. Dynamische Tabelle (Dynamic Table)
Die dynamische Tabelle besteht aus einer Liste von Header-Feldern, die in First-In-First-Out-Reihenfolge verwaltet werden. Der erste und neueste Eintrag in einer dynamischen Tabelle befindet sich am niedrigsten Index, und der älteste Eintrag einer dynamischen Tabelle befindet sich am höchsten Index.
Die dynamische Tabelle ist anfangs leer. Einträge werden hinzugefügt, wenn jeder Header-Block dekomprimiert wird.
Die dynamische Tabelle kann doppelte Einträge enthalten (d.h. Einträge mit demselben Namen und demselben Wert). Daher DÜRFEN doppelte Einträge von einem Decoder NICHT als Fehler behandelt werden.
Der Encoder entscheidet, wie die dynamische Tabelle aktualisiert wird, und kann so steuern, wie viel Speicher von der dynamischen Tabelle verwendet wird. Um die Speicheranforderungen des Decoders zu begrenzen, ist die Größe der dynamischen Tabelle streng begrenzt (siehe Abschnitt 4.2).
Der Decoder aktualisiert die dynamische Tabelle während der Verarbeitung einer Liste von Header-Feld-Darstellungen (siehe Abschnitt 3.2).
2.3.3. Index-Adressraum (Index Address Space)
Die statische Tabelle und die dynamische Tabelle werden zu einem einzigen Index-Adressraum kombiniert.
Indizes zwischen 1 und der Länge der statischen Tabelle (einschließlich) beziehen sich auf Elemente in der statischen Tabelle (siehe Abschnitt 2.3.1).
Indizes, die strikt größer als die Länge der statischen Tabelle sind, beziehen sich auf Elemente in der dynamischen Tabelle (siehe Abschnitt 2.3.2). Die Länge der statischen Tabelle wird subtrahiert, um den Index in der dynamischen Tabelle zu finden.
Indizes, die strikt größer als die Summe der Längen beider Tabellen sind, MÜSSEN als Dekodierungsfehler behandelt werden.
Für eine statische Tabellengröße von s und eine dynamische Tabellengröße von k zeigt das folgende Diagramm den gesamten gültigen Index-Adressraum.
<---------- Index Address Space ---------->
<-- Static Table --> <-- Dynamic Table -->
+---+-----------+---+ +---+-----------+---+
| 1 | ... | s | |s+1| ... |s+k|
+---+-----------+---+ +---+-----------+---+
^ |
| V
Insertion Point Dropping Point
Abbildung 1: Index-Adressraum
2.4. Header-Feld-Darstellung (Header Field Representation)
Ein kodiertes Header-Feld kann entweder als Index oder als Literal dargestellt werden.
Eine indizierte Darstellung definiert ein Header-Feld als Referenz auf einen Eintrag entweder in der statischen Tabelle oder der dynamischen Tabelle (siehe Abschnitt 6.1).
Eine literale Darstellung definiert ein Header-Feld durch Angabe seines Namens und Wertes. Der Header-Feldname kann literal oder als Referenz auf einen Eintrag entweder in der statischen Tabelle oder der dynamischen Tabelle dargestellt werden. Der Header-Feldwert wird literal dargestellt.
Drei verschiedene literale Darstellungen sind definiert:
-
Eine literale Darstellung, die das Header-Feld als neuen Eintrag am Anfang der dynamischen Tabelle hinzufügt (siehe Abschnitt 6.2.1).
-
Eine literale Darstellung, die das Header-Feld nicht zur dynamischen Tabelle hinzufügt (siehe Abschnitt 6.2.2).
-
Eine literale Darstellung, die das Header-Feld nicht zur dynamischen Tabelle hinzufügt, mit der zusätzlichen Bestimmung, dass dieses Header-Feld immer eine literale Darstellung verwenden muss, insbesondere wenn es von einem Vermittler neu kodiert wird (siehe Abschnitt 6.2.3). Diese Darstellung ist zum Schutz von Header-Feldwerten gedacht, die nicht durch Komprimierung gefährdet werden sollen (siehe Abschnitt 7.1.3 für weitere Details).
Die Wahl einer dieser literalen Darstellungen kann durch Sicherheitsüberlegungen geleitet werden, um sensible Header-Feldwerte zu schützen (siehe Abschnitt 7.1).