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.
Aviso
Essa versão do ASP.NET Core não tem mais suporte. Para obter mais informações, confira .NET e a Política de Suporte do .NET Core. 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:
- Adicione o repositório
packages.microsoft.com
. Confira Repositório de Software do Linux para Produtos da Microsoft para obter instruções. - 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 usarHttpClient
para fazer uma solicitação HTTP/3:- Defina
HttpRequestMessage.Version
como 3.0 ou - Defina
HttpRequestMessage.VersionPolicy
comoHttpVersionPolicy.RequestVersionOrHigher
.
- Defina
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:
- Adicione o repositório
packages.microsoft.com
. Confira Repositório de Software do Linux para Produtos da Microsoft para obter instruções. - 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 usarHttpClient
para fazer uma solicitação HTTP/3:- Defina
HttpRequestMessage.Version
como 3.0 ou - Defina
HttpRequestMessage.VersionPolicy
comoHttpVersionPolicy.RequestVersionOrHigher
.
- Defina
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:
- Adicione o repositório
packages.microsoft.com
. Confira Repositório de Software do Linux para Produtos da Microsoft para obter instruções. - 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 usarHttpClient
para fazer uma solicitação HTTP/3:- Defina
HttpRequestMessage.Version
como 3.0 ou - Defina
HttpRequestMessage.VersionPolicy
comoHttpVersionPolicy.RequestVersionOrHigher
.
- Defina
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:
- UseHttps(this ListenOptions listenOptions, ServerOptionsSelectionCallback serverOptionsSelectionCallback, object state, TimeSpan handshakeTimeout)
- UseHttps(this ListenOptions listenOptions, TlsHandshakeCallbackOptions callbackOptions)
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.