Fonctionnalités de QUIC
- Tous les paquets sont chiffrés et la négociation est authentifiée à l’aide de TLS 1.3.
- Flux parallèles de données d’application fiables et non fiables.
- Échange de données d’application dès le premier aller-retour (0-RTT).
- Contrôle de congestion et récupération des pertes améliorés.
- Résistance à un changement d’adresse IP ou de port du client.
- Équilibrage de charge sans état.
- Facilement extensible pour de nouvelles fonctionnalités et extensions.
Implémentation de MsQuic
En plus d’être adapté aux titres GDK, MsQuic possède plusieurs fonctionnalités qui le distinguent des autres implémentations de QUIC :- Optimisé pour le client et le serveur.
- Optimisé pour un débit maximal et une latence minimale.
- E/S asynchrones.
- Prise en charge de la mise à l’échelle côté réception (RSS).
- Prise en charge de la fusion des envois et réceptions UDP.
Obtention de MsQuic
Microsoft héberge MsQuic dans un dépôt GitHub open source. Vous devez obtenir MsQuic via l’une de ses versions officielles disponibles ici. La prise en charge des consoles XBOX Series X|S a été ajoutée dans la version prerelease/1.9, mais nous vous recommandons d’utiliser la dernière version officielle lorsque cela est possible pour les titres GDK. Vous trouverez des binaires MsQuic prégénérés pour une version donnée dans la section Assets de cette version. Toutes les variantes de build d’une version donnée de MsQuic sont entièrement compatibles entre elles. Bien que MsQuic s’efforce également de maintenir la rétrocompatibilité entre ses versions, consultez la documentation et les notes de publication de MsQuic pour connaître les attentes de compatibilité entre les différentes versions.Titres PC basés sur le GDK
Utilisez le binaire prégénérémsquic_windows_x64_Release_openssl pour les titres PC basés sur le GDK.
Les titres GDK sur PC s’exécutent en tant qu’applications Win32 x64 natives. Utilisez la version de MsQuic générée pour la plateforme x64. Sur PC, utilisez la version de MsQuic générée avec OpenSSL, car elle prend en charge toutes les versions de système d’exploitation prises en charge par le GDK. La version qui utilise Schannel ne prend en charge que Windows 11 et versions ultérieures.
Titres console basés sur le GDK
Utilisez le binaire prégénérémsquic_gamecore_console_x64_Release_schannel pour les titres console basés sur le GDK.
MsQuic fournit une variante de build spéciale pour les titres basés sur le GDK sur les consoles XBOX. Cette variante limite MsQuic aux API de WINAPI_PARTITION_GAMES et lie MsQuic à XGamePlatform.lib. Pour utiliser cette variante de build, vous devez installer le XGDK d’octobre 2021 ou d’une version ultérieure. MsQuic utilise Schannel lors de la génération pour les titres console basés sur le GDK.
Authentification du client et du serveur
MsQuic utilise automatiquement les mêmes chemins d’authentification et de vérification que ceux utilisés pour les requêtes web HTTPS afin d’authentifier votre serveur. L’authentification du client doit suivre les bonnes pratiques décrites dans Bonnes pratiques pour une communication client/serveur sécurisée (rubrique sous NDA). Dans MsQuic, sur le client comme sur le serveur, vous devez utiliser l’API ConfigurationLoadCredential avec une structure QUIC_CREDENTIAL_CONFIG appropriée afin de configurer vos certificats. Toutes les suites de chiffrement incluses par défaut dans MsQuic sont considérées comme sécurisées, mais il est important de configurer correctement la façon dont MsQuic valide les certificats sur le client et sur le serveur pour garantir l’établissement d’un canal de communication sécurisé et authentifié. Sur le serveur, pour utiliser l’authentification du client par jeton XSTS, vous devez spécifier les indicateursQUIC_CREDENTIAL_FLAG_REQUIRE_CLIENT_AUTHENTICATION, QUIC_CREDENTIAL_FLAG_INDICATE_CERTIFICATE_RECEIVED et QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION. Lorsque vous spécifiez l’indicateur QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION, vous devez valider vous-même le certificat du client dans le rappel d’événement QUIC_CONNECTION_EVENT_PEER_CERTIFICATE_RECEIVED, comme décrit dans la section Bonnes pratiques pour une communication client/serveur sécurisée (rubrique sous NDA).
De plus, sur le serveur, vous devez fournir un certificat correctement rattaché à une racine afin de permettre au client d’authentifier votre serveur, comme vous le feriez pour un serveur web HTTPS.
Sur le client, vous ne devez jamais spécifier l’indicateur QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION, car le comportement par défaut de MsQuic pour l’authentification du serveur est le moyen le plus simple et le plus sûr de valider l’identité. Pour l’authentification du client par jeton XSTS, spécifiez plutôt l’indicateur QUIC_CREDENTIAL_FLAG_CLIENT ainsi que le certificat généré par votre serveur, comme décrit dans la section Bonnes pratiques pour une communication client/serveur sécurisée (rubrique sous NDA). Nous vous recommandons de fournir le certificat du client en spécifiant le mode QUIC_CREDENTIAL_TYPE_CERTIFICATE_CONTEXT et en utilisant des API telles que CertCreateContext pour générer le contexte directement à partir des données de réponse de votre requête web.
Initialisation du réseau
MsQuic ne gère pas automatiquement l’initialisation du réseau pour les titres GDK. Attendez que le réseau soit initialisé après le lancement de votre titre et après chaque reprise avant d’initialiser MsQuic à l’aide de MsQuicOpenVersion ou MsQuicOpen.Suspension et reprise
Inscrivez-vous aux événements de suspension et de reprise à l’aide deRegisterAppStateChangeNotification. Lors de la suspension, fermez tous les flux ouverts, puis fermez MsQuic. Ensuite, lors de la reprise, attendez l’initialisation du réseau, puis rouvrez MsQuic.
Pour fermer rapidement tous les flux MsQuic dans le délai de suspension, appelez StreamShutdown pour chaque flux ouvert avec les indicateurs QUIC_STREAM_SHUTDOWN_FLAG_ABORT et QUIC_STREAM_SHUTDOWN_FLAG_IMMEDIATE. Cet appel déclenche immédiatement un événement QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE. À ce stade, vous pouvez appeler StreamClose en toute sécurité pour fermer le flux. Une fois tous les flux d’une connexion donnée fermés, appelez ConnectionShutdown avec l’indicateur QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT, puis ConnectionClose. Après avoir fermé toutes les connexions, appelez RegistrationClose et ConfigurationClose pour les inscriptions et configurations restantes, puis MsQuicClose.
Port préféré
Utilisez le port multijoueur UDP local préféré pour le trafic de jeu principal dans les titres GDK. Définissez ce port dans MsQuic à l’aide de la fonction SetParam avec le paramètreQUIC_PARAM_CONN_LOCAL_ADDRESS sur un handle d’objet de connexion avant d’appeler ConnectionStart.
Lorsque vous définissez QUIC_PARAM_CONN_LOCAL_ADDRESS, spécifiez la famille AF_UNSPEC pour autoriser les sockets double pile IPv4 et IPv6. L’exemple suivant montre comment définir le port préféré lorsque MsQuicCallTable est retourné par MsQuicOpen et que MsQuicConnectionHandle est retourné par ConnectionOpen.
