Usar HTTP/3 com o servidor Web ASP.NET Core Kestrel

Observação

Esta não é a versão mais recente deste artigo. Para ver a versão atual, consulte a versão .NET 10 deste artigo.

Aviso

Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, consulte o .NET e .NET Core Support Policy. Para ver a versão atual, consulte a versão .NET 10 deste artigo.

HTTP/3 é um padrão aprovado e a terceira versão principal do HTTP. Este artigo discute os requisitos para HTTP/3. O HTTP/3 tem suporte total no .NET 7 ou posterior.

Importante

Os aplicativos configurados para aproveitar HTTP/3 devem ser projetados para também dar suporte a HTTP/1.1 e HTTP/2.

Benefícios de HTTP/3

HTTP/3:

  • É a versão mais recente do Protocolo de Transferência de Hipertexto.
  • Baseia-se nos pontos fortes do HTTP/2 abordando algumas de suas limitações, particularmente em termos de desempenho, latência, confiabilidade e segurança.
Característica HTTP/2 HTTP/3
Transporte Usa TCP Utiliza o protocolo QUIC
Conexão Mais lento devido a TCP + TLS Combina handshakes de transporte e criptografia
Configuração handshake handshakes
Início de linha Afetado pelo nível de TCP Eliminado usando QUIC
Bloqueio Bloqueio multiplexação de fluxo
Encriptação TLS sobre TCP O TLS é integrado ao QUIC

As principais diferenças de HTTP/2 para HTTP/3 são:

  • Protocolo de Transporte: HTTP/3 usa QUIC em vez de TCP. O QUIC oferece melhor desempenho, menor latência e melhor confiabilidade, especialmente em redes móveis e com perda.
  • Bloqueio de início de linha: HTTP/2 pode sofrer com bloqueio de início de linha no nível do TCP, no qual um atraso em um fluxo pode afetar outros. HTTP/3, com o QUIC, fornece fluxos independentes, portanto, a perda de pacotes em um fluxo não interrompe os outros.
  • Estabelecimento de conexão: HTTP/3 com o QUIC pode estabelecer conexões mais rapidamente, pois combina handshakes de transporte e criptografia.
  • Criptografia: HTTP/3 exige criptografia TLS 1.3, fornecendo segurança aprimorada por padrão, enquanto é opcional em HTTP/2.
  • Multiplexação: embora ambos ofereçam suporte à multiplexação, a implementação com QUIC é mais eficiente e evita os problemas de bloqueio de início de linha no nível do TCP.
  • Migração de conexão: o QUIC HTTP/3 permite que as conexões persistam mesmo quando o endereço IP de um cliente é alterado (como mudar de Wi-Fi para celular), melhorando a experiência do usuário móvel.

Processamento antecipado de solicitações

Kestrel pode processar solicitações HTTP/3 sem primeiro aguardar o fluxo de controle e o quadro CONFIGURAÇÕES inicial. Essa otimização reduz a latência de primeira solicitação em novas conexões HTTP/3.

Em versões anteriores a .NET 11 do ASP.NET Core, Kestrel aguardava para receber o fluxo de controle QUIC e a estrutura de CONFIGURAÇÕES inicial antes de processar qualquer fluxo de solicitação. Esse requisito não é mais necessário, o que significa que a primeira solicitação em uma nova conexão é concluída mais rapidamente.

Requisitos de HTTP/3

HTTP/3 usa QUIC como seu protocolo de transporte. A implementação de HTTP/3 no ASP.NET Core depende de MsQuic para fornecer funcionalidade QUIC. Como resultado, ASP.NET Core suporte a HTTP/3 depende dos requisitos da plataforma MsQuic. Para obter mais informações sobre como instalar o MsQuic, consulte as dependências da Plataforma QUIC. Se a plataforma em execução Kestrel não tiver todos os requisitos para HTTP/3, Kestrel desabilitará HTTP/3 e retornará a outros protocolos HTTP.

Começando

HTTP/3 não está habilitado por padrão. Adicionar configuração a Program.cs para habilitar HTTP/3.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

O código anterior configura a porta 5001 para:

  • Use HTTP/3 junto com HTTP/1.1 e HTTP/2 especificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Habilitar HTTPS usando UseHttps. HTTP/3 requer HTTPS.

