Uso de HTTP/3 con el servidor web Kestrel de ASP.NET Core

Nota

Esta no es la versión más reciente de este artículo. Para la versión actual, consulte la versión .NET 8 de este artículo.

Importante

Esta información hace referencia a un producto en versión preliminar, el cual puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no proporciona ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.

Para la versión actual, consulte la versión .NET 8 de este artículo.

HTTP/3 es un estándar aprobado y la tercera versión principal de HTTP. En este artículo se describen los requisitos de HTTP/3. HTTP/3 es totalmente compatible con ASP.NET Core 7.0 y versiones posteriores.

Importante

Las aplicaciones configuradas para aprovechar las ventajas de HTTP/3 deben diseñarse para admitir también HTTP/1.1 y HTTP/2.

Requisitos de HTTP/3

HTTP/3 tiene requisitos diferentes en función del sistema operativo. Si la plataforma en la que se ejecuta Kestrel no tiene todos los requisitos para HTTP/3, se deshabilita y Kestrel retrocederá a otros protocolos HTTP.

Windows

  • Windows 11 Compilación 22000 o posterior, O BIEN Windows Server 2022.
  • Conexión con TLS 1.3 o posterior.

Linux

  • Paquete libmsquic instalado.

libmsquic se publica por medio del repositorio oficial de paquetes de Linux de Microsoft en packages.microsoft.com. Para instalar este paquete:

  1. Agregue el repositorio packages.microsoft.com. Vea Repositorio de software de Linux para productos de Microsoft para obtener más instrucciones.
  2. Instale el paquete libmsquic mediante el administrador de paquetes de la distro. Por ejemplo, apt install libmsquic=1.9* en Ubuntu.

Nota: .NET 6 solo es compatible con las versiones 1.9.x de libmsquic. Libmsquic 2.x no es compatible debido a cambios importantes. Libmsquic recibe actualizaciones de la versión 1.9.x cuando sea necesario para incorporar correcciones de seguridad.

macOS

Actualmente HTTP/3 no se admite en macOS y puede estar disponible en una versión futura.

Introducción

HTTP/3 no está habilitado de forma predeterminada. Agregue la configuración 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();
    });
});

El código siguiente configura el puerto 5001 para:

  • Usar HTTP/3 junto con HTTP/1.1 y HTTP/2 especificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Habilitar HTTPS con UseHttps. HTTP/3 requiere HTTPS.

Como no todos los enrutadores, firewalls y servidores proxy admiten correctamente HTTP/3, HTTP/3 debería configurarse junto con HTTP/1.1 y HTTP/2. Para ello, especifique HttpProtocols.Http1AndHttp2AndHttp3 como protocolos admitidos de un punto de conexión.

Para más información, vea Configuración de puntos de conexión para el servidor web Kestrel de ASP.NET Core.

Alt-svc

HTTP/3 se detecta como una actualización de HTTP/1.1 o HTTP/2 por medio del encabezado alt-svc. Esto significa que la primera solicitud normalmente usará HTTP/1.1 o HTTP/2 antes de cambiar a HTTP/3. Kestrel agrega automáticamente el encabezado alt-svc si HTTP/3 está habilitado.

Pruebas de Localhost

Ventajas de HTTP/3

HTTP/3 usa la misma semántica que HTTP/1.1 y HTTP/2: los mismos métodos de solicitud, códigos de estado y campos de mensaje se aplican a todas las versiones. Las diferencias están en el transporte subyacente. Tanto en HTTP/1.1 como en HTTP/2 se usa TCP como transporte. HTTP/3 usa una nueva tecnología de transporte desarrollada junto con HTTP/3 denominada QUIC.

