Zum Hauptinhalt springen

1. Einführung (Introduction)

In HTTP/1.1 (siehe [RFC7230]) werden Header-Felder (Header Field) nicht komprimiert. Da Webseiten so gewachsen sind, dass sie Dutzende bis Hunderte von Anfragen erfordern, verbrauchen die redundanten Header-Felder in diesen Anfragen unnötig Bandbreite und erhöhen die Latenz erheblich.

SPDY [SPDY] hat diese Redundanz zunächst durch Komprimierung der Header-Felder unter Verwendung des DEFLATE-Formats [DEFLATE] behandelt, was sich als sehr effektiv bei der Darstellung redundanter Header-Felder erwies. Dieser Ansatz setzte jedoch ein Sicherheitsrisiko aus, wie durch den CRIME-Angriff (Compression Ratio Info-leak Made Easy) (siehe [CRIME]) demonstriert wurde.

Diese Spezifikation definiert HPACK, ein neues Komprimierungsschema, das redundante Header-Felder eliminiert, die Anfälligkeit für bekannte Sicherheitsangriffe begrenzt und begrenzte Speicheranforderungen für die Verwendung in eingeschränkten Umgebungen hat. Potenzielle Sicherheitsbedenken bezüglich HPACK werden in Abschnitt 7 beschrieben.

Das HPACK-Format ist absichtlich einfach und unflexibel. Beide Eigenschaften reduzieren das Risiko von Interoperabilitäts- oder Sicherheitsproblemen aufgrund von Implementierungsfehlern. Es ist kein Erweiterungsmechanismus definiert. Änderungen am Format sind nur durch Definition eines vollständigen Ersatzes möglich.

1.1. Überblick (Overview)

Das in dieser Spezifikation definierte Format behandelt eine Liste von Header-Feldern als geordnete Sammlung von Name-Wert-Paaren, die doppelte Paare enthalten können. Namen und Werte werden als opake Byte-Sequenzen betrachtet, und die Reihenfolge der Header-Felder bleibt nach Komprimierung und Dekomprimierung erhalten.

Die Kodierung (Encoding) wird durch eine Header-Feld-Tabelle (Header Field Table) informiert, die Header-Felder auf Indexwerte (Index Value) abbildet. Diese Header-Feld-Tabellen können inkrementell aktualisiert werden, wenn neue Header-Felder kodiert oder dekodiert werden.

Im kodierten Format wird ein Header-Feld entweder als Literal (Literal) dargestellt oder als Referenz auf ein Header-Feld in einer der Header-Feld-Tabellen. Daher kann eine Liste von Header-Feldern unter Verwendung einer Mischung aus Referenzen und Literalwerten kodiert werden.

Literalwerte werden entweder direkt kodiert oder unter Verwendung eines statischen Huffman-Codes (Static Huffman Code).

Der Encoder (Encoder) ist dafür verantwortlich zu entscheiden, welche Header-Felder als neue Einträge in die Header-Feld-Tabelle eingefügt werden sollen. Der Decoder (Decoder) führt die vom Encoder vorgeschriebenen Änderungen an der Header-Feld-Tabelle durch und rekonstruiert dabei die Liste der Header-Felder. Dies ermöglicht es Decodern, einfach zu bleiben und mit einer Vielzahl von Encodern interoperabel zu sein.

Beispiele zur Veranschaulichung der Verwendung dieser verschiedenen Mechanismen zur Darstellung von Header-Feldern sind in Anhang C verfügbar.

1.2. Konventionen (Conventions)

Die Schlüsselwörter „MUSS" (MUST), „DARF NICHT" (MUST NOT), „ERFORDERLICH" (REQUIRED), „SOLL" (SHALL), „SOLL NICHT" (SHALL NOT), „SOLLTE" (SHOULD), „SOLLTE NICHT" (SHOULD NOT), „EMPFOHLEN" (RECOMMENDED), „KANN" (MAY) und „OPTIONAL" (OPTIONAL) in diesem Dokument sind wie in RFC 2119 [RFC2119] beschrieben zu interpretieren.

Alle numerischen Werte sind in Netzwerk-Byte-Reihenfolge. Werte sind vorzeichenlos, sofern nicht anders angegeben. Literalwerte werden nach Bedarf in dezimaler oder hexadezimaler Notation angegeben.

1.3. Terminologie (Terminology)

Diese Spezifikation verwendet die folgenden Begriffe:

Header-Feld (Header Field): Ein Name-Wert-Paar. Sowohl der Name als auch der Wert werden als opake Byte-Sequenzen behandelt.

Dynamische Tabelle (Dynamic Table): Die dynamische Tabelle (siehe Abschnitt 2.3.2) ist eine Tabelle, die gespeicherte Header-Felder mit Indexwerten verknüpft. Diese Tabelle ist dynamisch und spezifisch für einen Kodierungs- oder Dekodierungskontext.

Statische Tabelle (Static Table): Die statische Tabelle (siehe Abschnitt 2.3.1) ist eine Tabelle, die häufig auftretende Header-Felder statisch mit einem Indexwert verknüpft. Diese Tabelle ist geordnet, schreibgeschützt, immer zugänglich und kann zwischen allen Kodierungs- oder Dekodierungskontexten geteilt werden.

Header-Liste (Header List): Eine Header-Liste ist eine geordnete Sammlung von Header-Feldern, die gemeinsam kodiert werden und doppelte Header-Felder enthalten können. Die vollständige Liste der in einem HTTP/2-Header-Block enthaltenen Header-Felder ist eine Header-Liste.

Header-Feld-Darstellung (Header Field Representation): Ein Header-Feld kann in kodierter Form entweder als Literal oder als Index dargestellt werden (siehe Abschnitt 2.4).

Header-Block (Header Block): Eine geordnete Liste von Header-Feld-Darstellungen, die bei Dekodierung eine vollständige Header-Liste erzeugt.