2. HTTP-Datagramme (HTTP Datagrams)
HTTP-Datagramme (HTTP Datagrams) sind eine Konvention für die Übertragung bidirektionaler und potenziell unzuverlässiger Datagramme innerhalb einer HTTP-Verbindung mit Multiplexing, wenn möglich. Alle HTTP-Datagramme sind mit einer HTTP-Anfrage verknüpft.
Wenn HTTP-Datagramme über eine HTTP/3-Verbindung übertragen werden, kann der QUIC DATAGRAM-Frame verwendet werden, um Demultiplexing und unzuverlässige Zustellung bereitzustellen; siehe Abschnitt 2.1. Die Aushandlung der Verwendung von QUIC DATAGRAM-Frames für HTTP-Datagramme wird durch den Austausch von HTTP/3-Einstellungen erreicht; siehe Abschnitt 2.1.1.
Bei Ausführung über HTTP/2 wird das Demultiplexing von der HTTP/2-Framing-Schicht bereitgestellt, aber unzuverlässige Zustellung ist nicht verfügbar. HTTP-Datagramme werden unter Verwendung des Kapselprotokolls ausgehandelt und übertragen; siehe Abschnitt 3.5.
Bei Ausführung über HTTP/1.x werden Anfragen in der Verbindung streng serialisiert; daher ist Demultiplexing nicht verfügbar. Unzuverlässige Zustellung ist ebenfalls nicht verfügbar. HTTP-Datagramme werden unter Verwendung des Kapselprotokolls ausgehandelt und übertragen; siehe Abschnitt 3.5.
HTTP-Datagramme dürfen (MUST) nur mit einer Verknüpfung zu einer HTTP-Anfrage gesendet werden, die sie explizit unterstützt. Beispielsweise definieren die bestehenden HTTP-Methoden GET und POST keine Semantik für zugeordnete HTTP-Datagramme; daher können HTTP-Datagramme, die mit GET- oder POST-Anforderungsströmen verknüpft sind, nicht gesendet werden.
Wenn ein HTTP-Datagramm empfangen wird und es mit einer Anfrage verknüpft ist, die keine bekannte Semantik für HTTP-Datagramme hat, muss (MUST) der Empfänger die Anfrage beenden. Wenn HTTP/3 verwendet wird, muss (MUST) der Anforderungsstrom mit H3_DATAGRAM_ERROR (0x33) abgebrochen werden. HTTP-Erweiterungen können (MAY) diese Anforderungen außer Kraft setzen, indem sie einen Aushandlungsmechanismus und eine Semantik für HTTP-Datagramme definieren.
2.1. HTTP/3-Datagramme (HTTP/3 Datagrams)
Bei Verwendung mit HTTP/3 verwendet das Datagram Data-Feld von QUIC DATAGRAM-Frames das folgende Format:
HTTP/3 Datagram {
Quarter Stream ID (i),
HTTP Datagram Payload (..),
}
Abbildung 1: HTTP/3-Datagrammformat
Quarter Stream ID: Eine Ganzzahl variabler Länge, die den Wert des vom Client initiierten bidirektionalen Stroms enthält, mit dem dieses Datagramm verknüpft ist, geteilt durch vier (die Division durch vier ergibt sich aus der Tatsache, dass HTTP-Anfragen auf vom Client initiierten bidirektionalen Strömen gesendet werden, die Stream-IDs haben, die durch vier teilbar sind). Der größte zulässige QUIC-Stream-ID-Wert ist 2^62-1, daher ist der größte zulässige Wert des Quarter Stream ID-Feldes 2^60-1. Der Empfang eines HTTP/3-Datagramms, das einen größeren Wert enthält, muss (MUST) als HTTP/3-Verbindungsfehler vom Typ H3_DATAGRAM_ERROR (0x33) behandelt werden.
HTTP Datagram Payload: Die Nutzlast des Datagramms, deren Semantik durch die Erweiterung definiert wird, die HTTP-Datagramme verwendet. Beachten Sie, dass dieses Feld leer sein kann.
Der Empfang eines QUIC DATAGRAM-Frames, dessen Nutzlast zu kurz ist, um das Quarter Stream ID-Feld zu analysieren, muss (MUST) als HTTP/3-Verbindungsfehler vom Typ H3_DATAGRAM_ERROR (0x33) behandelt werden.
HTTP/3-Datagramme dürfen (MUST NOT) nicht gesendet werden, es sei denn, die Sendeseite des entsprechenden Stroms ist geöffnet. Wenn ein Datagramm empfangen wird, nachdem die Empfangsseite des entsprechenden Stroms geschlossen wurde, müssen (MUST) die empfangenen Datagramme stillschweigend verworfen werden.
Wenn ein HTTP/3-Datagramm empfangen wird und sein Quarter Stream ID-Feld auf einen Strom verweist, der noch nicht erstellt wurde, soll (SHALL) der Empfänger dieses Datagramm entweder stillschweigend verwerfen oder es vorübergehend (in der Größenordnung eines Roundtrips) puffern, während er auf die Erstellung des entsprechenden Stroms wartet.
Wenn ein HTTP/3-Datagramm empfangen wird und sein Quarter Stream ID-Feld auf einen Strom verweist, der aufgrund von vom Client initiierten bidirektionalen Stromlimits nicht erstellt werden kann, sollte (SHOULD) es als HTTP/3-Verbindungsfehler vom Typ H3_ID_ERROR behandelt werden. Die Erzeugung eines Fehlers ist nicht obligatorisch, da das QUIC-Stromlimit der HTTP/3-Schicht möglicherweise unbekannt ist.
Die Priorisierung von HTTP/3-Datagrammen ist in diesem Dokument nicht definiert. Zukünftige Erweiterungen können (MAY) definieren, wie Datagramme priorisiert werden, und können (MAY) Signalisierung definieren, um die Kommunikation von Priorisierungspräferenzen zu ermöglichen.
2.1.1. Die SETTINGS_H3_DATAGRAM HTTP/3-Einstellung
Ein Endpunkt kann seinem Peer anzeigen, dass er bereit ist, HTTP/3-Datagramme zu empfangen, indem er die SETTINGS_H3_DATAGRAM (0x33)-Einstellung mit einem Wert von 1 sendet.
Der Wert der SETTINGS_H3_DATAGRAM-Einstellung muss (MUST) entweder 0 oder 1 sein. Ein Wert von 0 zeigt an, dass die Implementierung nicht bereit ist, HTTP-Datagramme zu empfangen. Wenn die SETTINGS_H3_DATAGRAM-Einstellung mit einem Wert empfangen wird, der weder 0 noch 1 ist, muss (MUST) der Empfänger die Verbindung mit dem Fehler H3_SETTINGS_ERROR beenden.
QUIC DATAGRAM-Frames dürfen (MUST NOT) nicht gesendet werden, bis die SETTINGS_H3_DATAGRAM-Einstellung sowohl gesendet als auch mit einem Wert von 1 empfangen wurde.
Wenn Clients 0-RTT verwenden, können (MAY) sie den Wert der SETTINGS_H3_DATAGRAM-Einstellung des Servers speichern. Dies ermöglicht es dem Client, QUIC DATAGRAM-Frames in 0-RTT-Paketen zu senden. Wenn Server entscheiden, 0-RTT-Daten zu akzeptieren, müssen (MUST) sie eine SETTINGS_H3_DATAGRAM-Einstellung senden, die größer oder gleich dem Wert ist, den sie dem Client in der Verbindung gesendet haben, in der sie ihm die NewSessionTicket-Nachricht gesendet haben. Wenn ein Client den Wert der SETTINGS_H3_DATAGRAM-Einstellung mit seinem 0-RTT-Zustand speichert, muss (MUST) er validieren, dass der neue Wert der SETTINGS_H3_DATAGRAM-Einstellung, der vom Server im Handshake gesendet wird, größer oder gleich dem gespeicherten Wert ist; wenn nicht, muss (MUST) der Client die Verbindung mit dem Fehler H3_SETTINGS_ERROR beenden. In allen Fällen beträgt der maximal zulässige Wert des SETTINGS_H3_DATAGRAM-Einstellungsparameters 1.
Es wird empfohlen (RECOMMENDED), dass Implementierungen, die den Empfang von HTTP/3-Datagrammen unterstützen, immer die SETTINGS_H3_DATAGRAM-Einstellung mit einem Wert von 1 senden, auch wenn die Anwendung nicht beabsichtigt, HTTP/3-Datagramme zu verwenden. Dies hilft, „Auffallen" zu vermeiden; siehe Abschnitt 4.
2.2. HTTP-Datagramme mit Kapseln (HTTP Datagrams Using Capsules)
Wenn HTTP/3-Datagramme nicht verfügbar oder unerwünscht sind, können HTTP-Datagramme unter Verwendung des Kapselprotokolls gesendet werden; siehe Abschnitt 3.5.