HTTP/3 y QUIC tienen una serie de ventajas en comparación con HTTP/1.1 y HTTP/2:

  • Tiempo de respuesta más rápido de la primera solicitud. QUIC y HTTP/3 negocian la conexión en menos recorridos de ida y vuelta entre el cliente y el servidor. La primera solicitud llega más rápido al servidor.
  • Experiencia mejorada cuando hay pérdida de paquetes de conexión. HTTP/2 realiza la multiplexación de varias solicitudes por medio de una conexión TCP. La pérdida de paquetes en la conexión afecta a todas las solicitudes. Este problema se denomina "bloqueo de encabezado de línea". Como QUIC proporciona multiplexación nativa, los paquetes perdidos solo afectan a las solicitudes en las que se han perdido datos.
  • Admite la transición entre redes. Esta característica es útil para dispositivos móviles en los que es habitual intercambiar entre Wi-Fi y redes móviles a medida que un dispositivo móvil cambia de ubicación. Actualmente, se producirá un error en las conexiones HTTP/1.1 y HTTP/2 al cambiar de red. Una aplicación o los exploradores web tendrán que reintentar las solicitudes HTTP con error. HTTP/3 permite que la aplicación o el explorador web continúen sin problemas cuando cambia una red. Kestrel no admite transiciones de red en .NET 8. Es posible que esté disponible en una versión futura.

HTTP/3 es un estándar propuesto y la tercera versión principal de HTTP. En este artículo se describen los requisitos de HTTP/3. HTTP/3 es totalmente compatible con ASP.NET Core 7.0 y versiones posteriores.

Importante

Las aplicaciones configuradas para aprovechar las ventajas de HTTP/3 deben diseñarse para admitir también HTTP/1.1 y HTTP/2.

Requisitos de HTTP/3

HTTP/3 tiene requisitos diferentes en función del sistema operativo. Si la plataforma en la que se ejecuta Kestrel no tiene todos los requisitos para HTTP/3, se deshabilita y Kestrel retrocederá a otros protocolos HTTP.

Windows

  • Windows 11 Compilación 22000 o posterior, O BIEN Windows Server 2022.
  • Conexión con TLS 1.3 o posterior.

Linux

  • Paquete libmsquic instalado.

libmsquic se publica por medio del repositorio oficial de paquetes de Linux de Microsoft en packages.microsoft.com. Para instalar este paquete:

  1. Agregue el repositorio packages.microsoft.com. Vea Repositorio de software de Linux para productos de Microsoft para obtener más instrucciones.
  2. Instale el paquete libmsquic mediante el administrador de paquetes de la distro. Por ejemplo, apt install libmsquic=1.9* en Ubuntu.

Nota: .NET 6 solo es compatible con las versiones 1.9.x de libmsquic. Libmsquic 2.x no es compatible debido a cambios importantes. Libmsquic recibe actualizaciones de la versión 1.9.x cuando sea necesario para incorporar correcciones de seguridad.

macOS

Actualmente HTTP/3 no se admite en macOS y puede estar disponible en una versión futura.

Introducción

HTTP/3 no está habilitado de forma predeterminada. Agregue la configuración 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();
    });
});

El código siguiente configura el puerto 5001 para:

  • Usar HTTP/3 junto con HTTP/1.1 y HTTP/2 especificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Habilitar HTTPS con UseHttps. HTTP/3 requiere HTTPS.

Como no todos los enrutadores, firewalls y servidores proxy admiten correctamente HTTP/3, HTTP/3 debería configurarse junto con HTTP/1.1 y HTTP/2. Para ello, especifique HttpProtocols.Http1AndHttp2AndHttp3 como protocolos admitidos de un punto de conexión.

Para más información, vea Configuración de puntos de conexión para el servidor web Kestrel de ASP.NET Core.

Alt-svc

HTTP/3 se detecta como una actualización de HTTP/1.1 o HTTP/2 por medio del encabezado alt-svc. Esto significa que la primera solicitud normalmente usará HTTP/1.1 o HTTP/2 antes de cambiar a HTTP/3. Kestrel agrega automáticamente el encabezado alt-svc si HTTP/3 está habilitado.

Pruebas de Localhost

Ventajas de HTTP/3

