Zum Hauptinhalt springen

7. HTTP-Framing-Schicht (HTTP Framing Layer)

HTTP-Frames werden auf QUIC-Streams übertragen, wie in Abschnitt 6 beschrieben. HTTP/3 definiert drei Stream-Typen: Kontrollstream, Anfrage-Stream und Push-Stream. Dieser Abschnitt beschreibt HTTP/3-Frame-Formate und ihre zulässigen Stream-Typen; siehe Tabelle 1 für eine Übersicht.

Tabelle 1: Übersicht über HTTP/3-Frames und Stream-Typen

FrameKontrollstreamAnfrage-StreamPush-StreamAbschnitt
DATANeinJaJa7.2.1
HEADERSNeinJaJa7.2.2
CANCEL_PUSHJaNeinNein7.2.3
SETTINGSJa (1)NeinNein7.2.4
PUSH_PROMISENeinJaNein7.2.5
GOAWAYJaNeinNein7.2.6
MAX_PUSH_IDJaNeinNein7.2.7
ReserviertJaJaJa7.2.8

Der SETTINGS-Frame kann nur als erster Frame eines Kontrollstreams auftreten; dies ist in Tabelle 1 mit (1) gekennzeichnet.

Beachten Sie, dass HTTP/3-Frames im Gegensatz zu QUIC-Frames mehrere Pakete umfassen können.

7.1. Frame-Layout

Alle Frames haben das folgende Format:

HTTP/3 Frame Format {
Type (i),
Length (i),
Frame Payload (..),
}

Ein Frame enthält die folgenden Felder:

  • Type (Typ): Eine Ganzzahl variabler Länge, die den Frame-Typ identifiziert
  • Length (Länge): Eine Ganzzahl variabler Länge, die die Länge in Bytes der Frame-Nutzlast beschreibt
  • Frame Payload (Frame-Nutzlast): Eine Nutzlast, deren Semantik durch das Type-Feld bestimmt wird

Die Nutzlast jedes Frames MUSS (MUST) genau die in seiner Beschreibung identifizierten Felder enthalten. Eine Frame-Nutzlast, die zusätzliche Bytes enthält oder vorzeitig endet, MUSS (MUST) als Verbindungsfehler vom Typ H3_FRAME_ERROR behandelt werden.

7.2. Frame-Definitionen (Frame Definitions)

7.2.1. DATA

DATA-Frames (type=0x00) übertragen beliebige Bytesequenzen variabler Länge, die mit HTTP-Anfrage- oder -Antwortinhalt verbunden sind.

DATA-Frames MÜSSEN (MUST) mit einer HTTP-Anfrage oder -Antwort verknüpft sein. Wenn ein DATA-Frame auf einem Kontrollstream empfangen wird, MUSS (MUST) der Empfänger mit einem Verbindungsfehler vom Typ H3_FRAME_UNEXPECTED antworten.

7.2.2. HEADERS

Der HEADERS-Frame (type=0x01) wird verwendet, um einen mit QPACK codierten HTTP-Feldabschnitt zu übertragen.

HEADERS-Frames können nur auf Anfrage-Streams oder Push-Streams gesendet werden. Wenn ein HEADERS-Frame auf einem Kontrollstream empfangen wird, MUSS (MUST) der Empfänger mit einem Verbindungsfehler vom Typ H3_FRAME_UNEXPECTED antworten.

7.2.3. CANCEL_PUSH

Der CANCEL_PUSH-Frame (type=0x03) wird verwendet, um die Stornierung eines Server-Pushs anzufordern, bevor der Push-Stream empfangen wird.

Wenn ein Client einen CANCEL_PUSH-Frame sendet, zeigt er an, dass er die versprochene Ressource nicht empfangen möchte. Der Server SOLLTE (SHOULD) das Senden der Ressource abbrechen.

CANCEL_PUSH-Frames werden auf dem Kontrollstream gesendet. Der Empfang eines CANCEL_PUSH-Frames auf einem Anfrage-Stream oder Push-Stream MUSS (MUST) als Verbindungsfehler vom Typ H3_FRAME_UNEXPECTED behandelt werden.

7.2.4. SETTINGS

Der SETTINGS-Frame (type=0x04) übermittelt Konfigurationsparameter, die beeinflussen, wie Endpunkte kommunizieren.

SETTINGS-Frames MÜSSEN (MUST) als erster Frame jedes Kontrollstreams gesendet werden. SETTINGS-Frames DÜRFEN NICHT (MUST NOT) auf anderen Streams gesendet werden.

Definierte Einstellungsidentifikatoren umfassen:

  • SETTINGS_MAX_FIELD_SECTION_SIZE (0x06): Maximale Feldabschnittsgröße
  • SETTINGS_QPACK_MAX_TABLE_CAPACITY (0x01): QPACK-bezogene Einstellung
  • SETTINGS_QPACK_BLOCKED_STREAMS (0x07): QPACK-bezogene Einstellung

7.2.5. PUSH_PROMISE

Der PUSH_PROMISE-Frame (type=0x05) wird verwendet, um einen versprochenen Anfrage-Header-Feldabschnitt vom Server zum Client auf einem Anfrage-Stream zu übertragen.

PUSH_PROMISE-Frames können nur auf Anfrage-Streams gesendet werden. Der Empfang eines PUSH_PROMISE-Frames auf einem Kontrollstream oder Push-Stream MUSS (MUST) als Verbindungsfehler vom Typ H3_FRAME_UNEXPECTED behandelt werden.

7.2.6. GOAWAY

Der GOAWAY-Frame (type=0x07) wird verwendet, um das geordnete Herunterfahren einer Verbindung einzuleiten.

GOAWAY-Frames werden immer auf dem Kontrollstream gesendet. Der Empfang eines GOAWAY-Frames auf einem Anfrage-Stream oder Push-Stream MUSS (MUST) als Verbindungsfehler vom Typ H3_FRAME_UNEXPECTED behandelt werden.

7.2.7. MAX_PUSH_ID

Der MAX_PUSH_ID-Frame (type=0x0d) wird von Clients verwendet, um die Anzahl der Server-Pushs zu kontrollieren, die der Server initiieren kann.

MAX_PUSH_ID-Frames werden immer auf dem Kontrollstream gesendet. Ein Server DARF NICHT (MUST NOT) einen MAX_PUSH_ID-Frame senden.

7.2.8. Reservierte Frame-Typen (Reserved Frame Types)

Frame-Typen im Format 0x1f * N + 0x21 für nichtnegative ganzzahlige Werte von N sind reserviert, um die Anforderung zu erfüllen, dass unbekannte Typen ignoriert werden. Diese Frames haben keine Semantik und können auf jedem Stream gesendet werden.