Condividi tramite


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 10 di questo articolo.

Avviso

Questa versione di ASP.NET Core non è più supportata. Per altre informazioni, vedere i criteri di supporto di .NET e .NET Core. Per la versione corrente, vedere la versione .NET 10 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 .NET 7 o versione successiva.

Importante

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

Vantaggi di HTTP/3

HTTP/3:

  • Versione più recente del protocollo di trasferimento hypertext.
  • Si basa sui punti di forza di HTTP/2 e affronta alcune delle sue limitazioni, in particolare in termini di prestazioni, latenza, affidabilità e sicurezza.
Caratteristica / Funzionalità HTTP/2 HTTP/3
Trasporto Usa TCP Usa QUIC
Connessione Più lento a causa di TCP + TLS Più veloce con 0-RTT QUIC
Configurazione stretta di mano Strette di mano
Testa-di-Linea Influenzato dal livello TCP Eliminato tramite QUIC
Blocco inceppamento multiplexing del flusso
Crittografia TLS su TCP TLS è integrato in QUIC

Le differenze principali da HTTP/2 a HTTP/3 sono:

  • Protocollo di trasporto: HTTP/3 usa QUIC anziché TCP. QUIC offre prestazioni migliorate, una latenza inferiore e una migliore affidabilità, soprattutto nelle reti mobili e con perdita.
  • Blocco Head-of-Line: HTTP/2 può subire un blocco Head-of-Line a livello TCP, in cui un ritardo in un flusso può influire sugli altri. HTTP/3, con QUIC, fornisce flussi indipendenti, quindi la perdita di pacchetti in un flusso non blocca gli altri.
  • Stabilimento della connessione: HTTP/3 con QUIC è possibile stabilire connessioni più velocemente, a volte in tempo zero di andata e ritorno (0-RTT) per i clienti che tornano, in quanto combina handshake di trasporto e crittografia.
  • Crittografia: HTTP/3 impone la crittografia TLS 1.3, offrendo sicurezza avanzata per impostazione predefinita, mentre è facoltativa in HTTP/2.
  • Multiplexing: mentre entrambi supportano il multiplexing, HTTP/3l'implementazione con QUIC è più efficiente ed evita i problemi di blocco head-of-line a livello TCP.
  • Migrazione della connessione: QUIC in HTTP/3 consente la persistenza delle connessioni anche quando l'indirizzo IP di un client cambia (ad esempio passando da Wi-Fi alla rete cellulare), migliorando l'esperienza utente mobile.

Requisiti HTTP/3

HTTP/3 usa QUIC come protocollo di trasporto. L'implementazione di ASP.NET Core di HTTP/3 dipende da MsQuic per fornire funzionalità QUIC. Di conseguenza, ASP.NET supporto core di HTTP/3 dipende dai requisiti della piattaforma MsQuic. Per altre informazioni su come installare MsQuic, vedere Dipendenze della piattaforma QUIC. 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.

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 Kestrel Web ASP.NET Core.

Configurare QuicTransportOptions

Le opzioni di trasporto QUIC possono essere configurate chiamando il UseQuic metodo di estensione in 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();
            });
        });

Nella tabella seguente vengono descritte le opzioni disponibili QuicTransportOptions.

Opzione Impostazione predefinita Description
MaxBidirectionalStreamCount 100 Numero massimo di flussi bidirezionali simultanei per ogni connessione.
MaxUnidirectionalStreamCount 10 Numero massimo di flussi unidirectionali in ingresso simultanei per ogni connessione.
MaxReadBufferSize 1024 * 1024 (1 MB) Dimensione massima del buffer di lettura in byte.
MaxWriteBufferSize 64 * 1024 (64 KB) Dimensione massima del buffer di scrittura in byte.
Backlog 512 Lunghezza massima della coda di connessione in sospeso.
DefaultStreamErrorCode 0x010c (RICHIESTA_ANNULLATA) Codice di errore utilizzato quando il flusso deve interrompere internamente il lato di lettura o il lato di scrittura del flusso.
DefaultCloseErrorCode 0x100 (H3_NO_ERROR) Codice di errore usato quando viene eliminata una connessione aperta.

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

Per altre informazioni su come usare HTTP/3 con HttpClient, vedere HTTP/3 con .NET.

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 .NET 7 o versione successiva.

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.

Finestre

  • 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 Kestrel Web ASP.NET Core.

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.

Finestre

  • 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 Kestrel Web ASP.NET Core.

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.