HTTP/3 usa la misma semántica que HTTP/1.1 y HTTP/2: los mismos métodos de solicitud, códigos de estado y campos de mensaje se aplican a todas las versiones. Las diferencias están en el transporte subyacente. Tanto en HTTP/1.1 como en HTTP/2 se usa TCP como transporte. HTTP/3 usa una nueva tecnología de transporte desarrollada junto con HTTP/3 denominada QUIC.

HTTP/3 y QUIC tienen una serie de ventajas en comparación con HTTP/1.1 y HTTP/2:

  • Tiempo de respuesta más rápido de la primera solicitud. QUIC y HTTP/3 negocian la conexión en menos recorridos de ida y vuelta entre el cliente y el servidor. La primera solicitud llega más rápido al servidor.
  • Experiencia mejorada cuando hay pérdida de paquetes de conexión. HTTP/2 realiza la multiplexación de varias solicitudes por medio de una conexión TCP. La pérdida de paquetes en la conexión afecta a todas las solicitudes. Este problema se denomina "bloqueo de encabezado de línea". Como QUIC proporciona multiplexación nativa, los paquetes perdidos solo afectan a las solicitudes en las que se han perdido datos.
  • Admite la transición entre redes. Esta característica es útil para dispositivos móviles en los que es habitual intercambiar entre Wi-Fi y redes móviles a medida que un dispositivo móvil cambia de ubicación. Actualmente, se producirá un error en las conexiones HTTP/1.1 y HTTP/2 al cambiar de red. Una aplicación o los exploradores web tendrán que reintentar las solicitudes HTTP con error. HTTP/3 permite que la aplicación o el explorador web continúen sin problemas cuando cambia una red. Kestrel no admite transiciones de red en .NET 6. Es posible que esté disponible en una versión futura.

HTTP/3 es la tercera y próxima versión principal de HTTP. En este artículo se analizan los requisitos de HTTP/3 y cómo configurar Kestrel para usarlo.

Importante

HTTP/3 está disponible en .NET 6 como una característica en vista previa. La especificación de HTTP/3 todavía no está finalizada y es posible que haya problemas de comportamiento o rendimiento en HTTP/3 con .NET 6.

Para obtener más información sobre la compatibilidad con características en versión preliminar, vea la sección sobre compatibilidad con características en versión preliminar.

Las aplicaciones configuradas para aprovechar las ventajas de HTTP/3 deben diseñarse para admitir también HTTP/1.1 y HTTP/2. Si se identifican problemas en HTTP/3, se recomienda deshabilitar HTTP/3 hasta que los problemas se resuelvan en una versión futura de ASP.NET Core. Se notifican problemas importantes en el repositorio de GitHub de anuncios.

Requisitos de HTTP/3

HTTP/3 tiene requisitos diferentes en función del sistema operativo. Si la plataforma en la que se ejecuta Kestrel no tiene todos los requisitos para HTTP/3, se deshabilita y Kestrel retrocederá a otros protocolos HTTP.

Windows

  • Windows 11 Compilación 22000 o posterior, O BIEN Windows Server 2022.
  • Conexión con TLS 1.3 o posterior.

Linux

  • Paquete libmsquic instalado.

libmsquic se publica por medio del repositorio oficial de paquetes de Linux de Microsoft en packages.microsoft.com. Para instalar este paquete:

  1. Agregue el repositorio packages.microsoft.com. Vea Repositorio de software de Linux para productos de Microsoft para obtener más instrucciones.
  2. Instale el paquete libmsquic mediante el administrador de paquetes de la distro. Por ejemplo, apt install libmsquic=1.9* en Ubuntu.

Nota: .NET 6 solo es compatible con las versiones 1.9.x de libmsquic. Libmsquic 2.x no es compatible debido a cambios importantes. Libmsquic recibe actualizaciones de la versión 1.9.x cuando sea necesario para incorporar correcciones de seguridad.

macOS

