Delen via


HTTP/3 gebruiken met de ASP.NET Core-webserver Kestrel

Opmerking

Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikel voor de huidige release.

Waarschuwing

Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 9-versie van dit artikel voor de huidige release.

Belangrijk

Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.

Zie de .NET 9-versie van dit artikel voor de huidige release.

HTTP/3 is een goedgekeurde standaard en de derde primaire versie van HTTP. In dit artikel worden de vereisten voor HTTP/3 besproken. HTTP/3 wordt volledig ondersteund in .NET 7 of hoger.

Belangrijk

Apps die zijn geconfigureerd om te profiteren van HTTP/3, moeten worden ontworpen om ook HTTP/1.1 en HTTP/2 te ondersteunen.

VOORDELEN VAN HTTP/3

HTTP/3:

  • Is de nieuwste versie van het Hypertext Transfer Protocol.
  • Bouwt voort op de sterke punten van HTTP/2, terwijl het sommige van de beperkingen aanpakt, met name wat betreft prestaties, latentie, betrouwbaarheid en beveiliging.
Eigenschap HTTP/2 HTTP/3
Vervoer Maakt gebruik van TCP Maakt gebruik van QUIC
Verbinding Langzamer vanwege TCP + TLS Sneller met 0-RTT QUIC
Configuratie handdruk Handdrukken
Hoofd-van-lijn Beïnvloed door TCP-niveau Geëlimineerd met QUIC
Blokkeren Blokkeren stream-multiplexen
Encryptie TLS via TCP TLS is ingebouwd in QUIC

De belangrijkste verschillen van HTTP/2 tot:HTTP/3

  • TransportProtocol: HTTP/3 maakt gebruik van QUIC in plaats van TCP. QUIC biedt verbeterde prestaties, lagere latentie en betere betrouwbaarheid, met name op mobiele en lossy netwerken.
  • Head-of-Line Blocking: HTTP/2 kan last hebben van kop-of-lijnblokkering op TCP-niveau, waarbij een vertraging in de ene stroom van invloed kan zijn op andere stromen. HTTP/3, met QUIC, biedt onafhankelijke streams, zodat pakketverlies in de ene stream de andere niet ophoudt.
  • Verbindingsopbouw: HTTP/3 met QUIC kunnen verbindingen sneller tot stand brengen, soms in nul rondreistijd (0-RTT) voor terugkerende klanten, omdat het transport- en versleutelingshanddrukken combineert.
  • Versleuteling: HTTP/3 vereist TLS 1.3-versleuteling, waarbij standaard verbeterde beveiliging wordt geboden, terwijl dit optioneel is in HTTP/2.
  • Multiplexing: hoewel beide ondersteuning bieden voor multiplexing, HTTP/3is de implementatie met QUIC efficiënter en voorkomt u de problemen met head-of-line-blokkeren op TCP-niveau.
  • Verbindingsmigratie: QUIC zorgt HTTP/3 ervoor dat verbindingen behouden blijven, zelfs wanneer het IP-adres van een client verandert (zoals overschakelen van Wi-Fi naar mobiel), waardoor de gebruikerservaring van mobiele apparaten wordt verbeterd.

HTTP/3-vereisten

HTTP/3 maakt gebruik van QUIC als transportprotocol. De ASP.NET Core-implementatie van HTTP/3 is afhankelijk van MsQuic om QUIC-functionaliteit te bieden. Als gevolg hiervan is ASP.NET Core-ondersteuning van HTTP/3 afhankelijk van de vereisten van het MsQuic-platform. Zie QUIC-platformafhankelijkheden voor meer informatie over het installeren van MsQuic. Als het platform waarop Kestrel wordt uitgevoerd niet alle vereisten voor HTTP/3 heeft, wordt het uitgeschakeld, en zal Kestrel terugvallen op andere HTTP-protocollen.

Aan de slag

HTTP/3 is niet standaard ingeschakeld. Voeg configuratie toe aan Program.cs om HTTP/3 in te schakelen.

var builder = WebApplication.CreateBuilder(args);

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

Met de voorgaande code wordt poort 5001 geconfigureerd voor:

  • Gebruik HTTP/3 naast HTTP/1.1 en HTTP/2 door op te HttpProtocols.Http1AndHttp2AndHttp3geven.
  • Schakel HTTPS in met UseHttps. HTTP/3 vereist HTTPS.