Como nem todos os roteadores, firewalls e proxies dão suporte adequado a HTTP/3, configure HTTP/3 junto com HTTP/1.1 e HTTP/2. Especifique HttpProtocols.Http1AndHttp2AndHttp3 como protocolos compatíveis com um ponto de extremidade.

Para obter mais informações, consulte Configurar endpoints para Kestrel servidor Web.

Configurar QuicTransportOptions

Configure as opções de transporte do QUIC chamando o método de extensão UseQuic em IWebHostBuilder.

        var builder = WebApplication.CreateBuilder(args);

        builder.WebHost.UseQuic(options =>
        {
#pragma warning disable CA2252 // Using preview features
            options.MaxBidirectionalStreamCount = 200;
#pragma warning restore CA2252
        });

        builder.WebHost.ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.ListenAnyIP(5001, listenOptions =>
            {
                listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
                listenOptions.UseHttps();
            });
        });

A tabela a seguir descreve as opções disponíveis QuicTransportOptions.

Opção Padrão Description
MaxBidirectionalStreamCount 100 O número máximo de fluxos bidirecionais simultâneos por conexão.
MaxUnidirectionalStreamCount 10 O número máximo de fluxos unidirecionais de entrada simultâneos por conexão.
MaxReadBufferSize 1024 * 1024 (1 MB) O tamanho máximo do buffer de leitura em bytes.
MaxWriteBufferSize 64 * 1024 (64 KB) O tamanho máximo do buffer de gravação em bytes.
Backlog 512 O comprimento máximo da fila de conexão pendente.
DefaultStreamErrorCode 0x010c (H3_PEDIDO_CANCELADO) Código de erro usado quando o fluxo deve anular o lado de leitura ou gravação do fluxo internamente.
DefaultCloseErrorCode 0x100 (H3_SEM_ERRO) Código de erro usado quando uma conexão aberta é descartada.

Alt-svc

O HTTP/3 É descoberto como uma atualização do HTTP/1.1 ou HTTP/2 por meio do cabeçalho alt-svc. Isso significa que a primeira solicitação normalmente usará HTTP/1.1 ou HTTP/2 antes de alternar para HTTP/3. Kestrel adiciona automaticamente o cabeçalho alt-svc se HTTP/3 estiver habilitado.

Teste de localhost

Para obter mais informações sobre como usar HTTP/3 com HttpClient, consulte HTTP/3 com .NET.

HTTP/3 é um padrão aprovado e a terceira versão principal do HTTP. Este artigo discute os requisitos para HTTP/3. O HTTP/3 tem suporte total no .NET 7 ou posterior.

Importante

Os aplicativos configurados para aproveitar HTTP/3 devem ser projetados para também dar suporte a HTTP/1.1 e HTTP/2.

Benefícios de HTTP/3

HTTP/3:

  • É a versão mais recente do Protocolo de Transferência de Hipertexto.
  • Baseia-se nos pontos fortes do HTTP/2 abordando algumas de suas limitações, particularmente em termos de desempenho, latência, confiabilidade e segurança.
Característica HTTP/2 HTTP/3
Transporte Usa TCP Utiliza o protocolo QUIC
Conexão Mais lento devido a TCP + TLS Combina handshakes de transporte e criptografia
Configuração handshake handshakes
Início de linha Afetado pelo nível de TCP Eliminado usando QUIC
Bloqueio Bloqueio multiplexação de fluxo
Encriptação TLS sobre TCP O TLS é integrado ao QUIC

As principais diferenças de HTTP/2 para HTTP/3 são:

  • Protocolo de Transporte: HTTP/3 usa QUIC em vez de TCP. O QUIC oferece melhor desempenho, menor latência e melhor confiabilidade, especialmente em redes móveis e com perda.
  • Bloqueio de início de linha: HTTP/2 pode sofrer com bloqueio de início de linha no nível do TCP, no qual um atraso em um fluxo pode afetar outros. HTTP/3, com o QUIC, fornece fluxos independentes, portanto, a perda de pacotes em um fluxo não interrompe os outros.
  • Estabelecimento de conexão: HTTP/3 com o QUIC pode estabelecer conexões mais rapidamente, pois combina handshakes de transporte e criptografia.
  • Criptografia: HTTP/3 exige criptografia TLS 1.3, fornecendo segurança aprimorada por padrão, enquanto é opcional em HTTP/2.
  • Multiplexação: embora ambos ofereçam suporte à multiplexação, a implementação com QUIC é mais eficiente e evita os problemas de bloqueio de início de linha no nível do TCP.
  • Migração de conexão: o QUIC HTTP/3 permite que as conexões persistam mesmo quando o endereço IP de um cliente é alterado (como mudar de Wi-Fi para celular), melhorando a experiência do usuário móvel.

