6. Binärformat (Binary Format)
Dieser Abschnitt beschreibt das detaillierte Binärformat für alle in Abschnitt 2.4 beschriebenen Darstellungen.
6.1. Indizierte Header-Feld-Darstellung (Indexed Header Field Representation)
Eine indizierte Header-Feld-Darstellung identifiziert einen Eintrag entweder in der statischen Tabelle oder der dynamischen Tabelle (siehe Abschnitt 2.3).
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 1 | Index (7+) |
+---+---------------------------+
Abbildung 5: Indiziertes Header-Feld
Ein indiziertes Header-Feld beginnt mit dem 1-Bit-Muster '1', gefolgt vom Index des übereinstimmenden Header-Feldes, dargestellt als Ganzzahl mit einem 7-Bit-Präfix (siehe Abschnitt 5.1).
Der Indexwert 0 wird nicht verwendet. Er MUSS als Dekodierungsfehler behandelt werden, wenn er in einer indizierten Header-Feld-Darstellung gefunden wird.
6.2. Literale Header-Feld-Darstellung (Literal Header Field Representation)
Eine literale Header-Feld-Darstellung enthält einen literalen Header-Feldwert. Header-Feldnamen werden entweder literal oder durch Referenz auf einen vorhandenen Tabelleneintrag bereitgestellt, entweder aus der statischen Tabelle oder der dynamischen Tabelle (siehe Abschnitt 2.3).
Diese Spezifikation definiert drei Formen von literalen Header-Feld-Darstellungen: mit inkrementeller Indizierung, ohne Indizierung und niemals indiziert.
6.2.1. Literales Header-Feld mit inkrementeller Indizierung (Literal Header Field with Incremental Indexing)
Eine literale Header-Feld-Darstellung mit inkrementeller Indizierung führt dazu, dass ein Header-Feld zur dekodierten Header-Liste hinzugefügt und als neuer Eintrag in die dynamische Tabelle eingefügt wird.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 0 | 1 | Index (6+) |
+---+---+-----------------------+
| H | Value Length (7+) |
+---+---------------------------+
| Value String (Length octets) |
+-------------------------------+
Abbildung 6: Literales Header-Feld mit inkrementeller Indizierung
-- Indizierter Name
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) |
+-------------------------------+
Abbildung 7: Literales Header-Feld mit inkrementeller Indizierung
-- Neuer Name
Eine literale Header-Feld-Darstellung mit inkrementeller Indizierung beginnt mit dem 2-Bit-Muster '01'.
Wenn der Header-Feldname mit dem Header-Feldnamen eines in der statischen Tabelle oder der dynamischen Tabelle gespeicherten Eintrags übereinstimmt, kann der Header-Feldname unter Verwendung des Index dieses Eintrags dargestellt werden. In diesem Fall wird der Index des Eintrags als Ganzzahl mit einem 6-Bit-Präfix dargestellt (siehe Abschnitt 5.1). Dieser Wert ist immer nicht null.
Andernfalls wird der Header-Feldname als Zeichenketten-Literal dargestellt (siehe Abschnitt 5.2). Ein Wert 0 wird anstelle des 6-Bit-Index verwendet, gefolgt vom Header-Feldnamen.
Jede Form der Header-Feldnamen-Darstellung wird gefolgt vom Header-Feldwert, der als Zeichenketten-Literal dargestellt wird (siehe Abschnitt 5.2).
6.2.2. Literales Header-Feld ohne Indizierung (Literal Header Field without Indexing)
Eine literale Header-Feld-Darstellung ohne Indizierung führt dazu, dass ein Header-Feld zur dekodierten Header-Liste hinzugefügt wird, ohne die dynamische Tabelle zu verändern.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | Index (4+) |
+---+---+-----------------------+
| H | Value Length (7+) |
+---+---------------------------+
| Value String (Length octets) |
+-------------------------------+
Abbildung 8: Literales Header-Feld ohne Indizierung
-- Indizierter Name
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) |
+-------------------------------+
Abbildung 9: Literales Header-Feld ohne Indizierung
-- Neuer Name
Eine literale Header-Feld-Darstellung ohne Indizierung beginnt mit dem 4-Bit-Muster '0000'.
Wenn der Header-Feldname mit dem Header-Feldnamen eines in der statischen Tabelle oder der dynamischen Tabelle gespeicherten Eintrags übereinstimmt, kann der Header-Feldname unter Verwendung des Index dieses Eintrags dargestellt werden. In diesem Fall wird der Index des Eintrags als Ganzzahl mit einem 4-Bit-Präfix dargestellt (siehe Abschnitt 5.1). Dieser Wert ist immer nicht null.
Andernfalls wird der Header-Feldname als Zeichenketten-Literal dargestellt (siehe Abschnitt 5.2). Ein Wert 0 wird anstelle des 4-Bit-Index verwendet, gefolgt vom Header-Feldnamen.
Jede Form der Header-Feldnamen-Darstellung wird gefolgt vom Header-Feldwert, der als Zeichenketten-Literal dargestellt wird (siehe Abschnitt 5.2).
6.2.3. Literales Header-Feld niemals indiziert (Literal Header Field Never Indexed)
Eine literale Header-Feld-Darstellung niemals indiziert führt dazu, dass ein Header-Feld zur dekodierten Header-Liste hinzugefügt wird, ohne die dynamische Tabelle zu verändern. Vermittler MÜSSEN dieselbe Darstellung zum Kodieren dieses Header-Feldes verwenden.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 1 | Index (4+) |
+---+---+-----------------------+
| H | Value Length (7+) |
+---+---------------------------+
| Value String (Length octets) |
+-------------------------------+
Abbildung 10: Literales Header-Feld niemals indiziert
-- Indizierter Name
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) |
+-------------------------------+
Abbildung 11: Literales Header-Feld niemals indiziert
-- Neuer Name
Eine literale Header-Feld-Darstellung niemals indiziert beginnt mit dem 4-Bit-Muster '0001'.
Wenn ein Header-Feld als literales Header-Feld niemals indiziert dargestellt wird, MUSS es immer mit dieser spezifischen literalen Darstellung kodiert werden. Insbesondere wenn ein Peer ein Header-Feld sendet, das es als literales Header-Feld niemals indiziert empfangen hat, MUSS es dieselbe Darstellung verwenden, um dieses Header-Feld weiterzuleiten.
Diese Darstellung ist zum Schutz von Header-Feldwerten gedacht, die nicht durch Komprimierung gefährdet werden sollen (siehe Abschnitt 7.1 für weitere Details).
Die Kodierung der Darstellung ist identisch mit dem literalen Header-Feld ohne Indizierung (siehe Abschnitt 6.2.2).
6.3. Aktualisierung der dynamischen Tabellengröße (Dynamic Table Size Update)
Eine Aktualisierung der dynamischen Tabellengröße signalisiert eine Änderung der Größe der dynamischen Tabelle.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 1 | Max size (5+) |
+---+---------------------------+
Abbildung 12: Änderung der maximalen dynamischen Tabellengröße
Eine Aktualisierung der dynamischen Tabellengröße beginnt mit dem 3-Bit-Muster '001', gefolgt von der neuen maximalen Größe, dargestellt als Ganzzahl mit einem 5-Bit-Präfix (siehe Abschnitt 5.1).
Die neue maximale Größe MUSS kleiner oder gleich dem von dem HPACK verwendenden Protokoll bestimmten Limit sein. Ein Wert, der dieses Limit überschreitet, MUSS als Dekodierungsfehler behandelt werden. In HTTP/2 ist dieses Limit der letzte Wert des Parameters SETTINGS_HEADER_TABLE_SIZE (siehe Abschnitt 6.5.2 von [HTTP2]), der vom Decoder empfangen und vom Encoder bestätigt wurde (siehe Abschnitt 6.5.3 von [HTTP2]).
Die Reduzierung der maximalen Größe der dynamischen Tabelle kann dazu führen, dass Einträge entfernt werden (siehe Abschnitt 4.3).