Zum Hauptinhalt springen

1. Overview (Übersicht)

QUIC ist ein sicheres Allzweck-Transportprotokoll. Dieses Dokument definiert Version 1 von QUIC, die den versionsunabhängigen Eigenschaften (Version-Independent Properties) von QUIC entspricht, die in [QUIC-INVARIANTS] definiert sind.

QUIC ist ein verbindungsorientiertes Protokoll (Connection-Oriented Protocol), das eine zustandsbehaftete Interaktion zwischen einem Client und einem Server erstellt.

Der QUIC-Handshake kombiniert die Aushandlung kryptografischer und Transportparameter. QUIC integriert den TLS-Handshake [TLS13], verwendet jedoch ein angepasstes Framing zum Schutz von Paketen. Die Integration von TLS und QUIC wird ausführlicher in [QUIC-TLS] beschrieben. Die Struktur des Handshakes ist so konzipiert, dass Anwendungsdaten so schnell wie möglich ausgetauscht werden können. Dies umfasst eine Option für Clients, Daten sofort zu senden (0-RTT), was eine Form vorheriger Kommunikation oder Konfiguration erfordert, um aktiviert zu werden.

Endpunkte kommunizieren in QUIC durch den Austausch von QUIC-Paketen (QUIC Packets). Die meisten Pakete enthalten Frames, die Steuerinformationen und Anwendungsdaten zwischen Endpunkten übertragen. QUIC authentifiziert den gesamten Inhalt jedes Pakets und verschlüsselt so viel wie möglich von jedem Paket. QUIC-Pakete werden in UDP-Datagrammen [UDP] übertragen, um die Bereitstellung in bestehenden Systemen und Netzwerken zu erleichtern.

Anwendungsprotokolle tauschen Informationen über eine QUIC-Verbindung über Streams aus, die geordnete Bytesequenzen (Ordered Sequences of Bytes) sind. Es können zwei Arten von Streams erstellt werden: bidirektionale Streams (Bidirectional Streams), die es beiden Endpunkten ermöglichen, Daten zu senden; und unidirektionale Streams (Unidirectional Streams), die nur einem einzelnen Endpunkt ermöglichen, Daten zu senden. Ein kreditbasiertes Schema (Credit-Based Scheme) wird verwendet, um die Stream-Erstellung und die Menge der zu sendenden Daten zu begrenzen.

QUIC bietet das notwendige Feedback zur Implementierung zuverlässiger Zustellung (Reliable Delivery) und Staukontrolle (Congestion Control). Ein Algorithmus zur Erkennung und Wiederherstellung von Datenverlust wird in Abschnitt 6 von [QUIC-RECOVERY] beschrieben. QUIC verlässt sich auf Staukontrolle, um Netzwerküberlastung zu vermeiden. Ein beispielhafter Staukontrollalgorithmus wird in Abschnitt 7 von [QUIC-RECOVERY] beschrieben.

QUIC-Verbindungen sind nicht strikt an einen einzelnen Netzwerkpfad gebunden. Verbindungsmigration (Connection Migration) verwendet Verbindungsidentifikatoren (Connection Identifiers), um Verbindungen auf einen neuen Netzwerkpfad zu übertragen. In dieser Version von QUIC können nur Clients migrieren. Dieses Design ermöglicht es auch, dass Verbindungen nach Änderungen in der Netzwerktopologie oder Adresszuordnungen fortbestehen, wie sie beispielsweise durch NAT-Rebinding verursacht werden können.

Einmal etabliert, werden mehrere Optionen für die Verbindungsbeendigung bereitgestellt. Anwendungen können ein ordnungsgemäßes Herunterfahren (Graceful Shutdown) verwalten, Endpunkte können eine Timeout-Periode aushandeln, Fehler können zu einem sofortigen Verbindungsabbau führen, und ein zustandsloser Mechanismus bietet die Beendigung von Verbindungen, nachdem ein Endpunkt seinen Zustand verloren hat.


1.1. Document Structure (Dokumentstruktur)

Dieses Dokument beschreibt das Kern-QUIC-Protokoll und ist wie folgt strukturiert:

Streams - Die grundlegende Dienstabstraktion, die QUIC bereitstellt

  • Abschnitt 2: beschreibt Kernkonzepte im Zusammenhang mit Streams
  • Abschnitt 3: bietet ein Referenzmodell für Stream-Zustände
  • Abschnitt 4: skizziert den Betrieb der Flusskontrolle