Requisitos de HTTP/3

HTTP/3 usa QUIC como seu protocolo de transporte. A implementação de HTTP/3 no ASP.NET Core depende de MsQuic para fornecer funcionalidade QUIC. Como resultado, ASP.NET Core suporte a HTTP/3 depende dos requisitos da plataforma MsQuic. Para obter mais informações sobre como instalar o MsQuic, consulte as dependências da Plataforma QUIC. Se a plataforma em que Kestrel está em execução não tiver todos os requisitos para HTTP/3, ela será desabilitada e Kestrel retornará para outros protocolos HTTP.

Começando

HTTP/3 não está habilitado por padrão. Adicionar configuração a Program.cs para habilitar HTTP/3.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

O código anterior configura a porta 5001 para:

  • Use HTTP/3 junto com HTTP/1.1 e HTTP/2 especificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Habilite HTTPS com UseHttps. HTTP/3 requer HTTPS.

Como nem todos os roteadores, firewalls e proxies dão suporte adequado a HTTP/3, recomendamos configurar o HTTP/3 junto com HTTP/1.1 e HTTP/2. Isso pode ser feito especificando HttpProtocols.Http1AndHttp2AndHttp3 como os protocolos suportados de um endpoint.

Para obter mais informações, consulte Configurar pontos de extremidade para o Kestrel servidor Web.

Configurar QuicTransportOptions

As opções de transporte QUIC podem ser configuradas ao chamar o método de extensão UseQuic em IWebHostBuilder.

        var builder = WebApplication.CreateBuilder(args);

        builder.WebHost.UseQuic(options =>
        {
#pragma warning disable CA2252 // Using preview features
            options.MaxBidirectionalStreamCount = 200;
#pragma warning restore CA2252
        });

        builder.WebHost.ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.ListenAnyIP(5001, listenOptions =>
            {
                listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
                listenOptions.UseHttps();
            });
        });

Para obter a lista completa das opções de transporte QUIC disponíveis e suas descrições, consulte QuicTransportOptions.

Alt-svc

O HTTP/3 É descoberto como uma atualização do HTTP/1.1 ou HTTP/2 por meio do cabeçalho alt-svc. Isso significa que a primeira solicitação normalmente usará HTTP/1.1 ou HTTP/2 antes de alternar para HTTP/3. Kestrel adiciona automaticamente o cabeçalho alt-svc se HTTP/3 estiver habilitado.

Teste de localhost

Para obter mais informações sobre como usar HTTP/3 com HttpClient, consulte HTTP/3 com .NET.

HTTP/3 é um padrão proposto e a terceira versão principal do HTTP. Este artigo discute os requisitos para HTTP/3. O HTTP/3 tem suporte total no .NET 7 ou posterior.

Importante

Os aplicativos configurados para aproveitar HTTP/3 devem ser projetados para também dar suporte a HTTP/1.1 e HTTP/2.

Requisitos de HTTP/3

HTTP/3 tem requisitos diferentes dependendo do sistema operacional. Se a plataforma em que Kestrel estiver em execução não tiver todos os requisitos para HTTP/3, ela será desabilitada e Kestrel retornará para outros protocolos HTTP.

Windows

  • Windows 11 Build 22000 ou posterior ou Windows Server 2022.
  • Conexão TLS 1.3 ou posterior

Linux

  • Pacote libmsquic instalado.

libmsquic é publicado por meio do repositório de pacotes linux oficial do Microsoft em packages.microsoft.com. Para instalar esse pacote:

  1. Adicione o repositório packages.microsoft.com. Consulte Linux Software Repository for Microsoft Products para obter instruções.
  2. Instale o pacote libmsquic usando o gerenciador de pacotes da distribuição. Por exemplo, apt install libmsquic=1.9* no Ubuntu.

Note: .NET 6 só é compatível com as versões 1.9.x do libmsquic. O Libmsquic 2.x não é compatível devido a alterações interruptivas. O Libmsquic receberá atualizações para 1.9.x quando necessário para incorporar correções de segurança.

macOS

No momento, não há suporte para HTTP/3 no macOS, mas pode estar disponível em uma versão futura.

Começando

