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
| Frame | Kontrollstream | Anfrage-Stream | Push-Stream | Abschnitt |
|---|---|---|---|---|
| DATA | Nein | Ja | Ja | 7.2.1 |
| HEADERS | Nein | Ja | Ja | 7.2.2 |
| CANCEL_PUSH | Ja | Nein | Nein | 7.2.3 |
| SETTINGS | Ja (1) | Nein | Nein | 7.2.4 |
| PUSH_PROMISE | Nein | Ja | Nein | 7.2.5 |
| GOAWAY | Ja | Nein | Nein | 7.2.6 |
| MAX_PUSH_ID | Ja | Nein | Nein | 7.2.7 |
| Reserviert | Ja | Ja | Ja | 7.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.