Omdat niet alle routers, firewalls en proxy's HTTP/3 correct ondersteunen, moet HTTP/3 samen met HTTP/1.1 en HTTP/2 worden geconfigureerd. U kunt dit doen door de ondersteunde protocollen van een eindpunt op te HttpProtocols.Http1AndHttp2AndHttp3 geven.

Zie Eindpunten configureren voor de ASP.NET Core Kestrel webservervoor meer informatie.

Alt-svc

HTTP/3 wordt gedetecteerd als een upgrade van HTTP/1.1 of HTTP/2 via de alt-svc-header. Dat betekent dat de eerste aanvraag normaal gesproken HTTP/1.1 of HTTP/2 gebruikt voordat u overschakelt naar HTTP/3. Kestrel voegt automatisch de alt-svc header toe als HTTP/3 is ingeschakeld.

Localhost testen

Voor meer informatie over hoe je HTTP/3 met HttpClient kunt gebruiken, zie HTTP/3 met .NET.

HTTP/3 is een voorgestelde standaard en de derde primaire versie van HTTP. In dit artikel worden de vereisten voor HTTP/3 besproken. HTTP/3 wordt volledig ondersteund in .NET 7 of hoger.

Belangrijk

Apps die zijn geconfigureerd om te profiteren van HTTP/3, moeten worden ontworpen om ook HTTP/1.1 en HTTP/2 te ondersteunen.

HTTP/3-vereisten

HTTP/3 heeft verschillende vereisten, afhankelijk van het besturingssysteem. Als het platform waarop Kestrel wordt uitgevoerd niet aan alle vereisten voor HTTP/3 voldoet, wordt het uitgeschakeld, en valt Kestrel terug op andere HTTP-protocollen.

Ramen

  • Windows 11 Build 22000 of hoger of Windows Server 2022.
  • TLS 1.3- of hogerverbinding.

Linux

  • libmsquic het pakket is geïnstalleerd.

libmsquic wordt gepubliceerd via de officiële Linux-pakketopslagplaats van Microsoft op packages.microsoft.com. Ga als volgt te werk om dit pakket te installeren:

  1. Voeg de packages.microsoft.com opslagplaats toe. Zie De Linux-softwareopslagplaats voor Microsoft-producten voor instructies.
  2. Installeer het libmsquic pakket met behulp van pakketbeheer van de distributie. Bijvoorbeeld apt install libmsquic=1.9* op Ubuntu.

Opmerking: .NET 6 is alleen compatibel met de 1.9.x-versies van libmsquic. Libmsquic 2.x is niet compatibel vanwege ingrijpende veranderingen. Libmsquic ontvangt updates voor 1.9.x wanneer dat nodig is om beveiligingsoplossingen op te nemen.

macOS

HTTP/3 wordt momenteel niet ondersteund in macOS en is mogelijk beschikbaar in een toekomstige release.

Aan de slag

HTTP/3 is niet standaard ingeschakeld. Voeg configuratie toe aan Program.cs om HTTP/3 in te schakelen.

var builder = WebApplication.CreateBuilder(args);

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

Met de voorgaande code wordt poort 5001 geconfigureerd voor:

  • Gebruik HTTP/3 naast HTTP/1.1 en HTTP/2 door op te HttpProtocols.Http1AndHttp2AndHttp3geven.
  • Schakel HTTPS in met UseHttps. HTTP/3 vereist HTTPS.

Omdat niet alle routers, firewalls en proxy's HTTP/3 correct ondersteunen, moet HTTP/3 samen met HTTP/1.1 en HTTP/2 worden geconfigureerd. U kunt dit doen door de ondersteunde protocollen van een eindpunt op te HttpProtocols.Http1AndHttp2AndHttp3 geven.

Zie Eindpunten configureren voor de ASP.NET Core Kestrel webservervoor meer informatie.

Alt-svc

HTTP/3 wordt gedetecteerd als een upgrade van HTTP/1.1 of HTTP/2 via de alt-svc-header. Dat betekent dat de eerste aanvraag normaal gesproken HTTP/1.1 of HTTP/2 gebruikt voordat u overschakelt naar HTTP/3. Kestrel voegt automatisch de alt-svc header toe als HTTP/3 is ingeschakeld.

Localhost testen

VOORDELEN VAN HTTP/3