HTTP/3 não está habilitado por padrão. Adicionar configuração a Program.cs para habilitar HTTP/3.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

O código anterior configura a porta 5001 para:

  • Use HTTP/3 junto com HTTP/1.1 e HTTP/2 especificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Habilite HTTPS com UseHttps. HTTP/3 requer HTTPS.

Como nem todos os roteadores, firewalls e proxies dão suporte adequado a HTTP/3, recomendamos configurar o HTTP/3 junto com HTTP/1.1 e HTTP/2. Isso pode ser feito especificando HttpProtocols.Http1AndHttp2AndHttp3 como os protocolos suportados de um endpoint.

Para obter mais informações, consulte Configurar pontos de extremidade para o Kestrel servidor Web.

Alt-svc

O HTTP/3 É descoberto como uma atualização do HTTP/1.1 ou HTTP/2 por meio do cabeçalho alt-svc. Isso significa que a primeira solicitação normalmente usará HTTP/1.1 ou HTTP/2 antes de alternar para HTTP/3. Kestrel adiciona automaticamente o cabeçalho alt-svc se HTTP/3 estiver habilitado.

Teste de localhost

Benefícios de HTTP/3

O HTTP/3 usa a mesma semântica que HTTP/1.1 e HTTP/2: os mesmos métodos de solicitação, códigos de status e campos de mensagem se aplicam a todas as versões. As diferenças estão no transporte subjacente. Tanto HTTP/1.1 quanto HTTP/2 usam TCP como transporte. O HTTP/3 usa uma nova tecnologia de transporte desenvolvida junto com HTTP/3 chamada QUIC.

HTTP/3 e QUIC têm uma série de benefícios em comparação com HTTP/1.1 e HTTP/2:

  • Tempo de resposta mais rápido da primeira solicitação. QUIC e HTTP/3 negociam a conexão em menos viagens de ida e volta entre o cliente e o servidor. A primeira solicitação alcança o servidor mais rapidamente.
  • Experiência aprimorada quando há perda de pacote de conexão. O HTTP/2 multiplexa várias solicitações por meio de uma conexão TCP. A perda de pacote na conexão afeta todas as solicitações. Esse problema é chamado de "bloqueio de cabeçalho". Como o QUIC fornece multiplexação nativa, os pacotes perdidos afetam apenas as solicitações em que os dados foram perdidos.
  • Dá suporte à transição entre redes. Esse recurso é útil para dispositivos móveis em que é comum alternar entre redes Wi-Fi e celulares quando um dispositivo móvel muda de local. Atualmente, as conexões HTTP/1.1 e HTTP/2 falham e apresentam um erro ao alternar redes. Um aplicativo ou navegador da Web deve repetir as solicitações HTTP com falha. O HTTP/3 permite que o aplicativo ou navegador da Web continue perfeitamente quando uma rede é alterada. Kestrel não dá suporte a transições de rede no .NET 6. Pode estar disponível em uma versão futura.

HTTP/3 é a terceira e próxima versão principal do HTTP. Este artigo discute os requisitos para HTTP/3 e como configurar Kestrel para usá-lo.

Importante

HTTP/3 está disponível no .NET 6 como um recurso preview. A especificação HTTP/3 não está finalizada e podem existir problemas comportamentais ou de desempenho em HTTP/3 com .NET 6.

Para obter mais informações sobre o suporte à versão prévia do recurso, confira a seção de suporte às versões prévias do recurso.

Os aplicativos configurados para aproveitar HTTP/3 devem ser projetados para também dar suporte a HTTP/1.1 e HTTP/2. Se os problemas forem identificados em HTTP/3, recomendamos desabilitar HTTP/3 até que os problemas sejam resolvidos em uma versão futura do ASP.NET Core. Problemas significativos são relatados no repositório do GitHub Announcements.

Requisitos de HTTP/3

HTTP/3 tem requisitos diferentes dependendo do sistema operacional. Se a plataforma em que Kestrel estiver em execução não tiver todos os requisitos para HTTP/3, ela será desabilitada e Kestrel retornará para outros protocolos HTTP.

Windows

  • Windows 11 Build 22000 ou posterior ou Windows Server 2022.
  • Conexão TLS 1.3 ou posterior

Linux

  • Pacote libmsquic instalado.

