5. Paquets QUIC (QUIC Packets)
Les points de terminaison QUIC échangent des datagrammes UDP contenant un ou plusieurs paquets QUIC. Cette section décrit les caractéristiques invariantes d'un paquet QUIC. Une version de QUIC pourrait permettre plusieurs paquets QUIC dans un seul datagramme UDP, mais les propriétés invariantes ne décrivent que le premier paquet d'un datagramme.
QUIC définit deux types d'en-têtes de paquet (Packet Headers) : long et court. Les paquets avec un en-tête long sont identifiés par le bit le plus significatif (Most Significant Bit) du premier octet étant défini ; les paquets avec un en-tête court ont ce bit effacé.
Les paquets QUIC peuvent être protégés en intégrité (Integrity Protected), y compris l'en-tête. Cependant, les paquets de négociation de version QUIC (Version Negotiation Packets) ne sont pas protégés en intégrité ; voir la section 6.
Outre les valeurs décrites ici, la charge utile (Payload) des paquets QUIC est spécifique à la version (Version-Specific) et de longueur arbitraire (Arbitrary Length).
5.1 En-tête long (Long Header)
Les en-têtes longs prennent la forme décrite dans la figure 2.
Long Header Packet {
Header Form (1) = 1,
Version-Specific Bits (7),
Version (32),
Destination Connection ID Length (8),
Destination Connection ID (0..2040),
Source Connection ID Length (8),
Source Connection ID (0..2040),
Version-Specific Data (..),
}
Figure 2 : En-tête long QUIC
Un paquet QUIC avec un en-tête long a le bit de poids fort du premier octet défini à 1. Tous les autres bits de cet octet sont spécifiques à la version.
Les quatre octets suivants incluent un champ Version de 32 bits (Version Field). Les versions sont décrites dans la section 5.4.
L'octet suivant contient la longueur en octets du champ ID de connexion de destination (Destination Connection ID Field) qui le suit. Cette longueur est encodée comme un entier non signé de 8 bits. Le champ ID de connexion de destination suit le champ Longueur de l'ID de connexion de destination et mesure entre 0 et 255 octets. Les ID de connexion sont décrits dans la section 5.3.
L'octet suivant contient la longueur en octets du champ ID de connexion source (Source Connection ID Field) qui le suit. Cette longueur est encodée comme un entier non signé de 8 bits. Le champ ID de connexion source suit le champ Longueur de l'ID de connexion source et mesure entre 0 et 255 octets.
Le reste du paquet contient un contenu spécifique à la version.
5.2 En-tête court (Short Header)
Les en-têtes courts prennent la forme décrite dans la figure 3.
Short Header Packet {
Header Form (1) = 0,
Version-Specific Bits (7),
Destination Connection ID (..),
Version-Specific Data (..),
}
Figure 3 : En-tête court QUIC
Un paquet QUIC avec un en-tête court a le bit de poids fort du premier octet défini à 0.
Un paquet QUIC avec un en-tête court inclut un ID de connexion de destination immédiatement après le premier octet. L'en-tête court n'inclut pas les champs Longueur de l'ID de connexion de destination, Longueur de l'ID de connexion source, ID de connexion source ou Version. La longueur de l'ID de connexion de destination n'est pas encodée dans les paquets avec un en-tête court et n'est pas contrainte par cette spécification.
Le reste du paquet a une sémantique spécifique à la version.
5.3 ID de connexion (Connection ID)
Un ID de connexion (Connection ID) est un champ opaque (Opaque Field) de longueur arbitraire.
La fonction principale d'un ID de connexion est de garantir que les changements d'adressage aux couches de protocole inférieures (UDP, IP et en dessous) ne causent pas la livraison de paquets pour une connexion QUIC au mauvais point de terminaison QUIC. L'ID de connexion est utilisé par les points de terminaison et les intermédiaires (Intermediaries) qui les supportent pour garantir que chaque paquet QUIC peut être livré à l'instance correcte d'un point de terminaison. Au point de terminaison, l'ID de connexion est utilisé pour identifier la connexion QUIC à laquelle le paquet est destiné.
L'ID de connexion est choisi par chaque point de terminaison en utilisant des méthodes spécifiques à la version. Les paquets pour la même connexion QUIC peuvent utiliser différentes valeurs d'ID de connexion.
5.4 Version
Le champ Version (Version Field) contient un identifiant de 4 octets. Cette valeur peut être utilisée par les points de terminaison pour identifier une version de QUIC. Un champ Version avec une valeur de 0x00000000 est réservé pour la négociation de version ; voir la section 6. Toutes les autres valeurs sont potentiellement valides.
Les propriétés décrites dans ce document s'appliquent à toutes les versions de QUIC. Un protocole qui ne se conforme pas aux propriétés décrites dans ce document n'est pas QUIC. Les documents futurs pourraient décrire des propriétés supplémentaires qui s'appliquent à une version spécifique de QUIC ou à une plage de versions QUIC.