HTTP/3 maakt gebruik van dezelfde semantiek als HTTP/1.1 en HTTP/2: dezelfde aanvraagmethoden, statuscodes en berichtvelden zijn van toepassing op alle versies. De verschillen zijn in het onderliggende transport. Zowel HTTP/1.1 als HTTP/2 gebruiken TCP als transport. HTTP/3 maakt gebruik van een nieuwe transporttechnologie die is ontwikkeld naast HTTP/3 met de naam QUIC.

HTTP/3 en QUIC hebben een aantal voordelen vergeleken met HTTP/1.1 en HTTP/2:

  • Snellere reactietijd van de eerste aanvraag. QUIC en HTTP/3 onderhandelen over de verbinding in minder rondes tussen de Client en de Server. De eerste aanvraag bereikt de server sneller.
  • Verbeterde ervaring bij verlies van verbindingspakketten. HTTP/2 maakt meervoudige overdracht van meerdere aanvragen mogelijk via één TCP-verbinding. Pakketverlies op de verbinding is van invloed op alle aanvragen. Dit probleem wordt 'head-of-line blocking' genoemd (kop-van-de-lijn blokkering). Omdat QUIC systeemeigen multiplexing biedt, hebben verloren pakketten alleen invloed op de aanvragen waar gegevens verloren zijn gegaan.
  • Ondersteunt de overgang tussen netwerken. Deze functie is handig voor mobiele apparaten waar het gebruikelijk is om te schakelen tussen WIFI- en mobiele netwerken, omdat een mobiel apparaat de locatie wijzigt. Momenteel mislukken HTTP/1.1- en HTTP/2-verbindingen met een fout bij het schakelen tussen netwerken. Een app of webbrowser moet eventuele mislukte HTTP-aanvragen opnieuw proberen. Met HTTP/3 kan de app of webbrowser naadloos doorgaan wanneer een netwerk wordt gewijzigd. Kestrel biedt geen ondersteuning voor netwerkovergangen in .NET 6. Het is mogelijk beschikbaar in een toekomstige release.

HTTP/3 is de derde en aanstaande primaire versie van HTTP. In dit artikel worden de vereisten voor HTTP/3 besproken en hoe u Kestrel kunt configureren om het te gebruiken.

Belangrijk

HTTP/3 is beschikbaar in .NET 6 als preview-functie. De HTTP/3-specificatie is niet voltooid en er kunnen gedrags- of prestatieproblemen optreden in HTTP/3 met .NET 6.

Zie de sectie preview-functies die worden ondersteund voor meer informatie over ondersteuning voor preview-functies.

Apps die zijn geconfigureerd om te profiteren van HTTP/3, moeten worden ontworpen om ook HTTP/1.1 en HTTP/2 te ondersteunen. Als er problemen worden geïdentificeerd in HTTP/3, raden we u aan HTTP/3 uit te schakelen totdat de problemen in een toekomstige release van ASP.NET Core zijn opgelost. Belangrijke problemen worden gerapporteerd in de GitHub-opslagplaats aankondigingen.

HTTP/3-vereisten

HTTP/3 heeft verschillende vereisten, afhankelijk van het besturingssysteem. Als het platform waarop Kestrel wordt uitgevoerd niet aan alle vereisten voor HTTP/3 voldoet, wordt het uitgeschakeld, en valt Kestrel terug op andere HTTP-protocollen.

Ramen

  • Windows 11 Build 22000 of hoger of Windows Server 2022.
  • TLS 1.3- of hogerverbinding.

Linux

  • libmsquic het pakket is geïnstalleerd.

libmsquic wordt gepubliceerd via de officiële Linux-pakketopslagplaats van Microsoft op packages.microsoft.com. Ga als volgt te werk om dit pakket te installeren:

  1. Voeg de packages.microsoft.com opslagplaats toe. Zie De Linux-softwareopslagplaats voor Microsoft-producten voor instructies.
  2. Installeer het libmsquic pakket met behulp van pakketbeheer van de distributie. Bijvoorbeeld apt install libmsquic=1.9* op Ubuntu.

Opmerking: .NET 6 is alleen compatibel met de 1.9.x-versies van libmsquic. Libmsquic 2.x is niet compatibel vanwege ingrijpende veranderingen. Libmsquic ontvangt updates voor 1.9.x wanneer dat nodig is om beveiligingsoplossingen op te nemen.

macOS

HTTP/3 wordt momenteel niet ondersteund in macOS en is mogelijk beschikbaar in een toekomstige release.

Aan de slag