libmsquic é publicado por meio do repositório de pacotes linux oficial do Microsoft em packages.microsoft.com. Para instalar esse pacote:

  1. Adicione o repositório packages.microsoft.com. Consulte Linux Software Repository for Microsoft Products para obter instruções.
  2. Instale o pacote libmsquic usando o gerenciador de pacotes da distribuição. Por exemplo, apt install libmsquic=1.9* no Ubuntu.

Note: .NET 6 só é compatível com as versões 1.9.x do libmsquic. O Libmsquic 2.x não é compatível devido a alterações interruptivas. O Libmsquic receberá atualizações para 1.9.x quando necessário para incorporar correções de segurança.

macOS

No momento, não há suporte para HTTP/3 no macOS, mas pode estar disponível em uma versão futura.

Começando

HTTP/3 não está habilitado por padrão. Adicionar configuração a Program.cs para habilitar HTTP/3.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

O código anterior configura a porta 5001 para:

  • Use HTTP/3 junto com HTTP/1.1 e HTTP/2 especificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Habilite HTTPS com UseHttps. HTTP/3 requer HTTPS.

Como nem todos os roteadores, firewalls e proxies dão suporte adequado a HTTP/3, recomendamos configurar o HTTP/3 junto com HTTP/1.1 e HTTP/2. Isso pode ser feito especificando HttpProtocols.Http1AndHttp2AndHttp3 como os protocolos suportados de um endpoint.

Para obter mais informações, consulte Configurar endpoints para o servidor WebKestrel.

Alt-svc

O HTTP/3 É descoberto como uma atualização do HTTP/1.1 ou HTTP/2 por meio do cabeçalho alt-svc. Isso significa que a primeira solicitação normalmente usará HTTP/1.1 ou HTTP/2 antes de alternar para HTTP/3. Kestrel adiciona automaticamente o cabeçalho alt-svc se HTTP/3 estiver habilitado.

Teste de localhost

  • Os navegadores não permitem certificados autoassinados em HTTP/3, como o certificado de desenvolvimento Kestrel.

  • HttpClient pode ser usado para testes localhost/loopback no .NET 6 ou posterior. A configuração extra é necessária ao usar HttpClient para fazer uma solicitação HTTP/3:

    • Defina HttpRequestMessage.Version como 3.0 ou
    • Defina HttpRequestMessage.VersionPolicy como HttpVersionPolicy.RequestVersionOrHigher.

Limitações

Alguns cenários HTTPS ainda não têm suporte para HTTP/3 no Kestrel. Ao chamar Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps com HttpsConnectionAdapterOptions ao usar HTTP/3, definir as seguintes opções no HttpsConnectionAdapterOptions é um no-op (ele não faz nada):

Chamar as seguintes implementações de Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps ocasiona a geração de um erro ao usar HTTP/3:

Benefícios de HTTP/3

O HTTP/3 usa a mesma semântica que HTTP/1.1 e HTTP/2: os mesmos métodos de solicitação, códigos de status e campos de mensagem se aplicam a todas as versões. As diferenças estão no transporte subjacente. Tanto HTTP/1.1 quanto HTTP/2 usam TCP como transporte. O HTTP/3 usa uma nova tecnologia de transporte desenvolvida junto com HTTP/3 chamada QUIC.

HTTP/3 e QUIC têm uma série de benefícios em comparação com HTTP/1.1 e HTTP/2:

  • Tempo de resposta mais rápido da primeira solicitação. QUIC e HTTP/3 negociam a conexão em menos viagens de ida e volta entre o cliente e o servidor. A primeira solicitação alcança o servidor mais rapidamente.
  • Experiência aprimorada quando há perda de pacote de conexão. O HTTP/2 multiplexa várias solicitações por meio de uma conexão TCP. A perda de pacote na conexão afeta todas as solicitações. Esse problema é chamado de "bloqueio de cabeçalho". Como o QUIC fornece multiplexação nativa, os pacotes perdidos afetam apenas as solicitações em que os dados foram perdidos.
  • Dá suporte à transição entre redes. Esse recurso é útil para dispositivos móveis em que é comum alternar entre redes Wi-Fi e celulares quando um dispositivo móvel muda de local. Atualmente, as conexões HTTP/1.1 e HTTP/2 falham e apresentam um erro ao alternar redes. Um aplicativo ou navegador da Web deve repetir as solicitações HTTP com falha. O HTTP/3 permite que o aplicativo ou navegador da Web continue perfeitamente quando uma rede é alterada. Kestrel não dá suporte a transições de rede no .NET 6. Pode estar disponível em uma versão futura.