Actualmente HTTP/3 no se admite en macOS y puede estar disponible en una versión futura.

Introducción

HTTP/3 no está habilitado de forma predeterminada. Agregue la configuración 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();
    });
});

El código siguiente configura el puerto 5001 para:

  • Usar HTTP/3 junto con HTTP/1.1 y HTTP/2 especificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Habilitar HTTPS con UseHttps. HTTP/3 requiere HTTPS.

Como no todos los enrutadores, firewalls y servidores proxy admiten correctamente HTTP/3, HTTP/3 debería configurarse junto con HTTP/1.1 y HTTP/2. Para ello, especifique HttpProtocols.Http1AndHttp2AndHttp3 como protocolos admitidos de un punto de conexión.

Para más información, vea Configuración de puntos de conexión para el servidor web Kestrel de ASP.NET Core.

Alt-svc

HTTP/3 se detecta como una actualización de HTTP/1.1 o HTTP/2 por medio del encabezado alt-svc. Esto significa que la primera solicitud normalmente usará HTTP/1.1 o HTTP/2 antes de cambiar a HTTP/3. Kestrel agrega automáticamente el encabezado alt-svc si HTTP/3 está habilitado.

Pruebas de Localhost

  • Los exploradores no permiten certificados autofirmados en HTTP/3, como el certificado de desarrollo de Kestrel.

  • HttpClient se puede usar para las pruebas de localhost o de bucle invertido en .NET 6 o versiones posteriores. Se necesita una configuración adicional al usar HttpClient para realizar una solicitud HTTP/3:

    • Establezca HttpRequestMessage.Version en 3.0, o bien
    • Establezca HttpRequestMessage.VersionPolicy en HttpVersionPolicy.RequestVersionOrHigher.

Limitaciones

Algunos escenarios HTTPS aún no se admiten para HTTP/3 en Kestrel. Al llamar a Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps con HttpsConnectionAdapterOptions mientras se usa HTTP/3, estableciendo las siguientes opciones en HttpsConnectionAdapterOptions es una operación inefectiva (no hace nada):

Al llamar a las siguientes implementaciones de Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps se produce un error al usar HTTP/3:

Ventajas de HTTP/3

HTTP/3 usa la misma semántica que HTTP/1.1 y HTTP/2: los mismos métodos de solicitud, códigos de estado y campos de mensaje se aplican a todas las versiones. Las diferencias están en el transporte subyacente. Tanto en HTTP/1.1 como en HTTP/2 se usa TCP como transporte. HTTP/3 usa una nueva tecnología de transporte desarrollada junto con HTTP/3 denominada QUIC.

HTTP/3 y QUIC tienen una serie de ventajas en comparación con HTTP/1.1 y HTTP/2:

  • Tiempo de respuesta más rápido de la primera solicitud. QUIC y HTTP/3 negocian la conexión en menos recorridos de ida y vuelta entre el cliente y el servidor. La primera solicitud llega más rápido al servidor.
  • Experiencia mejorada cuando hay pérdida de paquetes de conexión. HTTP/2 realiza la multiplexación de varias solicitudes por medio de una conexión TCP. La pérdida de paquetes en la conexión afecta a todas las solicitudes. Este problema se denomina "bloqueo de encabezado de línea". Como QUIC proporciona multiplexación nativa, los paquetes perdidos solo afectan a las solicitudes en las que se han perdido datos.
  • Admite la transición entre redes. Esta característica es útil para dispositivos móviles en los que es habitual intercambiar entre Wi-Fi y redes móviles a medida que un dispositivo móvil cambia de ubicación. Actualmente, se producirá un error en las conexiones HTTP/1.1 y HTTP/2 al cambiar de red. Una aplicación o los exploradores web tendrán que reintentar las solicitudes HTTP con error. HTTP/3 permite que la aplicación o el explorador web continúen sin problemas cuando cambia una red. Kestrel no admite transiciones de red en .NET 6. Es posible que esté disponible en una versión futura.