Características de QUIC
- Todos los paquetes están cifrados y el protocolo de enlace se autentica mediante TLS 1.3.
- Secuencias paralelas de datos de aplicación confiables y no confiables.
- Intercambio de datos de aplicación en el primer viaje de ida y vuelta (0-RTT).
- Control de congestión y recuperación de pérdidas mejorados.
- Sobrevive a un cambio de dirección IP o puerto del cliente.
- Equilibrio de carga sin estado.
- Fácilmente ampliable para nuevas características y extensiones.
Implementación de MsQuic
Además de estar adaptado para su uso con títulos del GDK, MsQuic tiene varias características que lo diferencian de otras implementaciones de QUIC:- Optimizado para cliente y servidor.
- Optimizado para lograr el máximo rendimiento y la mínima latencia.
- E/S asincrónica.
- Compatibilidad con el ajuste de escala en el lado de recepción (RSS).
- Compatibilidad con la fusión de envíos y recepciones UDP.
Adquisición de MsQuic
Microsoft hospeda MsQuic en un repositorio de GitHub de código abierto. Debe adquirir MsQuic mediante una de sus versiones oficiales ubicadas aquí. La compatibilidad con las consolas XBOX Series X|S se agregó en prerelease/1.9, aunque se recomienda usar la versión oficial más reciente cuando sea posible para los títulos del GDK. Puede encontrar binarios precompilados de MsQuic para una versión determinada en la sección Assets de cada versión concreta. Todas las variantes de compilación de una versión determinada de MsQuic son totalmente compatibles entre sí. Aunque MsQuic también intenta mantener la compatibilidad con versiones anteriores en sus lanzamientos, consulte la documentación y las notas de la versión de MsQuic para conocer las expectativas de compatibilidad entre las distintas versiones.Títulos de PC basados en el GDK
Use el binario precompiladomsquic_windows_x64_Release_openssl para los títulos de PC basados en el GDK.
Los títulos del GDK en PC se ejecutan como aplicaciones Win32 x64 nativas. Use la versión de MsQuic compilada para la plataforma x64. En PC, use la versión de MsQuic compilada con OpenSSL, ya que es compatible con todas las versiones del sistema operativo que admite el GDK. La versión que usa Schannel solo es compatible con el sistema operativo Windows 11 y posteriores.
Títulos de consola basados en el GDK
Use el binario precompiladomsquic_gamecore_console_x64_Release_schannel para los títulos de consola basados en el GDK.
MsQuic proporciona una variante de compilación especial para los títulos basados en el GDK en las consolas XBOX. Esta variante restringe MsQuic a las API incluidas en WINAPI_PARTITION_GAMES y hace que MsQuic se vincule con XGamePlatform.lib. Para consumir esta variante de compilación, debe instalar el XGDK de la versión de octubre de 2021 o posterior. MsQuic usa Schannel al compilar para títulos de consola basados en el GDK.
Autenticación de cliente y servidor
MsQuic utiliza automáticamente las mismas rutas de autenticación y comprobación que se usan para las solicitudes web HTTPS a fin de autenticar su servidor. La autenticación de clientes debe seguir los procedimientos recomendados descritos en procedimientos recomendados para la comunicación cliente/servidor segura (tema con NDA). En MsQuic, tanto en el cliente como en el servidor, debe usar la API ConfigurationLoadCredential con un QUIC_CREDENTIAL_CONFIG apropiado para configurar sus certificados. Todos los conjuntos de cifrado incluidos de forma predeterminada en MsQuic se consideran seguros, pero es importante configurar correctamente cómo MsQuic valida los certificados tanto en el cliente como en el servidor para garantizar que se establece un canal de comunicación seguro y autenticado. En el servidor, para usar la autenticación de clientes con tokens XSTS, debe especificar las marcasQUIC_CREDENTIAL_FLAG_REQUIRE_CLIENT_AUTHENTICATION, QUIC_CREDENTIAL_FLAG_INDICATE_CERTIFICATE_RECEIVED y QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION. Cuando especifica la marca QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION, debe validar usted mismo el certificado del cliente dentro de la devolución de llamada del evento QUIC_CONNECTION_EVENT_PEER_CERTIFICATE_RECEIVED, como se describe en la sección procedimientos recomendados para la comunicación cliente/servidor segura (tema con NDA).
Además, en el servidor, debe proporcionar un certificado con una raíz de confianza adecuada para permitir que el cliente autentique su servidor tal como lo haría en un servidor web HTTPS.
En el cliente, nunca debe especificar la marca QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION, ya que el comportamiento predeterminado de MsQuic para la autenticación del servidor es la forma más sencilla y segura de validar la identidad. En su lugar, para la autenticación de clientes con tokens XSTS, debe especificar la marca QUIC_CREDENTIAL_FLAG_CLIENT junto con el certificado generado por su servidor, como se describe en la sección procedimientos recomendados para la comunicación cliente/servidor segura (tema con NDA). Se recomienda proporcionar el certificado de cliente especificando el modo QUIC_CREDENTIAL_TYPE_CERTIFICATE_CONTEXT y usando API como CertCreateContext para generar el contexto directamente a partir de los datos de respuesta de su solicitud web.
Inicialización de red
MsQuic no controla automáticamente la inicialización de red para los títulos del GDK. Espere a que la red se inicialice después de iniciar el título y después de cada reanudación antes de inicializar MsQuic mediante MsQuicOpenVersion o MsQuicOpen.Suspensión y reanudación
Regístrese para los eventos de suspensión y reanudación medianteRegisterAppStateChangeNotification. Al suspender, cierre todas las secuencias abiertas y cierre MsQuic. Después, al reanudar, espere a la inicialización de red y vuelva a abrir MsQuic.
Para cerrar rápidamente todas las secuencias de MsQuic dentro del tiempo de espera de suspensión, para cada secuencia abierta, llame a StreamShutdown con las marcas QUIC_STREAM_SHUTDOWN_FLAG_ABORT y QUIC_STREAM_SHUTDOWN_FLAG_IMMEDIATE. Esta llamada desencadena inmediatamente un evento QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE. En este punto, es seguro llamar a StreamClose para cerrar la secuencia. Una vez cerradas todas las secuencias de una conexión determinada, llame a ConnectionShutdown con la marca QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT, seguido de ConnectionClose. Después de cerrar todas las conexiones, llame a RegistrationClose y ConfigurationClose para todos los registros y configuraciones pendientes, seguido de MsQuicClose.
Puerto preferido
Use el puerto multijugador UDP local preferido para el tráfico principal del juego en los títulos del GDK. Establezca este puerto en MsQuic mediante la función SetParam con la opciónQUIC_PARAM_CONN_LOCAL_ADDRESS en un identificador de objeto de conexión antes de llamar a ConnectionStart.
Cuando establezca QUIC_PARAM_CONN_LOCAL_ADDRESS, especifique la familia AF_UNSPEC para permitir sockets de doble pila IPv4 e IPv6. El ejemplo siguiente muestra cómo establecer el puerto preferido cuando MsQuicOpen devuelve MsQuicCallTable y ConnectionOpen devuelve MsQuicConnectionHandle.
