Dela via


Använda HTTP/3 med webbservern ASP.NET Core Kestrel

Anmärkning

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Viktigt!

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

HTTP/3 är en godkänd standard och den tredje huvudversionen av HTTP. I den här artikeln beskrivs kraven för HTTP/3. HTTP/3 stöds fullt ut i .NET 7 eller senare.

Viktigt!

Appar som har konfigurerats för att dra nytta av HTTP/3 bör utformas för att även stödja HTTP/1.1 och HTTP/2.

HTTP/3-förmåner

HTTP/3:

  • Är den senaste versionen av Hypertext Transfer Protocol.
  • Bygger på fördelarna med HTTP/2 att hantera vissa av dess begränsningar, särskilt när det gäller prestanda, svarstid, tillförlitlighet och säkerhet.
Egenskap HTTP/2 HTTP/3
Transport Använder TCP Använder QUIC
Anslutning Långsammare på grund av TCP + TLS Snabbare med 0-RTT QUIC
Inställningar handskakning Handslag
Huvudlinje Påverkas av TCP-nivå Eliminerad med QUIC
Blockera blockering strömma multiplexering
Kryptering TLS över TCP TLS är inbyggt i QUIC

De viktigaste skillnaderna från HTTP/2 till HTTP/3 är:

  • Transport Protocol: HTTP/3 använder QUIC i stället för TCP. QUIC erbjuder bättre prestanda, kortare svarstid och bättre tillförlitlighet, särskilt i mobila och förlustfyllda nätverk.
  • Head-of-Line Blockering: HTTP/2 kan drabbas av head-of-line blockering på TCP-nivå, där en fördröjning i en ström kan påverka andra. HTTP/3, med QUIC, tillhandahåller oberoende strömmar, så paketförlust i en ström stoppar inte andra.
  • Anslutningsetablering: HTTP/3 med QUIC kan upprätta anslutningar snabbare, ibland med noll omgångstid (0-RTT) för återkommande klienter, eftersom det kombinerar handskakningar för transport och kryptering.
  • Kryptering: HTTP/3 kräver TLS 1.3-kryptering, vilket ger förbättrad säkerhet som standard, medan det är valfritt i HTTP/2.
  • Multiplexing: Båda stöder multiplexering, HTTP/3men implementeringen med QUIC är effektivare och undviker problem med blockering på TCP-nivå.
  • Anslutningsmigrering: QUIC i HTTP/3 gör att anslutningar kan bevaras även när en klients IP-adress ändras (t.ex. att växla från Wi-Fi till mobil), vilket förbättrar användarupplevelsen för mobilen.

HTTP/3-krav

HTTP/3 använder QUIC som transportprotokoll. ASP.NET Core-implementeringen av HTTP/3 är beroende av MsQuic för att tillhandahålla QUIC-funktioner. Därför är ASP.NET Core-stöd för HTTP/3 beroende av msQuic-plattformskrav. Mer information om hur du installerar MsQuic finns i QUIC Platform-beroenden. Om plattformen som Kestrel körs på inte har alla krav för HTTP/3 inaktiveras den och Kestrel återgår till andra HTTP-protokoll.

Komma igång

HTTP/3 är inte aktiverat som standard. Lägg till konfiguration för Program.cs att aktivera HTTP/3.

var builder = WebApplication.CreateBuilder(args);

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

Föregående kod konfigurerar port 5001 till:

  • Använd HTTP/3 tillsammans med HTTP/1.1 och HTTP/2 genom att ange HttpProtocols.Http1AndHttp2AndHttp3.
  • Aktivera HTTPS med UseHttps. HTTP/3 kräver HTTPS.

Eftersom inte alla routrar, brandväggar och proxyservrar stöder HTTP/3 korrekt bör HTTP/3 konfigureras tillsammans med HTTP/1.1 och HTTP/2. Detta kan göras genom att ange HttpProtocols.Http1AndHttp2AndHttp3 som protokoll som stöds av en slutpunkt.

Mer information finns i Konfigurera slutpunkter för ASP.NET Core Kestrel-webbservern.

Alt-svc

HTTP/3 identifieras som en uppgradering från HTTP/1.1 eller HTTP/2 via alt-svc-huvudet. Det innebär att den första begäran normalt använder HTTP/1.1 eller HTTP/2 innan den växlar till HTTP/3. Kestrel lägger automatiskt till alt-svc rubriken om HTTP/3 är aktiverat.

Localhost-testning

Mer information om hur du använder HTTP/3 med HttpClientfinns i HTTP/3 med .NET.

HTTP/3 är en föreslagen standard och den tredje huvudversionen av HTTP. I den här artikeln beskrivs kraven för HTTP/3. HTTP/3 stöds fullt ut i .NET 7 eller senare.

Viktigt!

Appar som har konfigurerats för att dra nytta av HTTP/3 bör utformas för att även stödja HTTP/1.1 och HTTP/2.

HTTP/3-krav

HTTP/3 har olika krav beroende på operativsystemet. Om plattformen som Kestrel körs på inte har alla krav för HTTP/3 inaktiveras den och Kestrel återgår till andra HTTP-protokoll.

