Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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/2e 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/3usa 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/2può 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/3con 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/3impone la crittografia TLS 1.3, offrendo sicurezza avanzata per impostazione predefinita, mentre è facoltativa inHTTP/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/3consente 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
I browser non consentono certificati autofirmato su HTTP/3, ad esempio il Kestrel certificato di sviluppo.
HttpClientpuò essere usato per i test localhost/loopback in .NET 6 o versione successiva. È necessaria una configurazione aggiuntiva quando si usaHttpClientper effettuare una richiesta HTTP/3:- Impostare su
HttpRequestMessage.Version3.0 o - Impostare
HttpRequestMessage.VersionPolicysuHttpVersionPolicy.RequestVersionOrHigher.
- Impostare su
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
-
libmsquicpacchetto installato.
libmsquic viene pubblicato tramite il repository ufficiale dei pacchetti Linux di Microsoft all'indirizzo packages.microsoft.com. Per installare questo pacchetto:
- Aggiungere il
packages.microsoft.comrepository. Per istruzioni, vedere Repository software Linux per prodotti Microsoft. - Installare il
libmsquicpacchetto 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.
HttpClientpuò essere usato per i test localhost/loopback in .NET 6 o versione successiva. È necessaria una configurazione aggiuntiva quando si usaHttpClientper effettuare una richiesta HTTP/3:- Impostare su
HttpRequestMessage.Version3.0 o - Impostare
HttpRequestMessage.VersionPolicysuHttpVersionPolicy.RequestVersionOrHigher.
- Impostare su
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
-
libmsquicpacchetto installato.
libmsquic viene pubblicato tramite il repository ufficiale dei pacchetti Linux di Microsoft all'indirizzo packages.microsoft.com. Per installare questo pacchetto:
- Aggiungere il
packages.microsoft.comrepository. Per istruzioni, vedere Repository software Linux per prodotti Microsoft. - Installare il
libmsquicpacchetto 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.
HttpClientpuò essere usato per i test localhost/loopback in .NET 6 o versione successiva. È necessaria una configurazione aggiuntiva quando si usaHttpClientper effettuare una richiesta HTTP/3:- Impostare su
HttpRequestMessage.Version3.0 o - Impostare
HttpRequestMessage.VersionPolicysuHttpVersionPolicy.RequestVersionOrHigher.
- Impostare su
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:
- UseHttps(this ListenOptions listenOptions, ServerOptionsSelectionCallback serverOptionsSelectionCallback, object state, TimeSpan handshakeTimeout)
- UseHttps(this ListenOptions listenOptions, TlsHandshakeCallbackOptions callbackOptions)
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.