Usare HTTP/3 con il server Web ASP.NET Core Kestrel

Nota

Questa non è la versione più recente di questo articolo. Per la versione corrente, vedere la versione .NET 8 di questo articolo.

Importante

Queste informazioni si riferiscono a un prodotto non definitive che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

Per la versione corrente, vedere la versione .NET 8 di questo articolo.

HTTP/3 è uno standard approvato e la terza versione principale di HTTP. Questo articolo illustra i requisiti per HTTP/3. HTTP/3 è completamente supportato in ASP.NET Core 7.0 e versioni successive.

Importante

Le app configurate per sfruttare i vantaggi di HTTP/3 devono essere progettate per supportare anche HTTP/1.1 e HTTP/2.

Requisiti HTTP/3

HTTP/3 ha requisiti diversi a seconda del sistema operativo. Se la piattaforma Kestrel in esecuzione in non ha tutti i requisiti per HTTP/3, viene disabilitata e Kestrel verrà eseguito il fallback ad altri protocolli HTTP.

Windows

  • Windows 11 Build 22000 o versione successiva o Windows Server 2022.
  • Connessione TLS 1.3 o successiva.

Linux

  • libmsquic pacchetto installato.

libmsquic viene pubblicato tramite il repository ufficiale dei pacchetti Linux di Microsoft all'indirizzo packages.microsoft.com. Per installare questo pacchetto:

  1. Aggiungere il packages.microsoft.com repository. Per istruzioni, vedere Repository software Linux per prodotti Microsoft.
  2. Installare il libmsquic pacchetto usando la gestione pacchetti della distribuzione. Ad esempio, apt install libmsquic=1.9* in Ubuntu.

Nota: .NET 6 è compatibile solo con le versioni 1.9.x di libmsquic. Libmsquic 2.x non è compatibile a causa di modifiche di rilievo. Libmsquic riceve gli aggiornamenti alla versione 1.9.x quando sono necessari per incorporare correzioni di sicurezza.

macOS

HTTP/3 non è attualmente supportato in macOS e potrebbe essere disponibile in una versione futura.

Introduzione

HTTP/3 non è abilitato per impostazione predefinita. Aggiungere la configurazione a per Program.cs abilitare HTTP/3.

var builder = WebApplication.CreateBuilder(args);

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

Il codice precedente configura la porta 5001 per:

  • Usare HTTP/3 insieme a HTTP/1.1 e HTTP/2 specificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Abilitare HTTPS con UseHttps. HTTP/3 richiede HTTPS.

Poiché non tutti i router, i firewall e i proxy supportano correttamente HTTP/3, HTTP/3 deve essere configurato insieme a HTTP/1.1 e HTTP/2. A tale scopo, è possibile specificare HttpProtocols.Http1AndHttp2AndHttp3 come protocolli supportati da un endpoint.

Per altre informazioni, vedere Configurare gli endpoint per il server Web ASP.NET CoreKestrel.

Alt-svc

HTTP/3 viene individuato come aggiornamento da HTTP/1.1 o HTTP/2 tramite l'intestazione alt-svc . Ciò significa che la prima richiesta userà normalmente HTTP/1.1 o HTTP/2 prima di passare a HTTP/3. Kestrel aggiunge automaticamente l'intestazione alt-svc se HTTP/3 è abilitato.

Test localhost

Vantaggi di HTTP/3

HTTP/3 usa la stessa semantica di HTTP/1.1 e HTTP/2: a tutte le versioni si applicano i medesimi metodi di richiesta, codici di stato e campi dei messaggi. Le differenze stanno nel trasporto sottostante. Sia HTTP/1.1 che HTTP/2 usano TCP come protocollo di trasporto. HTTP/3 usa una nuova tecnologia di trasporto sviluppata insieme a HTTP/3 denominata QUIC.