Verbindungen (Connections) - Der Kontext, in dem QUIC-Endpunkte kommunizieren

  • Abschnitt 5: beschreibt Kernkonzepte im Zusammenhang mit Verbindungen
  • Abschnitt 6: beschreibt Versionsaushandlung (Version Negotiation)
  • Abschnitt 7: beschreibt detailliert den Prozess zur Herstellung von Verbindungen
  • Abschnitt 8: beschreibt Adressvalidierung und kritische Denial-of-Service-Abwehrmaßnahmen
  • Abschnitt 9: beschreibt, wie Endpunkte eine Verbindung auf einen neuen Netzwerkpfad migrieren
  • Abschnitt 10: listet die Optionen zum Beenden einer offenen Verbindung auf
  • Abschnitt 11: bietet Anleitungen zur Fehlerbehandlung von Streams und Verbindungen

Pakete und Frames - Die Grundeinheit, die QUIC zur Kommunikation verwendet

  • Abschnitt 12: beschreibt Konzepte im Zusammenhang mit Paketen und Frames
  • Abschnitt 13: definiert Modelle für die Übertragung, Neuübertragung und Bestätigung von Daten
  • Abschnitt 14: spezifiziert Regeln zur Verwaltung der Größe von Datagrammen, die QUIC-Pakete tragen

Kodierungsdetails (Encoding Details) - Kodierungsdetails von QUIC-Protokollelementen

  • Abschnitt 15: Versionen (Versions)
  • Abschnitt 16: Ganzzahlkodierung (Integer Encoding)
  • Abschnitt 17: Paket-Header (Packet Headers)
  • Abschnitt 18: Transportparameter (Transport Parameters)
  • Abschnitt 19: Frames
  • Abschnitt 20: Fehler (Errors)

Begleitdokumente

Begleitdokumente beschreiben die Verlusterkennung und Staukontrolle von QUIC [QUIC-RECOVERY] sowie die Verwendung von TLS und anderen kryptografischen Mechanismen [QUIC-TLS].

Dieses Dokument definiert QUIC Version 1, die den Protokollinvarianten in [QUIC-INVARIANTS] entspricht.

Hinweis zu Referenzen:

  • Um auf QUIC Version 1 zu verweisen, zitieren Sie dieses Dokument
  • Um auf den begrenzten Satz versionsunabhängiger Eigenschaften von QUIC zu verweisen, können Sie [QUIC-INVARIANTS] zitieren

1.2. Terms and Definitions (Begriffe und Definitionen)

Die Schlüsselwörter „MUST", „MUST NOT", „REQUIRED", „SHALL", „SHALL NOT", „SHOULD", „SHOULD NOT", „RECOMMENDED", „NOT RECOMMENDED", „MAY" und „OPTIONAL" in diesem Dokument sind wie in BCP 14 [RFC2119] [RFC8174] beschrieben zu interpretieren, wenn und nur wenn sie in Großbuchstaben erscheinen, wie hier gezeigt.

Häufig verwendete Begriffe in diesem Dokument werden im Folgenden beschrieben.

Kernbegriffe

QUIC
Das in diesem Dokument beschriebene Transportprotokoll. QUIC ist ein Name, kein Akronym.

Endpoint (Endpunkt)
Eine Entität, die an einer QUIC-Verbindung teilnehmen kann, indem sie QUIC-Pakete generiert, empfängt und verarbeitet. Es gibt nur zwei Arten von Endpunkten in QUIC: Client und Server.

Client
Der Endpunkt, der eine QUIC-Verbindung initiiert.

Server
Der Endpunkt, der eine QUIC-Verbindung akzeptiert.

QUIC packet (QUIC-Paket)
Eine vollständige verarbeitbare Einheit von QUIC, die in einem UDP-Datagramm gekapselt werden kann. Ein oder mehrere QUIC-Pakete können in einem einzelnen UDP-Datagramm gekapselt werden.

Ack-eliciting packet (Bestätigungsauslösendes Paket)
Ein QUIC-Paket, das andere Frames als ACK, PADDING und CONNECTION_CLOSE enthält. Diese Pakete veranlassen einen Empfänger, eine Bestätigung zu senden; siehe Abschnitt 13.2.1.

Frame
Eine Einheit strukturierter Protokollinformationen. Es gibt mehrere Frame-Typen, von denen jeder unterschiedliche Informationen trägt. Frames sind in QUIC-Paketen enthalten.

Address (Adresse)
Wenn ohne Qualifikation verwendet, das Tupel aus IP-Version, IP-Adresse und UDP-Portnummer, das ein Ende eines Netzwerkpfads darstellt.