Windows

  • Windows 11 Build 22000 eller senare ELLER Windows Server 2022.
  • TLS 1.3 eller senare anslutning.

Linux

  • libmsquic paket har installerats.

libmsquic publiceras via Microsofts officiella Linux-paketlagringsplats på packages.microsoft.com. Så här installerar du det här paketet:

  1. Lägg till lagringsplatsen packages.microsoft.com . Se Linux Software Repository for Microsoft Products (Linux-lagringsplats för Microsoft-produkter ) för anvisningar.
  2. libmsquic Installera paketet med distributionens pakethanterare. Till exempel apt install libmsquic=1.9* på Ubuntu.

Obs! .NET 6 är endast kompatibelt med 1.9.x-versionerna av libmsquic. Libmsquic 2.x är inte kompatibelt på grund av genombrottsförändringar. Libmsquic tar emot uppdateringar till 1.9.x när det behövs för att införliva säkerhetskorrigeringar.

macOS

HTTP/3 stöds inte för närvarande på macOS och kan vara tillgängligt i en framtida version.

Komma igång

HTTP/3 är inte aktiverat som standard. Lägg till konfiguration för Program.cs att aktivera HTTP/3.

var builder = WebApplication.CreateBuilder(args);

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

Föregående kod konfigurerar port 5001 till:

  • Använd HTTP/3 tillsammans med HTTP/1.1 och HTTP/2 genom att ange HttpProtocols.Http1AndHttp2AndHttp3.
  • Aktivera HTTPS med UseHttps. HTTP/3 kräver HTTPS.

Eftersom inte alla routrar, brandväggar och proxyservrar stöder HTTP/3 korrekt bör HTTP/3 konfigureras tillsammans med HTTP/1.1 och HTTP/2. Detta kan göras genom att ange HttpProtocols.Http1AndHttp2AndHttp3 som protokoll som stöds av en slutpunkt.

Mer information finns i Konfigurera slutpunkter för ASP.NET Core Kestrel-webbservern.

Alt-svc

HTTP/3 identifieras som en uppgradering från HTTP/1.1 eller HTTP/2 via alt-svc-huvudet. Det innebär att den första begäran normalt använder HTTP/1.1 eller HTTP/2 innan den växlar till HTTP/3. Kestrel lägger automatiskt till alt-svc rubriken om HTTP/3 är aktiverat.

Localhost-testning

HTTP/3-förmåner

HTTP/3 använder samma semantik som HTTP/1.1 och HTTP/2: samma metoder för begäran, statuskoder och meddelandefält gäller för alla versioner. Skillnaderna finns i den underliggande transporten. Både HTTP/1.1 och HTTP/2 använder TCP som transport. HTTP/3 använder en ny transportteknik som utvecklats tillsammans med HTTP/3 som kallas QUIC.

HTTP/3 och QUIC har ett antal fördelar jämfört med HTTP/1.1 och HTTP/2:

  • Snabbare svarstid för den första begäran. QUIC och HTTP/3 förhandlar om anslutningen i färre turer mellan klienten och servern. Den första begäran når servern snabbare.
  • Förbättrad upplevelse när det uppstår förlust av anslutningspaket. HTTP/2 multiplexar flera begäranden via en TCP-anslutning. Paketförlust på anslutningen påverkar alla begäranden. Det här problemet kallas "head-of-line blocking". Eftersom QUIC tillhandahåller intern multiplexering påverkar förlorade paket endast begäranden där data har gått förlorade.
  • Stöder övergång mellan nätverk. Den här funktionen är användbar för mobila enheter där det är vanligt att växla mellan WIFI och mobilnät när en mobil enhet byter plats. För närvarande misslyckas HTTP/1.1- och HTTP/2-anslutningar med ett fel vid byte av nätverk. En app eller webbläsare måste försöka igen med misslyckade HTTP-begäranden. MED HTTP/3 kan appen eller webbläsaren sömlöst fortsätta när ett nätverk ändras. Kestrel stöder inte nätverksövergångar i .NET 6. Den kan vara tillgänglig i en framtida version.

HTTP/3 är den tredje och kommande huvudversionen av HTTP. I den här artikeln beskrivs kraven för HTTP/3 och hur du konfigurerar Kestrel att använda den.

Viktigt!

HTTP/3 är tillgängligt i .NET 6 som en förhandsgranskningsfunktion. HTTP/3-specifikationen är inte slutförd och beteende- eller prestandaproblem kan finnas i HTTP/3 med .NET 6.

Mer information om stöd för förhandsversionsfunktioner finns i avsnittet för förhandsversionsfunktioner som stöds.

Appar som har konfigurerats för att dra nytta av HTTP/3 bör utformas för att även stödja HTTP/1.1 och HTTP/2. Om problem identifieras i HTTP/3 rekommenderar vi att du inaktiverar HTTP/3 tills problemen har lösts i en framtida version av ASP.NET Core. Betydande problem rapporteras på GitHub-lagringsplatsen Meddelanden.

HTTP/3-krav