HTTP/3 e QUIC presentano diversi vantaggi rispetto a HTTP/1.1 e HTTP/2:

  • Tempo di risposta più rapido della prima richiesta. QUIC e HTTP/3 negoziano la connessione in meno round trip tra il client e il server. La prima richiesta raggiunge il server più velocemente.
  • Esperienza migliorata quando si verifica una perdita di pacchetti di connessione. HTTP/2 esegue il multiplexing di più richieste tramite una connessione TCP. La perdita di pacchetti sulla connessione influisce su tutte le richieste. Questo problema è denominato "blocco head-of-line". Poiché QUIC fornisce il multiplexing nativo, i pacchetti persi influisce solo sulle richieste in cui i dati sono stati persi.
  • Supporta la transizione tra reti. Questa funzionalità è utile per i dispositivi mobili in cui è comune passare da una rete wi-fi all'altra perché un dispositivo mobile cambia posizione. Attualmente, durante il cambio di rete le connessioni HTTP/1.1 e HTTP/2 hanno esito negativo e restituiscono un errore. Un'app o un Web browser deve ritentare eventuali richieste HTTP non riuscite. HTTP/3 consente all'app o al Web browser di continuare senza problemi quando cambia la rete. Kestrel non supporta le transizioni di rete in .NET 8. Il supporto potrebbe essere disponibile in una versione futura.

HTTP/3 è uno standard proposto e la terza versione principale di HTTP. Questo articolo illustra i requisiti per HTTP/3. HTTP/3 è completamente supportato in ASP.NET Core 7.0 e versioni successive.

Importante

Le app configurate per sfruttare i vantaggi di HTTP/3 devono essere progettate per supportare anche HTTP/1.1 e HTTP/2.

Requisiti HTTP/3

HTTP/3 ha requisiti diversi a seconda del sistema operativo. Se la piattaforma Kestrel in esecuzione in non ha tutti i requisiti per HTTP/3, è disabilitata e Kestrel eseguirà il fallback ad altri protocolli HTTP.

Windows

  • Windows 11 Build 22000 o versione successiva o Windows Server 2022.
  • Connessione TLS 1.3 o successiva.

Linux

  • libmsquic pacchetto installato.

libmsquic viene pubblicato tramite il repository ufficiale dei pacchetti Linux di Microsoft all'indirizzo packages.microsoft.com. Per installare questo pacchetto:

  1. Aggiungere il packages.microsoft.com repository. Per istruzioni, vedere Repository software Linux per prodotti Microsoft.
  2. Installare il libmsquic pacchetto usando la gestione pacchetti della distribuzione. Ad esempio, apt install libmsquic=1.9* in Ubuntu.

Nota: .NET 6 è compatibile solo con le versioni 1.9.x di libmsquic. Libmsquic 2.x non è compatibile a causa di modifiche di rilievo. Libmsquic riceve gli aggiornamenti alla versione 1.9.x quando sono necessari per incorporare correzioni di sicurezza.

macOS

HTTP/3 non è attualmente supportato in macOS e potrebbe essere disponibile in una versione futura.

Introduzione

HTTP/3 non è abilitato per impostazione predefinita. Aggiungere la configurazione a per Program.cs abilitare HTTP/3.

var builder = WebApplication.CreateBuilder(args);

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

Il codice precedente configura la porta 5001 per:

  • Usare HTTP/3 insieme a HTTP/1.1 e HTTP/2 specificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Abilitare HTTPS con UseHttps. HTTP/3 richiede HTTPS.

Poiché non tutti i router, i firewall e i proxy supportano correttamente HTTP/3, HTTP/3 deve essere configurato insieme a HTTP/1.1 e HTTP/2. A tale scopo, è possibile specificare HttpProtocols.Http1AndHttp2AndHttp3 come protocolli supportati da un endpoint.

Per altre informazioni, vedere Configurare gli endpoint per il server Web ASP.NET CoreKestrel.

Alt-svc

HTTP/3 viene individuato come aggiornamento da HTTP/1.1 o HTTP/2 tramite l'intestazione alt-svc . Ciò significa che la prima richiesta userà normalmente HTTP/1.1 o HTTP/2 prima di passare a HTTP/3. Kestrel aggiunge automaticamente l'intestazione alt-svc se HTTP/3 è abilitato.

Test localhost

Vantaggi di HTTP/3