HTTP/3 is niet standaard ingeschakeld. Voeg configuratie toe aan Program.cs om HTTP/3 in te schakelen.

var builder = WebApplication.CreateBuilder(args);

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

Met de voorgaande code wordt poort 5001 geconfigureerd voor:

  • Gebruik HTTP/3 naast HTTP/1.1 en HTTP/2 door op te HttpProtocols.Http1AndHttp2AndHttp3geven.
  • Schakel HTTPS in met UseHttps. HTTP/3 vereist HTTPS.

Omdat niet alle routers, firewalls en proxy's HTTP/3 correct ondersteunen, moet HTTP/3 samen met HTTP/1.1 en HTTP/2 worden geconfigureerd. U kunt dit doen door de ondersteunde protocollen van een eindpunt op te HttpProtocols.Http1AndHttp2AndHttp3 geven.

Zie Eindpunten configureren voor de ASP.NET Core Kestrel webservervoor meer informatie.

Alt-svc

HTTP/3 wordt gedetecteerd als een upgrade van HTTP/1.1 of HTTP/2 via de alt-svc-header. Dat betekent dat de eerste aanvraag normaal gesproken HTTP/1.1 of HTTP/2 gebruikt voordat u overschakelt naar HTTP/3. Kestrel voegt automatisch de alt-svc header toe als HTTP/3 is ingeschakeld.

Localhost testen

  • Browsers staan zelfondertekende certificaten niet toe op HTTP/3, zoals het Kestrel ontwikkelingscertificaat.

  • HttpClient kan worden gebruikt voor het testen van localhost/loopback in .NET 6 of hoger. Er is extra configuratie vereist bij het maken van HttpClient een HTTP/3-aanvraag:

    • Ingesteld HttpRequestMessage.Version op 3.0 of
    • Stel HttpRequestMessage.VersionPolicy in op HttpVersionPolicy.RequestVersionOrHigher.

Beperkingen

Sommige HTTPS-scenario's worden nog niet ondersteund voor HTTP/3 in Kestrel. Wanneer u Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps aanroept met HttpsConnectionAdapterOptions terwijl u HTTP/3 gebruikt, heeft het instellen van de volgende opties op de HttpsConnectionAdapterOptions geen effect (no-op):

Het aanroepen van de volgende implementaties resulteert in een fout bij het gebruik van Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps HTTP/3.

VOORDELEN VAN HTTP/3

HTTP/3 maakt gebruik van dezelfde semantiek als HTTP/1.1 en HTTP/2: dezelfde aanvraagmethoden, statuscodes en berichtvelden zijn van toepassing op alle versies. De verschillen zijn in het onderliggende transport. Zowel HTTP/1.1 als HTTP/2 gebruiken TCP als transport. HTTP/3 maakt gebruik van een nieuwe transporttechnologie die is ontwikkeld naast HTTP/3 met de naam QUIC.

HTTP/3 en QUIC hebben een aantal voordelen vergeleken met HTTP/1.1 en HTTP/2:

  • Snellere reactietijd van de eerste aanvraag. QUIC en HTTP/3 onderhandelen over de verbinding in minder rondes tussen de Client en de Server. De eerste aanvraag bereikt de server sneller.
  • Verbeterde ervaring bij verlies van verbindingspakketten. HTTP/2 maakt meervoudige overdracht van meerdere aanvragen mogelijk via één TCP-verbinding. Pakketverlies op de verbinding is van invloed op alle aanvragen. Dit probleem wordt 'head-of-line blocking' genoemd (kop-van-de-lijn blokkering). Omdat QUIC systeemeigen multiplexing biedt, hebben verloren pakketten alleen invloed op de aanvragen waar gegevens verloren zijn gegaan.
  • Ondersteunt de overgang tussen netwerken. Deze functie is handig voor mobiele apparaten waar het gebruikelijk is om te schakelen tussen WIFI- en mobiele netwerken, omdat een mobiel apparaat de locatie wijzigt. Momenteel mislukken HTTP/1.1- en HTTP/2-verbindingen met een fout bij het schakelen tussen netwerken. Een app of webbrowser moet eventuele mislukte HTTP-aanvragen opnieuw proberen. Met HTTP/3 kan de app of webbrowser naadloos doorgaan wanneer een netwerk wordt gewijzigd. Kestrel biedt geen ondersteuning voor netwerkovergangen in .NET 6. Het is mogelijk beschikbaar in een toekomstige release.