QPACK ist die Header-Kompression von HTTP/3, standardisiert in RFC 9204. Sie übernimmt die Rolle, die HPACK bei HTTP/2 spielt: HTTP-Header wie Cookie oder User-Agent werden komprimiert übertragen, statt bei jeder Anfrage in voller Länge zu reisen. Weil HTTP/3 aber auf QUIC läuft, konnte QPACK das bewährte HPACK nicht einfach übernehmen – es musste für ungeordnet ankommende Streams neu entworfen werden.
Warum nicht einfach HPACK?
HPACKs dynamische Tabelle hängt von der Reihenfolge der ankommenden Header ab: Ein Eintrag wird nur dann als Indexreferenz nutzbar, wenn der Empfänger alle vorherigen Tabellen-Updates bereits verarbeitet hat. Bei HTTP/2 über TCP ist die Reihenfolge garantiert. QUIC-Streams dagegen kommen unabhängig und ungeordnet an – ein Stream kann einen Header-Index referenzieren, dessen Tabellen-Eintrag noch gar nicht angekommen ist. HPACK würde dadurch ständig blockieren. QPACK trennt deshalb die Übertragung der Tabellen-Updates von den einzelnen Header-Blöcken.
Encoder- und Decoder-Stream
QPACK nutzt zwei zusätzliche unidirektionale Streams pro Verbindung: Der Encoder-Stream (Typ 0x02) überträgt Tabellen-Updates vom Encoder zum Decoder (Kapazitätsänderungen und neue Einträge), der Decoder-Stream (Typ 0x03) meldet Bestätigungen und Löschungen zurück. Die eigentlichen HEADERS-Frames auf den regulären Streams enthalten nur noch Verweise auf statische oder dynamische Tabelle. Diese Entkopplung verhindert, dass ein verspäteter Tabellen-Eintrag den gesamten Verbindungsfluss aufhält.
Blockierte Streams begrenzen
Ganz ohne Blockieren geht es nicht: Referenziert ein Header-Block einen dynamischen Eintrag, der noch nicht angekommen ist, wartet der Decoder, bis der Encoder-Stream den Eintrag nachliefert. Der Empfänger begrenzt die Zahl solcher gleichzeitig blockierten Streams über die Einstellung SETTINGS_QPACK_BLOCKED_STREAMS; der Encoder muss sich daran halten. Zusätzlich kann ein Encoder die Nutzung der dynamischen Tabelle für einzelne Felder oder ganze Anfragen deaktivieren (Q-Bit), wenn er Blockaden vermeiden will.
Aufbau der Tabellen
QPACK kennt wie HPACK eine statische Tabelle mit 99 vordefinierten, fest indizierten Feldern (häufige Header wie :method: GET oder content-type) und eine dynamische Tabelle, deren Inhalt sich pro Verbindung entwickelt. Häufige Feldnamen werden direkt über ihren Index kodiert; seltene Felder werden mit Huffman-Kodierung und Integer-Kompaktdarstellung übertragen. Ein Literal Field Line kann die dynamische Tabelle zugleich befüllen (Insert-with-Name-Reference).
Praxis
QPACK ist Pflichtbestandteil jeder HTTP/3-Implementierung und läuft automatisch, sobald Browser und Server HTTP/3 sprechen. Angesichts der wachsenden HTTP/3-Verbreitung (20 bis 35 Prozent der Web-Requests 2025/2026) komprimiert QPACK inzwischen einen erheblichen Teil des weltweiten Web-Traffics – unsichtbar für Nutzer, aber messbar an Bandbreite und Ladezeit.
Verwandte Grundlagen: HTTP/2, HTTP/3, WebTransport, HTTPS.