Recursos do QUIC
- Todos os pacotes são criptografados e o handshake é autenticado usando TLS 1.3.
- Fluxos paralelos de dados de aplicativo confiáveis e não confiáveis.
- Troca de dados de aplicativo na primeira viagem de ida e volta (0-RTT).
- Controle de congestionamento e recuperação de perdas aprimorados.
- Resistência a uma alteração no endereço IP ou na porta do cliente.
- Balanceamento de carga sem estado.
- Facilmente extensível para novos recursos e extensões.
Implementação do MsQuic
Além de ser adaptado para uso com títulos do GDK, o MsQuic tem vários recursos que o diferenciam de outras implementações do QUIC:- Otimizado para cliente e servidor.
- Otimizado para máxima taxa de transferência e mínima latência.
- E/S assíncrona.
- Suporte a RSS (Receive Side Scaling).
- Suporte ao agrupamento de envios e recebimentos UDP.
Como obter o MsQuic
A Microsoft hospeda o MsQuic em um repositório de código aberto no GitHub. Você deve obter o MsQuic por meio de uma de suas versões oficiais, localizadas aqui. O suporte ao console XBOX Series X|S foi adicionado na versão prerelease/1.9, mas recomendamos que você use a versão oficial mais recente sempre que possível para títulos do GDK. Você pode encontrar binários pré-compilados do MsQuic para uma determinada versão na seção Assets dessa versão. Todos os tipos de build de uma determinada versão do MsQuic são totalmente compatíveis entre si. Embora o MsQuic também tente manter a compatibilidade com versões anteriores, consulte a documentação e as notas de versão do MsQuic para conhecer as expectativas de compatibilidade entre diferentes versões.Títulos de PC baseados no GDK
Use o binário pré-compiladomsquic_windows_x64_Release_openssl para títulos de PC baseados no GDK.
Os títulos do GDK no PC são executados como aplicativos Win32 x64 nativos. Use a versão do MsQuic compilada para a plataforma x64. No PC, use a versão do MsQuic compilada com OpenSSL, pois ela dá suporte a todas as versões do sistema operacional compatíveis com o GDK. A versão que usa Schannel só dá suporte ao Windows 11 e posteriores.
Títulos de console baseados no GDK
Use o binário pré-compiladomsquic_gamecore_console_x64_Release_schannel para títulos de console baseados no GDK.
O MsQuic fornece um tipo de build especial para títulos baseados no GDK em consoles XBOX. Esse tipo restringe o MsQuic às APIs em WINAPI_PARTITION_GAMES e faz com que o MsQuic seja vinculado a XGamePlatform.lib. Para consumir esse tipo de build, você deve instalar o XGDK da versão de outubro de 2021 ou posterior. O MsQuic usa Schannel ao compilar para títulos de console baseados no GDK.
Autenticação de cliente e servidor
O MsQuic utiliza automaticamente os mesmos caminhos de autenticação e verificação usados em solicitações da Web HTTPS para autenticar seu servidor. A autenticação do cliente deve seguir as práticas recomendadas descritas em práticas recomendadas para comunicação segura entre cliente/servidor (tópico sob NDA). No MsQuic, tanto no cliente quanto no servidor, você deve usar a API ConfigurationLoadCredential com um QUIC_CREDENTIAL_CONFIG apropriado para configurar seus certificados. Todos os conjuntos de criptografia incluídos por padrão no MsQuic são considerados seguros, mas é importante configurar corretamente a forma como o MsQuic valida os certificados no cliente e no servidor para garantir que um canal de comunicação seguro e autenticado seja estabelecido. No servidor, para usar a autenticação de cliente com token XSTS, você deve especificar os sinalizadoresQUIC_CREDENTIAL_FLAG_REQUIRE_CLIENT_AUTHENTICATION, QUIC_CREDENTIAL_FLAG_INDICATE_CERTIFICATE_RECEIVED e QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION. Ao especificar o sinalizador QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION, você mesmo deve validar o certificado do cliente no retorno de chamada do evento QUIC_CONNECTION_EVENT_PEER_CERTIFICATE_RECEIVED, conforme descrito na seção práticas recomendadas para comunicação segura entre cliente/servidor (tópico sob NDA).
Além disso, no servidor, você deve fornecer um certificado com raiz adequada para permitir que o cliente autentique seu servidor, assim como faria em um servidor Web HTTPS.
No cliente, você nunca deve especificar o sinalizador QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION, pois o comportamento padrão do MsQuic para autenticação do servidor é a maneira mais fácil e segura de validar a identidade. Em vez disso, para a autenticação de cliente com token XSTS, você deve especificar o sinalizador QUIC_CREDENTIAL_FLAG_CLIENT junto com o certificado gerado pelo seu servidor, conforme descrito na seção práticas recomendadas para comunicação segura entre cliente/servidor (tópico sob NDA). Recomendamos fornecer o certificado do cliente especificando o modo QUIC_CREDENTIAL_TYPE_CERTIFICATE_CONTEXT e usando APIs como CertCreateContext para gerar o contexto diretamente a partir dos dados de resposta da sua solicitação da Web.
Inicialização da rede
O MsQuic não lida automaticamente com a inicialização da rede para títulos do GDK. Aguarde a inicialização da rede depois que o título for iniciado e após cada retomada antes de inicializar o MsQuic usando MsQuicOpenVersion ou MsQuicOpen.Suspensão e retomada
Registre-se para receber eventos de suspensão e retomada usandoRegisterAppStateChangeNotification. Na suspensão, feche todos os fluxos abertos e feche o MsQuic. Em seguida, na retomada, aguarde a inicialização da rede e reabra o MsQuic.
Para fechar todos os fluxos do MsQuic rapidamente dentro do tempo limite de suspensão, para cada fluxo aberto, chame StreamShutdown com os sinalizadores QUIC_STREAM_SHUTDOWN_FLAG_ABORT e QUIC_STREAM_SHUTDOWN_FLAG_IMMEDIATE. Essa chamada dispara imediatamente um evento QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE. Nesse ponto, é seguro chamar StreamClose para fechar o fluxo. Depois que todos os fluxos de uma determinada conexão forem fechados, chame ConnectionShutdown com o sinalizador QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT, seguido de ConnectionClose. Depois de fechar todas as conexões, chame RegistrationClose e ConfigurationClose para quaisquer registros e configurações pendentes, seguido de MsQuicClose.
Porta preferencial
Use a porta multijogador UDP local preferencial para o tráfego principal do jogo em títulos do GDK. Defina essa porta no MsQuic usando a função SetParam com a configuraçãoQUIC_PARAM_CONN_LOCAL_ADDRESS em um identificador de objeto de conexão antes de chamar ConnectionStart.
Ao definir QUIC_PARAM_CONN_LOCAL_ADDRESS, especifique a família AF_UNSPEC para permitir soquetes de pilha dupla IPv4 e IPv6. O exemplo a seguir mostra como definir a porta preferencial quando MsQuicCallTable é retornado de MsQuicOpen e MsQuicConnectionHandle é retornado de ConnectionOpen.