HTTP/3 usa la stessa semantica di HTTP/1.1 e HTTP/2: a tutte le versioni si applicano i medesimi metodi di richiesta, codici di stato e campi dei messaggi. Le differenze stanno nel trasporto sottostante. Sia HTTP/1.1 che HTTP/2 usano TCP come protocollo di trasporto. HTTP/3 usa una nuova tecnologia di trasporto sviluppata insieme a HTTP/3 denominata QUIC.

HTTP/3 e QUIC presentano diversi vantaggi rispetto a HTTP/1.1 e HTTP/2:

  • Tempo di risposta più rapido della prima richiesta. QUIC e HTTP/3 negoziano la connessione in meno round trip tra il client e il server. La prima richiesta raggiunge il server più velocemente.
  • Esperienza migliorata quando si verifica una perdita di pacchetti di connessione. HTTP/2 esegue il multiplexing di più richieste tramite una connessione TCP. La perdita di pacchetti sulla connessione influisce su tutte le richieste. Questo problema è denominato "blocco head-of-line". Poiché QUIC fornisce il multiplexing nativo, i pacchetti persi influisce solo sulle richieste in cui i dati sono stati persi.
  • Supporta la transizione tra reti. Questa funzionalità è utile per i dispositivi mobili in cui è comune passare da una rete wi-fi all'altra perché un dispositivo mobile cambia posizione. Attualmente le connessioni HTTP/1.1 e HTTP/2 hanno esito negativo e si verifica un errore durante il cambio di reti. Un'app o un Web browser deve ritentare eventuali richieste HTTP non riuscite. HTTP/3 consente all'app o al Web browser di continuare senza problemi quando cambia la rete. Kestrel non supporta le transizioni di rete in .NET 6. Il supporto potrebbe essere disponibile in una versione futura.

HTTP/3 è la terza e prossima versione principale di HTTP. Questo articolo illustra i requisiti per HTTP/3 e come configurarlo Kestrel per usarlo.

Importante

HTTP/3 è disponibile in .NET 6 come funzionalità di anteprima. La specifica HTTP/3 non è stata finalizzata e potrebbero verificarsi problemi di comportamento o prestazioni in HTTP/3 con .NET 6.

Per altre informazioni sul supporto delle funzionalità di anteprima, vedere la sezione relativa alle funzionalità di anteprima supportate.

Le app configurate per sfruttare i vantaggi di HTTP/3 devono essere progettate per supportare anche HTTP/1.1 e HTTP/2. Se i problemi vengono identificati in HTTP/3, è consigliabile disabilitare HTTP/3 fino a quando i problemi non vengono risolti in una versione futura di ASP.NET Core. I problemi significativi vengono segnalati nel repository GitHub Annunci.

Requisiti HTTP/3

HTTP/3 ha requisiti diversi a seconda del sistema operativo. Se la piattaforma Kestrel in esecuzione in non ha tutti i requisiti per HTTP/3, è disabilitata e Kestrel eseguirà il fallback ad altri protocolli HTTP.

Windows

  • Windows 11 Build 22000 o versione successiva o Windows Server 2022.
  • Connessione TLS 1.3 o successiva.

Linux

  • libmsquic pacchetto installato.

libmsquic viene pubblicato tramite il repository ufficiale dei pacchetti Linux di Microsoft all'indirizzo packages.microsoft.com. Per installare questo pacchetto:

  1. Aggiungere il packages.microsoft.com repository. Per istruzioni, vedere Repository software Linux per prodotti Microsoft.
  2. Installare il libmsquic pacchetto usando la gestione pacchetti della distribuzione. Ad esempio, apt install libmsquic=1.9* in Ubuntu.

Nota: .NET 6 è compatibile solo con le versioni 1.9.x di libmsquic. Libmsquic 2.x non è compatibile a causa di modifiche di rilievo. Libmsquic riceve gli aggiornamenti alla versione 1.9.x quando sono necessari per incorporare correzioni di sicurezza.

macOS

HTTP/3 non è attualmente supportato in macOS e potrebbe essere disponibile in una versione futura.

