Skip to main content
Este artículo describe cómo usar MsQuic con el Microsoft Game Development Kit (GDK). MsQuic es una implementación de Microsoft del protocolo QUIC del IETF. Es multiplataforma, está escrita en C y está diseñada para ser una biblioteca QUIC de propósito general. QUIC se diseñó originalmente para reemplazar los escenarios que usan “TLS sobre TCP”, como HTTP. Los desarrolladores lo ampliaron hasta convertirlo en una capa de transporte de datos UDP de propósito general, adecuada para multiplexar mensajes de datagramas no confiables en tiempo real y secuencias confiables de tipo TCP sobre una única conexión. Este diseño lo hace especialmente atractivo como capa de transporte cliente/servidor y como base para los flujos de datos de tráfico de juego en tiempo real. MsQuic está adaptado para los títulos del GDK y también está disponible para multitud de plataformas, incluidas Windows Server, Linux de escritorio y servidor, iOS, Android y macOS. La documentación de la API de MsQuic cubre muchos conceptos importantes de MsQuic y muestra cómo programar con la superficie de la API de MsQuic.

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.
MsQuic implementa las siguientes RFC de QUIC: MsQuic implementa las siguientes extensiones en borrador de QUIC:

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 precompilado msquic_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 precompilado msquic_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 marcas QUIC_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 mediante RegisterAppStateChangeNotification. 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ón QUIC_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.

Consideraciones sobre la memoria

La implementación de alto rendimiento de MsQuic permite transferir grandes anchos de banda hacia y desde su título del GDK. Como extensión de las Consideraciones sobre la memoria de WinSock, cuando use MsQuic siga estos procedimientos recomendados para minimizar el consumo de memoria del kernel: Los títulos del GDK deben mantener al mínimo el tiempo de ejecución dentro de la devolución de llamada. MsQuic no usa subprocesos independientes para la ejecución del protocolo y las llamadas ascendentes a la aplicación. Por lo tanto, cualquier retraso significativo en la devolución de llamada retrasará el protocolo y aumentará el consumo de memoria requerido por el kernel. Cualquier trabajo o tiempo significativo que el título deba completar debe realizarse en su propio subproceso. Los títulos del GDK deben administrar sus búferes de envío de manera eficiente para reducir el uso de memoria del kernel. Para obtener más información, consulte Almacenamiento en búfer de envío en MsQuic para saber cómo MsQuic permite que su título controle este comportamiento. Se recomienda encarecidamente usar recepciones asincrónicas con MsQuic para garantizar que los datos recibidos se transfieran de manera eficiente a los búferes de modo usuario. Recepción en MsQuic contiene detalles adicionales acerca de cómo controlar las recepciones asincrónicas. Además, no use la característica de aceptación parcial de datos en los clientes de MsQuic del GDK, a fin de minimizar la cantidad de memoria del kernel consumida.

Consulte también

MsQuic Documentación de la API de MsQuic Versiones de MsQuic Documentación de compilación de MsQuic Ejemplo de servidor PlayFab de eco de MsQuic
Última modificación el 28 de agosto de 2026