Connection ID (Verbindungsidentifikator)
Ein Identifikator, der verwendet wird, um eine QUIC-Verbindung an einem Endpunkt zu identifizieren. Jeder Endpunkt wählt einen oder mehrere Verbindungsidentifikatoren aus, die sein Peer in Pakete einschließen soll, die an den Endpunkt gesendet werden. Dieser Wert ist für den Peer opak.

Stream
Ein unidirektionaler oder bidirektionaler Kanal geordneter Bytes innerhalb einer QUIC-Verbindung. Eine QUIC-Verbindung kann mehrere gleichzeitige Streams tragen.

Application (Anwendung)
Eine Entität, die QUIC zum Senden und Empfangen von Daten verwendet.

Protokollhierarchiebegriffe

Dieses Dokument verwendet die Begriffe „QUIC-Pakete", „UDP-Datagramme" und „IP-Pakete", um sich auf die Einheiten der jeweiligen Protokolle zu beziehen. Das heißt, ein oder mehrere QUIC-Pakete können in einem UDP-Datagramm gekapselt werden, das wiederum in einem IP-Paket gekapselt ist.

+------------------+
| IP Packet |
| +--------------+|
| | UDP Datagram ||
| | +----------+ ||
| | |QUIC Pkt 1| ||
| | +----------+ ||
| | +----------+ ||
| | |QUIC Pkt 2| ||
| | +----------+ ||
| +--------------+|
+------------------+

1.3. Notational Conventions (Notationskonventionen)

Paket- und Frame-Diagramme in diesem Dokument verwenden ein benutzerdefiniertes Format. Der Zweck dieses Formats besteht darin, Protokollelemente zusammenzufassen, nicht zu definieren. Prosa definiert die vollständige Semantik und Details von Strukturen.

Felddarstellungsregeln

Komplexe Felder werden zunächst benannt und dann von einer Liste von Feldern gefolgt, die von einem Paar passender geschweifter Klammern umgeben sind. Jedes Feld in dieser Liste ist durch Kommas getrennt.

Einzelne Felder enthalten Längeninformationen sowie Angaben zu festen Werten, Optionalität oder Wiederholungen. Einzelne Felder verwenden die folgenden Notationskonventionen, wobei alle Längen in Bits angegeben sind:

x (A)
Gibt an, dass x A Bits lang ist

x (i)
Gibt an, dass x einen ganzzahligen Wert enthält, der die in Abschnitt 16 beschriebene Kodierung variabler Länge verwendet

x (A..B)
Gibt an, dass x eine beliebige Länge von A bis B haben kann; A kann weggelassen werden, um ein Minimum von null Bits anzuzeigen, und B kann weggelassen werden, um anzuzeigen, dass keine festgelegte Obergrenze vorhanden ist; Werte in diesem Format enden immer an einer Bytegrenze

x (L) = C
Gibt an, dass x einen festen Wert von C hat; die Länge von x wird durch L beschrieben, das eine der oben genannten Längenformen verwenden kann

x (L) = C..D
Gibt an, dass x einen Wert im Bereich von C bis D hat, einschließlich, mit der durch L beschriebenen Länge, wie oben

[x (L)]
Gibt an, dass x optional ist und eine Länge von L hat

x (L) ...
Gibt an, dass x null oder mehrmals wiederholt wird und jede Instanz eine Länge von L hat

Byte-Reihenfolge und Bit-Reihenfolge

Dieses Dokument verwendet Werte in Netzwerk-Byte-Reihenfolge (Network Byte Order, d.h. Big-Endian). Felder werden beginnend mit den höchstwertigen Bits jedes Bytes platziert.

Konventionell referenzieren einzelne Felder ein komplexes Feld, indem sie den Namen des komplexen Feldes verwenden.

Beispielstruktur

Abbildung 1 zeigt ein Beispiel:

Example Structure {
One-bit Field (1),
7-bit Field with Fixed Value (7) = 61,
Field with Variable-Length Integer (i),
Arbitrary-Length Field (..),
Variable-Length Field (8..24),
Field With Minimum Length (16..),
Field With Maximum Length (..128),
[Optional Field (64)],
Repeated Field (8) ...,
}

Abbildung 1: Beispielformat

Wenn ein Ein-Bit-Feld in Prosa referenziert wird, kann die Position dieses Feldes durch Verwendung des Werts des Bytes, das das Feld trägt, mit gesetztem Feldwert geklärt werden. Beispielsweise könnte der Wert 0x80 verwendet werden, um auf das Ein-Bit-Feld im höchstwertigen Bit des Bytes zu verweisen, wie z.B. One-bit Field in Abbildung 1.


Nächstes Kapitel: 2. Streams - Vertiefen Sie die Stream-Abstraktion von QUIC