HTTP/3 har olika krav beroende på operativsystemet. Om plattformen som Kestrel körs på inte har alla krav för HTTP/3 inaktiveras den och Kestrel återgår till andra HTTP-protokoll.

Windows

  • Windows 11 Build 22000 eller senare ELLER Windows Server 2022.
  • TLS 1.3 eller senare anslutning.

Linux

  • libmsquic paket har installerats.

libmsquic publiceras via Microsofts officiella Linux-paketlagringsplats på packages.microsoft.com. Så här installerar du det här paketet:

  1. Lägg till lagringsplatsen packages.microsoft.com . Se Linux Software Repository for Microsoft Products (Linux-lagringsplats för Microsoft-produkter ) för anvisningar.
  2. libmsquic Installera paketet med distributionens pakethanterare. Till exempel apt install libmsquic=1.9* på Ubuntu.

Obs! .NET 6 är endast kompatibelt med 1.9.x-versionerna av libmsquic. Libmsquic 2.x är inte kompatibelt på grund av genombrottsförändringar. Libmsquic tar emot uppdateringar till 1.9.x när det behövs för att införliva säkerhetskorrigeringar.

macOS

HTTP/3 stöds inte för närvarande på macOS och kan vara tillgängligt i en framtida version.

Komma igång

HTTP/3 är inte aktiverat som standard. Lägg till konfiguration för Program.cs att aktivera HTTP/3.

var builder = WebApplication.CreateBuilder(args);

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

Föregående kod konfigurerar port 5001 till:

  • Använd HTTP/3 tillsammans med HTTP/1.1 och HTTP/2 genom att ange HttpProtocols.Http1AndHttp2AndHttp3.
  • Aktivera HTTPS med UseHttps. HTTP/3 kräver HTTPS.

Eftersom inte alla routrar, brandväggar och proxyservrar stöder HTTP/3 korrekt bör HTTP/3 konfigureras tillsammans med HTTP/1.1 och HTTP/2. Detta kan göras genom att ange HttpProtocols.Http1AndHttp2AndHttp3 som protokoll som stöds av en slutpunkt.

Mer information finns i Konfigurera slutpunkter för ASP.NET Core Kestrel-webbservern.

Alt-svc

HTTP/3 identifieras som en uppgradering från HTTP/1.1 eller HTTP/2 via alt-svc-huvudet. Det innebär att den första begäran normalt använder HTTP/1.1 eller HTTP/2 innan den växlar till HTTP/3. Kestrel lägger automatiskt till alt-svc rubriken om HTTP/3 är aktiverat.

Localhost-testning

  • Webbläsare tillåter inte självsignerade certifikat på HTTP/3, till exempel Kestrel utvecklingscertifikatet.

  • HttpClient kan användas för localhost/loopback-testning i .NET 6 eller senare. Extra konfiguration krävs när du använder HttpClient för att göra en HTTP/3-begäran:

    • Ange HttpRequestMessage.Version till 3.0 eller
    • Ställ in HttpRequestMessage.VersionPolicyHttpVersionPolicy.RequestVersionOrHigher.

Begränsningar

Vissa HTTPS-scenarier stöds ännu inte för HTTP/3 i Kestrel. När du använder HTTP/3 och anropar Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps med HttpsConnectionAdapterOptions gör följande alternativ på HttpsConnectionAdapterOptions ingenting (no-op):

Genom att anropa följande implementeringar av Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps kommer det att utlösa ett fel när du använder HTTP/3.

HTTP/3-förmåner

HTTP/3 använder samma semantik som HTTP/1.1 och HTTP/2: samma metoder för begäran, statuskoder och meddelandefält gäller för alla versioner. Skillnaderna finns i den underliggande transporten. Både HTTP/1.1 och HTTP/2 använder TCP som transport. HTTP/3 använder en ny transportteknik som utvecklats tillsammans med HTTP/3 som kallas QUIC.

HTTP/3 och QUIC har ett antal fördelar jämfört med HTTP/1.1 och HTTP/2:

  • Snabbare svarstid för den första begäran. QUIC och HTTP/3 förhandlar om anslutningen i färre turer mellan klienten och servern. Den första begäran når servern snabbare.
  • Förbättrad upplevelse när det uppstår förlust av anslutningspaket. HTTP/2 multiplexar flera begäranden via en TCP-anslutning. Paketförlust på anslutningen påverkar alla begäranden. Det här problemet kallas "head-of-line blocking". Eftersom QUIC tillhandahåller intern multiplexering påverkar förlorade paket endast begäranden där data har gått förlorade.
  • Stöder övergång mellan nätverk. Den här funktionen är användbar för mobila enheter där det är vanligt att växla mellan WIFI och mobilnät när en mobil enhet byter plats. För närvarande misslyckas HTTP/1.1- och HTTP/2-anslutningar med ett fel vid byte av nätverk. En app eller webbläsare måste försöka igen med misslyckade HTTP-begäranden. MED HTTP/3 kan appen eller webbläsaren sömlöst fortsätta när ett nätverk ändras. Kestrel stöder inte nätverksövergångar i .NET 6. Den kan vara tillgänglig i en framtida version.