Partilhar via


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

Observação

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

Advertência

Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e do .NET Core. Para 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. HTTP/3 é totalmente suportado no .NET 7 ou posterior.

Importante

Os aplicativos configurados para aproveitar o HTTP/3 devem ser projetados para também suportar HTTP/1.1 e HTTP/2.

Benefícios do HTTP/3

HTTP/3:

  • É a versão mais recente do Protocolo de Transferência de Hipertexto.
  • Baseia-se nos pontos fortes de HTTP/2 ao mesmo tempo em que aborda algumas de suas limitações, particularmente em termos de desempenho, latência, confiabilidade e segurança.
Característica HTTP/2 HTTP/3
Transportes Usa TCP Utiliza QUIC
Conexão Mais lento devido a TCP + TLS Mais rápido com 0-RTT QUIC
Configuração handshake apertos de mão
Cabeça de fila Afetado pelo nível TCP Eliminado com QUIC
Bloqueio bloqueio multiplexação de fluxo
Encriptação TLS sobre TCP O TLS está integrado no 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 perdas.
  • Bloqueio de Cabeceira de Linha: HTTP/2 pode sofrer bloqueio de cabeceira de linha ao nível do TCP, onde um atraso numa transmissão pode afetar outras. HTTP/3, com QUIC, fornece fluxos independentes, para que a perda de pacotes em um fluxo não paralise outros.
  • Estabelecimento de conexão: HTTP/3 com o QUIC pode estabelecer conexões mais rápidas, às vezes em tempo zero de ida e volta (0-RTT) para clientes que retornam, pois combina handshakes de transporte e criptografia.
  • Criptografia: HTTP/3 exige criptografia TLS 1.3, fornecendo segurança aprimorada por padrão, enquanto é opcional no HTTP/2.
  • Multiplexação: Embora ambos sistemas suportem multiplexação, a implementação de HTTP/3 com QUIC é mais eficiente e evita os problemas de bloqueio de linha de frente no nível TCP.
  • Migração de conexão: o QUIC in HTTP/3 permite que as conexões persistam mesmo quando o endereço IP de um cliente muda (como mudar de Wi-Fi para celular), melhorando a experiência do usuário móvel.

Requisitos HTTP/3

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

Como Começar

HTTP/3 não está habilitado por padrão. Adicione uma configuração em 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 ao lado de HTTP/1.1 e HTTP/2 especificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Habilite o HTTPS com UseHttps. HTTP/3 requer HTTPS.

Como nem todos os roteadores, firewalls e proxies suportam HTTP/3 corretamente, HTTP/3 deve ser configurado junto com HTTP/1.1 e HTTP/2. Isso pode ser feito especificando HttpProtocols.Http1AndHttp2AndHttp3 como os protocolos suportados de um ponto de extremidade.

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

Configurar QuicTransportOptions

As opções de transporte QUIC podem ser configuradas ao chamar o método de extensão UseQuic sobre 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 seguinte descreve os disponíveis QuicTransportOptions.

Opção Predefinido Description
MaxBidirectionalStreamCount 100 O número máximo de fluxos bidirecionais concorrentes por ligação.
MaxUnidirectionalStreamCount 10 O número máximo de fluxos unidirecionais de entrada concorrentes por ligaçã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 escrita em bytes.
Backlog 512 O comprimento máximo da fila de ligação pendente.
DefaultStreamErrorCode 0x010c (SOLICITAÇÃO_CANCELADA_H3) Código de erro usado quando o fluxo deve abortar internamente o lado de leitura ou escrita do fluxo.
DefaultCloseErrorCode 0x100 (H3_NO_ERROR) Código de erro usado quando uma ligação aberta é eliminada.

Alt-svc

HTTP/3 é descoberto como uma atualização de HTTP/1.1 ou HTTP/2 através do alt-svc cabeçalho. Isso significa que a primeira solicitação normalmente usará HTTP/1.1 ou HTTP/2 antes de mudar para HTTP/3. Kestrel adiciona automaticamente o cabeçalho alt-svc se HTTP/3 estiver ativado.

Teste de host local

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. HTTP/3 é totalmente suportado no .NET 7 ou posterior.

Importante

Os aplicativos configurados para aproveitar o HTTP/3 devem ser projetados para também suportar HTTP/1.1 e HTTP/2.

Requisitos HTTP/3

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

Mac OS

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

Aplicações Linux

  • libmsquic pacote instalado.

libmsquic é publicado através do repositório oficial de pacotes Linux da Microsoft em packages.microsoft.com. Para instalar este pacote:

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

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

macOS

HTTP/3 não é suportado atualmente no macOS e pode estar disponível em uma versão futura.

Como Começar

HTTP/3 não está habilitado por padrão. Adicione uma configuração em 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 ao lado de HTTP/1.1 e HTTP/2 especificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Habilite o HTTPS com UseHttps. HTTP/3 requer HTTPS.

