Aller au contenu principal

1. Overview (Vue d'ensemble)

QUIC est un protocole de transport sécurisé à usage général. Ce document définit la version 1 de QUIC, qui est conforme aux propriétés indépendantes de la version (Version-Independent Properties) de QUIC définies dans [QUIC-INVARIANTS].

QUIC est un protocole orienté connexion (Connection-Oriented Protocol) qui crée une interaction avec état entre un client et un serveur.

La poignée de main QUIC combine la négociation des paramètres cryptographiques et des paramètres de transport. QUIC intègre la poignée de main TLS [TLS13], bien qu'utilisant un encadrement personnalisé pour protéger les paquets. L'intégration de TLS et QUIC est décrite plus en détail dans [QUIC-TLS]. La structure de la poignée de main est conçue pour permettre l'échange de données d'application dès que possible. Cela inclut une option permettant aux clients d'envoyer des données immédiatement (0-RTT), ce qui nécessite une forme de communication ou de configuration préalable pour être activé.

Les points de terminaison (Endpoints) communiquent dans QUIC en échangeant des paquets QUIC (QUIC Packets). La plupart des paquets contiennent des trames (Frames), qui transportent des informations de contrôle et des données d'application entre les points de terminaison. QUIC authentifie l'intégralité de chaque paquet et chiffre autant que possible chaque paquet. Les paquets QUIC sont transportés dans des datagrammes UDP [UDP] pour faciliter le déploiement dans les systèmes et réseaux existants.

Les protocoles d'application échangent des informations sur une connexion QUIC via des flux (Streams), qui sont des séquences ordonnées d'octets (Ordered Sequences of Bytes). Deux types de flux peuvent être créés : les flux bidirectionnels (Bidirectional Streams), qui permettent aux deux points de terminaison d'envoyer des données ; et les flux unidirectionnels (Unidirectional Streams), qui ne permettent qu'à un seul point de terminaison d'envoyer des données. Un schéma basé sur des crédits (Credit-Based Scheme) est utilisé pour limiter la création de flux et pour borner la quantité de données pouvant être envoyées.

QUIC fournit les retours nécessaires pour implémenter une livraison fiable (Reliable Delivery) et un contrôle de congestion (Congestion Control). Un algorithme de détection et de récupération de la perte de données est décrit dans la section 6 de [QUIC-RECOVERY]. QUIC dépend du contrôle de congestion pour éviter la congestion du réseau. Un algorithme de contrôle de congestion exemplaire est décrit dans la section 7 de [QUIC-RECOVERY].

Les connexions QUIC ne sont pas strictement liées à un seul chemin réseau. La migration de connexion (Connection Migration) utilise des identifiants de connexion (Connection Identifiers) pour permettre aux connexions de se transférer vers un nouveau chemin réseau. Seuls les clients peuvent migrer dans cette version de QUIC. Cette conception permet également aux connexions de continuer après des changements dans la topologie du réseau ou les mappages d'adresses, tels que ceux qui pourraient être causés par une nouvelle liaison NAT (NAT Rebinding).

Une fois établie, plusieurs options sont fournies pour la terminaison de la connexion. Les applications peuvent gérer un arrêt gracieux (Graceful Shutdown), les points de terminaison peuvent négocier une période de délai d'attente, les erreurs peuvent provoquer une déconnexion immédiate, et un mécanisme sans état fournit la terminaison des connexions après qu'un point de terminaison a perdu son état.


1.1. Document Structure (Structure du document)

Ce document décrit le protocole QUIC de base et est structuré comme suit :

Flux (Streams) - L'abstraction de service de base fournie par QUIC

  • Section 2 : décrit les concepts de base liés aux flux
  • Section 3 : fournit un modèle de référence pour les états de flux
  • Section 4 : décrit le fonctionnement du contrôle de flux

Connexions (Connections) - Le contexte dans lequel les points de terminaison QUIC communiquent

  • Section 5 : décrit les concepts de base liés aux connexions
  • Section 6 : décrit la négociation de version (Version Negotiation)
  • Section 7 : détaille le processus d'établissement des connexions
  • Section 8 : décrit la validation d'adresse et les atténuations critiques contre les attaques par déni de service
  • Section 9 : décrit comment les points de terminaison migrent une connexion vers un nouveau chemin réseau
  • Section 10 : liste les options pour terminer une connexion ouverte
  • Section 11 : fournit des conseils pour la gestion des erreurs de flux et de connexion

Paquets et trames (Packets and Frames) - L'unité de base utilisée par QUIC pour communiquer

  • Section 12 : décrit les concepts liés aux paquets et aux trames
  • Section 13 : définit les modèles de transmission, retransmission et accusé de réception des données
  • Section 14 : spécifie les règles de gestion de la taille des datagrammes transportant des paquets QUIC

Détails d'encodage (Encoding Details) - Détails d'encodage des éléments du protocole QUIC

  • Section 15 : Versions
  • Section 16 : Encodage des entiers (Integer Encoding)
  • Section 17 : En-têtes de paquets (Packet Headers)
  • Section 18 : Paramètres de transport (Transport Parameters)
  • Section 19 : Trames (Frames)
  • Section 20 : Erreurs (Errors)

Documents d'accompagnement

Les documents d'accompagnement décrivent la détection de perte et le contrôle de congestion de QUIC [QUIC-RECOVERY], ainsi que l'utilisation de TLS et d'autres mécanismes cryptographiques [QUIC-TLS].

Ce document définit QUIC version 1, qui est conforme aux invariants du protocole dans [QUIC-INVARIANTS].

Note sur les références :

  • Pour faire référence à QUIC version 1, citez ce document
  • Pour faire référence à l'ensemble limité de propriétés indépendantes de la version de QUIC, vous pouvez citer [QUIC-INVARIANTS]

1.2. Terms and Definitions (Termes et définitions)

Les mots-clés « MUST », « MUST NOT », « REQUIRED », « SHALL », « SHALL NOT », « SHOULD », « SHOULD NOT », « RECOMMENDED », « NOT RECOMMENDED », « MAY » et « OPTIONAL » dans ce document doivent être interprétés comme décrit dans BCP 14 [RFC2119] [RFC8174] lorsque, et seulement lorsque, ils apparaissent en majuscules, comme indiqué ici.

Les termes couramment utilisés dans ce document sont décrits ci-dessous.

Termes de base

QUIC
Le protocole de transport décrit par ce document. QUIC est un nom, pas un acronyme.

Endpoint (Point de terminaison)
Une entité qui peut participer à une connexion QUIC en générant, recevant et traitant des paquets QUIC. Il n'y a que deux types de points de terminaison dans QUIC : client et serveur.

Client
Le point de terminaison qui initie une connexion QUIC.

Server (Serveur)
Le point de terminaison qui accepte une connexion QUIC.

QUIC packet (Paquet QUIC)
Une unité complète et traitable de QUIC qui peut être encapsulée dans un datagramme UDP. Un ou plusieurs paquets QUIC peuvent être encapsulés dans un seul datagramme UDP.

Ack-eliciting packet (Paquet provoquant un accusé de réception)
Un paquet QUIC qui contient des trames autres que ACK, PADDING et CONNECTION_CLOSE. Ces paquets provoquent l'envoi d'un accusé de réception par le destinataire ; voir la section 13.2.1.

Frame (Trame)
Une unité d'information de protocole structurée. Il existe plusieurs types de trames, chacun transportant des informations différentes. Les trames sont contenues dans des paquets QUIC.

Address (Adresse)
Lorsqu'utilisé sans qualification, le tuple de version IP, d'adresse IP et de numéro de port UDP qui représente une extrémité d'un chemin réseau.

Connection ID (Identifiant de connexion)
Un identifiant utilisé pour identifier une connexion QUIC à un point de terminaison. Chaque point de terminaison sélectionne un ou plusieurs identifiants de connexion que son pair doit inclure dans les paquets envoyés vers le point de terminaison. Cette valeur est opaque pour le pair.

Stream (Flux)
Un canal unidirectionnel ou bidirectionnel d'octets ordonnés au sein d'une connexion QUIC. Une connexion QUIC peut transporter plusieurs flux simultanés.

Application
Une entité qui utilise QUIC pour envoyer et recevoir des données.

Termes de hiérarchie de protocole

Ce document utilise les termes « paquets QUIC », « datagrammes UDP » et « paquets IP » pour faire référence aux unités des protocoles respectifs. C'est-à-dire qu'un ou plusieurs paquets QUIC peuvent être encapsulés dans un datagramme UDP, qui est à son tour encapsulé dans un paquet IP.

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

1.3. Notational Conventions (Conventions de notation)

Les diagrammes de paquets et de trames dans ce document utilisent un format personnalisé. Le but de ce format est de résumer, et non de définir, les éléments du protocole. La prose définit la sémantique complète et les détails des structures.

Règles de représentation des champs

Les champs complexes sont nommés puis suivis d'une liste de champs entourée d'une paire d'accolades correspondantes. Chaque champ de cette liste est séparé par des virgules.

Les champs individuels incluent des informations de longueur, ainsi que des indications sur la valeur fixe, l'optionnalité ou les répétitions. Les champs individuels utilisent les conventions de notation suivantes, toutes les longueurs étant en bits :

x (A)
Indique que x a une longueur de A bits

x (i)
Indique que x contient une valeur entière utilisant l'encodage de longueur variable décrit dans la section 16

x (A..B)
Indique que x peut avoir n'importe quelle longueur de A à B ; A peut être omis pour indiquer un minimum de zéro bit, et B peut être omis pour indiquer qu'il n'y a pas de limite supérieure définie ; les valeurs dans ce format se terminent toujours sur une limite d'octet

x (L) = C
Indique que x a une valeur fixe de C ; la longueur de x est décrite par L, qui peut utiliser n'importe quelle forme de longueur ci-dessus

x (L) = C..D
Indique que x a une valeur dans la plage de C à D, inclusivement, avec la longueur décrite par L, comme ci-dessus

[x (L)]
Indique que x est optionnel et a une longueur de L

x (L) ...
Indique que x est répété zéro fois ou plus et que chaque instance a une longueur de L

Ordre des octets et ordre des bits

Ce document utilise des valeurs en ordre des octets réseau (Network Byte Order, c'est-à-dire big-endian). Les champs sont placés en commençant par les bits de poids fort de chaque octet.

Par convention, les champs individuels référencent un champ complexe en utilisant le nom du champ complexe.

Structure d'exemple

La figure 1 fournit un exemple :

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) ...,
}

Figure 1 : Format d'exemple

Lorsqu'un champ d'un seul bit est référencé dans la prose, la position de ce champ peut être clarifiée en utilisant la valeur de l'octet qui porte le champ avec la valeur du champ définie. Par exemple, la valeur 0x80 pourrait être utilisée pour faire référence au champ d'un seul bit dans le bit le plus significatif de l'octet, tel que One-bit Field dans la figure 1.


Chapitre suivant : 2. Streams (Flux) - Approfondir l'abstraction de flux de QUIC