> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# MsQuic

> MsQuic

Este artículo describe cómo usar [MsQuic](https://github.com/microsoft/msquic) con el Microsoft Game Development Kit (GDK). MsQuic es una implementación de Microsoft del protocolo [QUIC del IETF](https://datatracker.ietf.org/wg/quic/about/). 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](https://github.com/microsoft/msquic/blob/main/docs/API.md) 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:

* [RFC 9000](https://datatracker.ietf.org/doc/html/rfc9000)
* [RFC 9001](https://datatracker.ietf.org/doc/html/rfc9001)
* [RFC 9002](https://datatracker.ietf.org/doc/html/rfc9002)

MsQuic implementa las siguientes extensiones en borrador de QUIC:

* [Datagram](https://datatracker.ietf.org/doc/html/draft-ietf-quic-datagram)
* [Version Negotiation](https://datatracker.ietf.org/doc/html/draft-ietf-quic-version-negotiation)
* [Load Balancing](https://datatracker.ietf.org/doc/html/draft-ietf-quic-load-balancers)
* [ACK Frequency](https://datatracker.ietf.org/doc/html/draft-ietf-quic-ack-frequency)
* [Perf Testing](https://datatracker.ietf.org/doc/html/draft-banks-quic-performance)

## 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í](https://github.com/microsoft/msquic/blob/main/docs/Release.md). 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](https://github.com/microsoft/msquic/releases) 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.

<a id="ClientServerAuthentication" />

## 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)](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/game-principles/security/communication-security/communication-security-impl/gc-secure-game-mesh-impl#ClientAuthentication).

En MsQuic, tanto en el cliente como en el servidor, debe usar la API [ConfigurationLoadCredential](https://github.com/microsoft/msquic/blob/main/docs/api/ConfigurationLoadCredential.md) con un [QUIC\_CREDENTIAL\_CONFIG](https://github.com/microsoft/msquic/blob/main/docs/api/QUIC_CREDENTIAL_CONFIG.md) 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](https://github.com/microsoft/msquic/blob/main/docs/api/QUIC_CONNECTION_EVENT.md#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)](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/game-principles/security/communication-security/communication-security-impl/gc-secure-game-mesh-impl#ClientAuthentication).

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)](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/game-principles/security/communication-security/communication-security-impl/gc-secure-game-mesh-impl#ClientAuthentication). Se recomienda proporcionar el certificado de cliente especificando el modo `QUIC_CREDENTIAL_TYPE_CERTIFICATE_CONTEXT` y usando API como [CertCreateContext](https://learn.microsoft.com/windows/win32/api/wincrypt/nf-wincrypt-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](/build/console-features/networking/initialization-connectivity-networking) 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](https://github.com/microsoft/msquic/blob/main/docs/api/MsQuicOpenVersion.md) o [MsQuicOpen](https://github.com/microsoft/msquic/blob/main/docs/api/MsQuicOpen.md).

<a id="SuspendResume" />

## 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](https://github.com/microsoft/msquic/blob/main/docs/api/StreamShutdown.md) 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](https://github.com/microsoft/msquic/blob/main/docs/api/StreamClose.md) para cerrar la secuencia. Una vez cerradas todas las secuencias de una conexión determinada, llame a [ConnectionShutdown](https://github.com/microsoft/msquic/blob/main/docs/api/ConnectionShutdown.md) con la marca `QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT`, seguido de [ConnectionClose](https://github.com/microsoft/msquic/blob/main/docs/api/ConnectionClose.md). Después de cerrar todas las conexiones, llame a [RegistrationClose](https://github.com/microsoft/msquic/blob/main/docs/api/RegistrationClose.md) y [ConfigurationClose](https://github.com/microsoft/msquic/blob/main/docs/api/ConfigurationClose.md) para todos los registros y configuraciones pendientes, seguido de [MsQuicClose](https://github.com/microsoft/msquic/blob/main/docs/api/MsQuicClose.md).

## Puerto preferido

Use el [puerto multijugador UDP local preferido](/build/console-features/networking/game-mesh/preferred-local-udp-multiplayer-port-networking) para el tráfico principal del juego en los títulos del GDK. Establezca este puerto en MsQuic mediante la función [SetParam](https://github.com/microsoft/msquic/blob/main/docs/api/SetParam.md) con la opción `QUIC_PARAM_CONN_LOCAL_ADDRESS` en un identificador de objeto de conexión antes de llamar a [ConnectionStart](https://github.com/microsoft/msquic/blob/main/docs/api/ConnectionStart.md).

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](https://github.com/microsoft/msquic/blob/main/docs/api/MsQuicOpen.md) devuelve `MsQuicCallTable` y [ConnectionOpen](https://github.com/microsoft/msquic/blob/main/docs/api/ConnectionOpen.md) devuelve `MsQuicConnectionHandle`.

```text theme={null}
uint16_t preferredPort;
if (SUCCEEDED(XNetworkingQueryPreferredLocalUdpMultiplayerPort(&preferredPort)))
{
    QUIC_ADDR localAddress = {};
    localAddress.si_family = AF_UNSPEC;
    localAddress.Ipv4.sin_port = htons(preferredPort);

    QUIC_STATUS status = MsQuicCallTable->SetParam(
        MsQuicConnectionHandle,
        QUIC_PARAM_LEVEL_CONNECTION,
        QUIC_PARAM_CONN_LOCAL_ADDRESS,
        sizeof(localAddress),
        &localAddress);
}
```

## 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](/build/console-features/networking/game-mesh/winsock-intro-networking#SocketMemory), 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](https://github.com/microsoft/msquic/blob/main/docs/Streams.md#send-buffering) 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](https://github.com/microsoft/msquic/blob/main/docs/Streams.md#receiving) 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](https://github.com/microsoft/msquic)

[Documentación de la API de MsQuic](https://github.com/microsoft/msquic/blob/main/docs/API.md)

[Versiones de MsQuic](https://github.com/microsoft/msquic/blob/main/docs/Release.md)

[Documentación de compilación de MsQuic](https://github.com/microsoft/msquic/blob/main/docs/BUILD.md)

[Ejemplo de servidor PlayFab de eco de MsQuic](https://github.com/microsoft/Xbox-GDK-Samples/tree/main/Samples/Live/MsQuicEcho)


## Related topics

- [Malla de juego](/es/build/console-features/networking/game-mesh/game-mesh-toc.md)
- [Redes en consolas XBOX con el GDK](/es/build/console-features/networking/index.md)
- [Redes de malla de juego para títulos de XBOX](/es/build/console-features/networking/game-mesh/index.md)
- [Introducción a las redes del Microsoft Game Development Kit](/es/build/console-features/networking/introduction-networking.md)
- [Estados de energía dinámicos (DPS)](/es/build/game-principles/sustainability/dynamic-power-states.md)