Introduzione

HTTP/3 non è abilitato per impostazione predefinita. Aggiungere la configurazione a per Program.cs abilitare HTTP/3.

var builder = WebApplication.CreateBuilder(args);

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

Il codice precedente configura la porta 5001 per:

  • Usare HTTP/3 insieme a HTTP/1.1 e HTTP/2 specificando HttpProtocols.Http1AndHttp2AndHttp3.
  • Abilitare HTTPS con UseHttps. HTTP/3 richiede HTTPS.

Poiché non tutti i router, i firewall e i proxy supportano correttamente HTTP/3, HTTP/3 deve essere configurato insieme a HTTP/1.1 e HTTP/2. A tale scopo, è possibile specificare HttpProtocols.Http1AndHttp2AndHttp3 come protocolli supportati da un endpoint.

Per altre informazioni, vedere Configurare gli endpoint per il server Web ASP.NET CoreKestrel.

Alt-svc

HTTP/3 viene individuato come aggiornamento da HTTP/1.1 o HTTP/2 tramite l'intestazione alt-svc . Ciò significa che la prima richiesta userà normalmente HTTP/1.1 o HTTP/2 prima di passare a HTTP/3. Kestrel aggiunge automaticamente l'intestazione alt-svc se HTTP/3 è abilitato.

Test localhost

  • I browser non consentono certificati autofirmato su HTTP/3, ad esempio il Kestrel certificato di sviluppo.

  • HttpClient può essere usato per i test localhost/loopback in .NET 6 o versione successiva. È necessaria una configurazione aggiuntiva quando si usa HttpClient per effettuare una richiesta HTTP/3:

    • Impostare su HttpRequestMessage.Version 3.0 o
    • Impostare HttpRequestMessage.VersionPolicy su HttpVersionPolicy.RequestVersionOrHigher.

Limiti

Alcuni scenari HTTPS non sono ancora supportati per HTTP/3 in Kestrel. Quando si chiama Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps con HttpsConnectionAdapterOptions durante l'uso di HTTP/3, l'impostazione delle opzioni seguenti in HttpsConnectionAdapterOptions è no-op (non esegue alcuna operazione):

La chiamata alle implementazioni seguenti di Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps genera un errore quando si usa HTTP/3:

Vantaggi di HTTP/3

HTTP/3 usa la stessa semantica di HTTP/1.1 e HTTP/2: a tutte le versioni si applicano i medesimi metodi di richiesta, codici di stato e campi dei messaggi. Le differenze stanno nel trasporto sottostante. Sia HTTP/1.1 che HTTP/2 usano TCP come protocollo di trasporto. HTTP/3 usa una nuova tecnologia di trasporto sviluppata insieme a HTTP/3 denominata QUIC.

HTTP/3 e QUIC presentano diversi vantaggi rispetto a HTTP/1.1 e HTTP/2:

  • Tempo di risposta più rapido della prima richiesta. QUIC e HTTP/3 negoziano la connessione in meno round trip tra il client e il server. La prima richiesta raggiunge il server più velocemente.
  • Esperienza migliorata quando si verifica una perdita di pacchetti di connessione. HTTP/2 esegue il multiplexing di più richieste tramite una connessione TCP. La perdita di pacchetti sulla connessione influisce su tutte le richieste. Questo problema è denominato "blocco head-of-line". Poiché QUIC fornisce il multiplexing nativo, i pacchetti persi influisce solo sulle richieste in cui i dati sono stati persi.
  • Supporta la transizione tra reti. Questa funzionalità è utile per i dispositivi mobili in cui è comune passare da una rete wi-fi all'altra perché un dispositivo mobile cambia posizione. Attualmente le connessioni HTTP/1.1 e HTTP/2 hanno esito negativo e si verifica un errore durante il cambio di reti. Un'app o un Web browser deve ritentare eventuali richieste HTTP non riuscite. HTTP/3 consente all'app o al Web browser di continuare senza problemi quando cambia la rete. Kestrel non supporta le transizioni di rete in .NET 6. Il supporto potrebbe essere disponibile in una versione futura.