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

Observação

Esta não é a versão mais recente deste artigo. Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.

Importante

Essas informações relacionam-se ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.

Para informações sobre a versão vigente, confira a Versão do .NET 8 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 compatível no ASP.NET Core 7.0 e 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 está 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 da Microsoft em packages.microsoft.com. Para instalar esse pacote:

  1. Adicione o repositório packages.microsoft.com. Confira Repositório de Software do Linux para Produtos da Microsoft 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.

Observação: .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.

Introdução

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 protocolos com suporte de um ponto de extremidade.

Para obter mais informações, confira Configurar pontos de extremidade para o servidor Web Kestrel do ASP.NET Core.

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 8. Eles pode estar disponíveis em uma versão futura.

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 compatível no ASP.NET Core 7.0 e 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 da Microsoft em packages.microsoft.com. Para instalar esse pacote:

  1. Adicione o repositório packages.microsoft.com. Confira Repositório de Software do Linux para Produtos da Microsoft 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.

Observação: .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.

Introdução

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 protocolos com suporte de um ponto de extremidade.

Para obter mais informações, confira Configurar pontos de extremidade para o servidor Web Kestrel do ASP.NET Core.

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. Eles pode estar disponíveis 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 uma versão prévia do recurso. A especificação HTTP/3 não está finalizada e podem existir problemas comportamentais ou de desempenho em HTTP/3 com o .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 problemas forem identificados em HTTP/3, recomendamos desabilitá-lo até que os problemas sejam resolvidos em uma versão futura do ASP.NET Core. Problemas significativos são relatados no repositório de comunicados do GitHub.

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 da Microsoft em packages.microsoft.com. Para instalar esse pacote:

  1. Adicione o repositório packages.microsoft.com. Confira Repositório de Software do Linux para Produtos da Microsoft 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.

Observação: .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.

Introdução

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 protocolos com suporte de um ponto de extremidade.

Para obter mais informações, confira Configurar pontos de extremidade para o servidor Web Kestrel do ASP.NET Core.

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 de 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 não-op (não faz nada):

Chamar as seguintes implementações de Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps gera 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. Eles pode estar disponíveis em uma versão futura.