6. Négociation de version (Version Negotiation)
Un point de terminaison QUIC qui reçoit un paquet avec un en-tête long et une version qu'il ne comprend pas ou ne supporte pas peut envoyer un paquet de négociation de version (Version Negotiation Packet) en réponse. Les paquets avec un en-tête court ne déclenchent pas de négociation de version.
Un paquet de négociation de version définit le bit de poids fort du premier octet, et se conforme donc au format d'un paquet avec un en-tête long tel que défini dans la section 5.1. Un paquet de négociation de version est identifiable en tant que tel par le champ Version, qui est défini à 0x00000000.
Version Negotiation Packet {
Header Form (1) = 1,
Unused (7),
Version (32) = 0,
Destination Connection ID Length (8),
Destination Connection ID (0..2040),
Source Connection ID Length (8),
Source Connection ID (0..2040),
Supported Version (32) ...,
}
Figure 4 : Paquet de négociation de version
Seul le bit le plus significatif du premier octet d'un paquet de négociation de version a une valeur définie. Les 7 bits restants, étiquetés "Unused" (inutilisé), peuvent être définis à n'importe quelle valeur lors de l'envoi et doivent (MUST) être ignorés à la réception.
Après le champ ID de connexion source, le paquet de négociation de version contient une liste de champs Version supportée (Supported Version Fields), chacun identifiant une version que le point de terminaison envoyant le paquet supporte. Un paquet de négociation de version ne contient aucun autre champ. Un point de terminaison doit (MUST) ignorer un paquet qui ne contient aucun champ Version supportée ou contient une valeur de Version supportée tronquée.
Les paquets de négociation de version n'utilisent pas de protection d'intégrité ou de confidentialité. Les versions spécifiques de QUIC peuvent inclure des éléments de protocole qui permettent aux points de terminaison de détecter des modifications ou des corruptions dans l'ensemble des versions supportées.
Un point de terminaison doit (MUST) inclure la valeur du champ ID de connexion source du paquet qu'il reçoit dans le champ ID de connexion de destination. La valeur du champ ID de connexion source doit (MUST) être copiée du champ ID de connexion de destination du paquet reçu, qui est initialement sélectionné aléatoirement par un client. L'écho des deux ID de connexion donne aux clients une certaine assurance que le serveur a reçu le paquet et que le paquet de négociation de version n'a pas été généré par un attaquant incapable d'observer les paquets.
Un point de terminaison qui reçoit un paquet de négociation de version peut changer la version qu'il décide d'utiliser pour les paquets suivants. Les conditions dans lesquelles un point de terminaison change sa version QUIC dépendront de la version de QUIC qu'il choisit.
Voir [QUIC-TRANSPORT] pour une description plus complète de la façon dont un point de terminaison qui supporte QUIC version 1 génère et consomme un paquet de négociation de version.