Como nem todos os roteadores, firewalls e proxies suportam HTTP/3 corretamente, HTTP/3 deve ser configurado junto com HTTP/1.1 e HTTP/2. Isso pode ser feito especificando HttpProtocols.Http1AndHttp2AndHttp3 como os protocolos suportados de um ponto de extremidade.

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

Alt-svc

HTTP/3 é descoberto como uma atualização de HTTP/1.1 ou HTTP/2 através do alt-svc cabeçalho. Isso significa que a primeira solicitação normalmente usará HTTP/1.1 ou HTTP/2 antes de mudar para HTTP/3. Kestrel adiciona automaticamente o cabeçalho alt-svc se HTTP/3 estiver ativado.

Teste de host local

Benefícios do HTTP/3

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 o HTTP/1.1 quanto o HTTP/2 usam TCP como transporte. HTTP/3 usa uma nova tecnologia de transporte desenvolvida juntamente 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 do primeiro pedido. 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 chega ao servidor mais rapidamente.
  • Experiência melhorada quando há perda de pacotes de ligação. HTTP/2 multiplexa várias solicitações através de uma conexão TCP. A perda de pacotes na conexão afeta todas as solicitações. Este problema é chamado de "bloqueio de cabeça de linha". Como o QUIC fornece multiplexação nativa, os pacotes perdidos afetam apenas as solicitações em que os dados foram perdidos.
  • Suporta a transição entre redes. Este recurso é útil para dispositivos móveis onde é comum alternar entre Wi-Fi e redes celulares como um dispositivo móvel muda de local. Atualmente, as conexões HTTP/1.1 e HTTP/2 falham com um erro ao alternar redes. Um aplicativo ou navegador da Web deve repetir todas as solicitações HTTP com falha. O HTTP/3 permite que o aplicativo ou navegador da Web continue sem problemas quando uma rede muda. Kestrel não suporta transições de rede no .NET 6. Ele 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 configurá-lo Kestrel para usá-lo.

Importante

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

Para obter mais informações sobre o suporte a recursos de visualização, consulte a seção Recursos de visualização suportados.

Os aplicativos configurados para aproveitar o HTTP/3 devem ser projetados para também suportar HTTP/1.1 e HTTP/2. Se os problemas forem identificados no HTTP/3, recomendamos desativar o 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 GitHub de Anúncios.

Requisitos HTTP/3

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

Mac OS

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

Aplicações Linux

  • libmsquic pacote instalado.

libmsquic é publicado através do repositório oficial de pacotes Linux da Microsoft em packages.microsoft.com. Para instalar este pacote:

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

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

macOS

HTTP/3 não é suportado atualmente no macOS e pode estar disponível em uma versão futura.

Como Começar

HTTP/3 não está habilitado por padrão. Adicione uma configuração em 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 ao lado de HTTP/1.1 e HTTP/2 especificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Habilite o HTTPS com UseHttps. HTTP/3 requer HTTPS.

Como nem todos os roteadores, firewalls e proxies suportam HTTP/3 corretamente, HTTP/3 deve ser configurado junto com HTTP/1.1 e HTTP/2. Isso pode ser feito especificando HttpProtocols.Http1AndHttp2AndHttp3 como os protocolos suportados de um ponto de extremidade.

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

Alt-svc

HTTP/3 é descoberto como uma atualização de HTTP/1.1 ou HTTP/2 através do alt-svc cabeçalho. Isso significa que a primeira solicitação normalmente usará HTTP/1.1 ou HTTP/2 antes de mudar para HTTP/3. Kestrel adiciona automaticamente o cabeçalho alt-svc se HTTP/3 estiver ativado.

Teste de host local

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

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

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

Limitações

Alguns cenários HTTPS ainda não são suportados para HTTP/3 no Kestrel. Ao ligar Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps com HttpsConnectionAdapterOptions enquanto usa 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 resulta em um erro ao usar HTTP/3:

Benefícios do HTTP/3

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 o HTTP/1.1 quanto o HTTP/2 usam TCP como transporte. HTTP/3 usa uma nova tecnologia de transporte desenvolvida juntamente 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 do primeiro pedido. 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 chega ao servidor mais rapidamente.
  • Experiência melhorada quando há perda de pacotes de ligação. HTTP/2 multiplexa várias solicitações através de uma conexão TCP. A perda de pacotes na conexão afeta todas as solicitações. Este problema é chamado de "bloqueio de cabeça de linha". Como o QUIC fornece multiplexação nativa, os pacotes perdidos afetam apenas as solicitações em que os dados foram perdidos.
  • Suporta a transição entre redes. Este recurso é útil para dispositivos móveis onde é comum alternar entre Wi-Fi e redes celulares como um dispositivo móvel muda de local. Atualmente, as conexões HTTP/1.1 e HTTP/2 falham com um erro ao alternar redes. Um aplicativo ou navegador da Web deve repetir todas as solicitações HTTP com falha. O HTTP/3 permite que o aplicativo ou navegador da Web continue sem problemas quando uma rede muda. Kestrel não suporta transições de rede no .NET 6. Ele pode estar disponível em uma versão futura.