Freigeben über


Verwenden von HTTP/3 mit dem ASP.NET Core-Kestrel-Webserver

Hinweis

Dies ist nicht die neueste Version dieses Artikels. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

Warnung

Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der Supportrichtlinie für .NET und .NET Core. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

Wichtig

Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.

Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

HTTP/3 ist ein anerkannter Standard und die dritte Hauptversion von HTTP. In diesem Artikel werden die Anforderungen für HTTP/3 erläutert. HTTP/3 wird in ASP.NET Core 7.0 und höher vollständig unterstützt.

Wichtig

Für HTTP/3 konfigurierte Apps sollten auch für die Unterstützung von HTTP/1.1 und HTTP/2 ausgelegt sein.

HTTP/3-Anforderungen

HTTP/3 hat je nach Betriebssystem unterschiedliche Anforderungen. Wenn die Plattform, auf der Kestrel ausgeführt wird, nicht über all die Anforderungen für HTTP/3 verfügt, ist HTTP/3 deaktiviert, und für Kestrel wird ein Fallback auf andere HTTP-Protokolle durchgeführt.

Windows

  • Windows 11 Build 22000 oder höher ODER Windows Server 2022.
  • TLS 1.3-Verbindung oder höher.

Linux

  • Das libmsquic-Paket ist installiert.

libmsquic wird über das offizielle Linux-Paketrepository von Microsoft unter packages.microsoft.com veröffentlicht. So installieren Sie das Paket:

  1. Fügen Sie das packages.microsoft.com-Repository hinzu. Eine Anleitung hierzu finden Sie unter Linux-Softwarerepository für Microsoft-Produkte.
  2. Installieren Sie das libmsquic-Paket mithilfe des Paket-Managers der Distribution. Unter Ubuntu ist dies beispielsweise apt install libmsquic=1.9*.

Hinweis: .NET 6 ist nur mit den Versionen 1.9.x von libmsquic kompatibel. Libmsquic 2.x ist aufgrund von Breaking Changes nicht kompatibel. Libmsquic empfängt Updates auf 1.9.x, wenn Sicherheitskorrekturen integriert werden müssen.

macOS

HTTP/3 wird derzeit unter macOS nicht unterstützt, möglicherweise ist es in einer zukünftigen Version verfügbar.

Erste Schritte

HTTP/3 ist nicht standardmäßig aktiviert. Fügen Sie die Konfiguration zu Program.cs hinzu, um HTTP/3 zu aktivieren.

var builder = WebApplication.CreateBuilder(args);

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

Mit dem vorangehenden Code wird Port 5001 für Folgendes konfiguriert:

  • Verwenden von HTTP/3 zusammen mit HTTP/1.1 und HTTP/2 durch Angeben von HttpProtocols.Http1AndHttp2AndHttp3
  • Aktivieren von HTTPS mit UseHttps. HTTP/3 erfordert HTTPS.

Da HTTP/3 nicht von allen Routern, Firewalls und Proxys ordnungsgemäß unterstützt wird, sollte HTTP/3 zusammen mit HTTP/1.1 und HTTP/2 konfiguriert werden. Dazu kann HttpProtocols.Http1AndHttp2AndHttp3 als unterstützte Protokolle eines Endpunkts angegeben wird.

Weitere Informationen finden Sie unter Konfigurieren von Endpunkten für den Kestrel-Webserver von ASP.NET Core.

Alt-svc

HTTP/3 wird anhand des Headers alt-svc als Upgrade von HTTP/1.1 oder HTTP/2 erkannt. Das bedeutet, dass die erste Anforderung normalerweise HTTP/1.1 oder HTTP/2 verwendet, bevor der Wechsel zu HTTP/3 erfolgt. Kestrel fügt den Header alt-svc automatisch hinzu, wenn HTTP/3 aktiviert ist.

Localhost-Tests

Vorteile von HTTP/3

HTTP/3 verwendet die gleiche Semantik wie HTTP/1.1 und HTTP/2: Alle Versionen verwenden die gleichen Anforderungsmethoden, Statuscodes und Nachrichtenfelder. Die Unterschiede bestehen beim zugrunde liegenden Datentransport. Sowohl HTTP/1.1 als auch HTTP/2 verwenden TCP für den Datentransport. HTTP/3 verwendet eine neue Datentransporttechnologie, die parallel zu HTTP/3 entwickelt wurde und QUIC heißt.

HTTP/3 und QUIC bieten im Vergleich zu HTTP/1.1 und HTTP/2 eine Reihe von Vorteilen:

  • Schnellere Antwortzeit der ersten Anforderung. QUIC und HTTP/3 handeln die Verbindung in weniger Roundtrips zwischen dem Client und dem Server aus. Die erste Anforderung erreicht den Server schneller.
  • Verbesserte Verarbeitung beim Verlust von Verbindungspaketen. HTTP/2 führt Multiplexing für mehrere Aufrufe über eine einzige TCP-Verbindung aus. Ein Paketverlust bei der Verbindung wirkt sich auf alle Anforderungen aus. Dieses Problem wird als „Head-of-Line Blocking“ (Blockierung durch den Anfang der Schlange) bezeichnet. Da QUIC natives Multiplexing bietet, wirken sich verlorene Pakete nur auf die Anforderungen aus, bei denen Daten verloren gegangen sind.
  • Unterstützt den Übergang zwischen Netzwerken. Dieses Feature ist nützlich für mobile Geräte, bei denen ein Wechsel zwischen WLAN und Mobilfunknetzwerken üblich ist, wenn ein mobiles Gerät den Standort ändert. Derzeit tritt bei HTTP/1.1- und HTTP/2-Verbindungen beim Wechsel des Netzwerks ein Fehler auf. Eine App oder ein Webbrowser muss alle fehlgeschlagenen HTTP-Anforderungen wiederholen. Bei HTTP/3 kann die App oder der Webbrowser nahtlos fortfahren, wenn sich ein Netzwerk ändert. Kestrel unterstützt keine Netzwerkübergänge in .NET 8. Möglicherweise wird dies in einem zukünftigen Release unterstützt.

HTTP/3 ist ein vorgeschlagener Standard und die dritte Hauptversion von HTTP. In diesem Artikel werden die Anforderungen für HTTP/3 erläutert. HTTP/3 wird in ASP.NET Core 7.0 und höher vollständig unterstützt.

Wichtig

Für HTTP/3 konfigurierte Apps sollten auch für die Unterstützung von HTTP/1.1 und HTTP/2 ausgelegt sein.

HTTP/3-Anforderungen

HTTP/3 hat je nach Betriebssystem unterschiedliche Anforderungen. Wenn die Plattform, auf der Kestrel ausgeführt wird, nicht über all die Anforderungen für HTTP/3 verfügt, ist HTTP/3 deaktiviert, und für Kestrel wird ein Fallback auf andere HTTP-Protokolle durchgeführt.

Windows

  • Windows 11 Build 22000 oder höher ODER Windows Server 2022.
  • TLS 1.3-Verbindung oder höher.

Linux

  • Das libmsquic-Paket ist installiert.

libmsquic wird über das offizielle Linux-Paketrepository von Microsoft unter packages.microsoft.com veröffentlicht. So installieren Sie das Paket:

  1. Fügen Sie das packages.microsoft.com-Repository hinzu. Eine Anleitung hierzu finden Sie unter Linux-Softwarerepository für Microsoft-Produkte.
  2. Installieren Sie das libmsquic-Paket mithilfe des Paket-Managers der Distribution. Unter Ubuntu ist dies beispielsweise apt install libmsquic=1.9*.

Hinweis: .NET 6 ist nur mit den Versionen 1.9.x von libmsquic kompatibel. Libmsquic 2.x ist aufgrund von Breaking Changes nicht kompatibel. Libmsquic empfängt Updates auf 1.9.x, wenn Sicherheitskorrekturen integriert werden müssen.

macOS

HTTP/3 wird derzeit unter macOS nicht unterstützt, möglicherweise ist es in einer zukünftigen Version verfügbar.

Erste Schritte

HTTP/3 ist nicht standardmäßig aktiviert. Fügen Sie die Konfiguration zu Program.cs hinzu, um HTTP/3 zu aktivieren.

var builder = WebApplication.CreateBuilder(args);

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

Mit dem vorangehenden Code wird Port 5001 für Folgendes konfiguriert:

  • Verwenden von HTTP/3 zusammen mit HTTP/1.1 und HTTP/2 durch Angeben von HttpProtocols.Http1AndHttp2AndHttp3
  • Aktivieren von HTTPS mit UseHttps. HTTP/3 erfordert HTTPS.

Da HTTP/3 nicht von allen Routern, Firewalls und Proxys ordnungsgemäß unterstützt wird, sollte HTTP/3 zusammen mit HTTP/1.1 und HTTP/2 konfiguriert werden. Dazu kann HttpProtocols.Http1AndHttp2AndHttp3 als unterstützte Protokolle eines Endpunkts angegeben wird.

Weitere Informationen finden Sie unter Konfigurieren von Endpunkten für den Kestrel-Webserver von ASP.NET Core.

Alt-svc

HTTP/3 wird anhand des Headers alt-svc als Upgrade von HTTP/1.1 oder HTTP/2 erkannt. Das bedeutet, dass die erste Anforderung normalerweise HTTP/1.1 oder HTTP/2 verwendet, bevor der Wechsel zu HTTP/3 erfolgt. Kestrel fügt den Header alt-svc automatisch hinzu, wenn HTTP/3 aktiviert ist.

Localhost-Tests

Vorteile von HTTP/3

HTTP/3 verwendet die gleiche Semantik wie HTTP/1.1 und HTTP/2: Alle Versionen verwenden die gleichen Anforderungsmethoden, Statuscodes und Nachrichtenfelder. Die Unterschiede bestehen beim zugrunde liegenden Datentransport. Sowohl HTTP/1.1 als auch HTTP/2 verwenden TCP für den Datentransport. HTTP/3 verwendet eine neue Datentransporttechnologie, die parallel zu HTTP/3 entwickelt wurde und QUIC heißt.

HTTP/3 und QUIC bieten im Vergleich zu HTTP/1.1 und HTTP/2 eine Reihe von Vorteilen:

  • Schnellere Antwortzeit der ersten Anforderung. QUIC und HTTP/3 handeln die Verbindung in weniger Roundtrips zwischen dem Client und dem Server aus. Die erste Anforderung erreicht den Server schneller.
  • Verbesserte Verarbeitung beim Verlust von Verbindungspaketen. HTTP/2 führt Multiplexing für mehrere Aufrufe über eine einzige TCP-Verbindung aus. Ein Paketverlust bei der Verbindung wirkt sich auf alle Anforderungen aus. Dieses Problem wird als „Head-of-Line Blocking“ (Blockierung durch den Anfang der Schlange) bezeichnet. Da QUIC natives Multiplexing bietet, wirken sich verlorene Pakete nur auf die Anforderungen aus, bei denen Daten verloren gegangen sind.
  • Unterstützt den Übergang zwischen Netzwerken. Dieses Feature ist nützlich für mobile Geräte, bei denen ein Wechsel zwischen WLAN und Mobilfunknetzwerken üblich ist, wenn ein mobiles Gerät den Standort ändert. Derzeit tritt bei HTTP/1.1- und HTTP/2-Verbindungen beim Wechsel des Netzwerks ein Fehler auf. Eine App oder ein Webbrowser muss alle fehlgeschlagenen HTTP-Anforderungen wiederholen. Bei HTTP/3 kann die App oder der Webbrowser nahtlos fortfahren, wenn sich ein Netzwerk ändert. Kestrel unterstützt keine Netzwerkübergänge in .NET 6. Möglicherweise wird dies in einem zukünftigen Release unterstützt.

HTTP/3 ist die dritte und kommende Hauptversion von HTTP. In diesem Artikel werden die Anforderungen für HTTP/3 und die Konfiguration von Kestrel für die Verwendung von HTTP/3 erläutert.

Wichtig

HTTP/3 ist in .NET 6 als Previewfunktion verfügbar. Die HTTP/3-Spezifizierung ist noch nicht abgeschlossen, und Verhaltens- oder Leistungsprobleme können bei HTTP/3 mit .NET 6 vorliegen.

Weitere Informationen zu Previewfunktionen finden Sie in der Spezifikation zu Previewfunktionen.

Für HTTP/3 konfigurierte Apps sollten auch für die Unterstützung von HTTP/1.1 und HTTP/2 ausgelegt sein. Wenn Probleme mit HTTP/3 auftreten, sollten Sie HTTP/3 deaktivieren, bis diese in einem künftigen Release von ASP.NET Core behoben wurden. Erhebliche Probleme werden im GitHub-Repository für Ankündigungen gemeldet.

HTTP/3-Anforderungen

HTTP/3 hat je nach Betriebssystem unterschiedliche Anforderungen. Wenn die Plattform, auf der Kestrel ausgeführt wird, nicht über all die Anforderungen für HTTP/3 verfügt, ist HTTP/3 deaktiviert, und für Kestrel wird ein Fallback auf andere HTTP-Protokolle durchgeführt.

Windows

  • Windows 11 Build 22000 oder höher ODER Windows Server 2022.
  • TLS 1.3-Verbindung oder höher.

Linux

  • Das libmsquic-Paket ist installiert.

libmsquic wird über das offizielle Linux-Paketrepository von Microsoft unter packages.microsoft.com veröffentlicht. So installieren Sie das Paket:

  1. Fügen Sie das packages.microsoft.com-Repository hinzu. Eine Anleitung hierzu finden Sie unter Linux-Softwarerepository für Microsoft-Produkte.
  2. Installieren Sie das libmsquic-Paket mithilfe des Paket-Managers der Distribution. Unter Ubuntu ist dies beispielsweise apt install libmsquic=1.9*.

Hinweis: .NET 6 ist nur mit den Versionen 1.9.x von libmsquic kompatibel. Libmsquic 2.x ist aufgrund von Breaking Changes nicht kompatibel. Libmsquic empfängt Updates auf 1.9.x, wenn Sicherheitskorrekturen integriert werden müssen.

macOS

HTTP/3 wird derzeit unter macOS nicht unterstützt, möglicherweise ist es in einer zukünftigen Version verfügbar.

Erste Schritte

HTTP/3 ist nicht standardmäßig aktiviert. Fügen Sie die Konfiguration zu Program.cs hinzu, um HTTP/3 zu aktivieren.

var builder = WebApplication.CreateBuilder(args);

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

Mit dem vorangehenden Code wird Port 5001 für Folgendes konfiguriert:

  • Verwenden von HTTP/3 zusammen mit HTTP/1.1 und HTTP/2 durch Angeben von HttpProtocols.Http1AndHttp2AndHttp3
  • Aktivieren von HTTPS mit UseHttps. HTTP/3 erfordert HTTPS.

Da HTTP/3 nicht von allen Routern, Firewalls und Proxys ordnungsgemäß unterstützt wird, sollte HTTP/3 zusammen mit HTTP/1.1 und HTTP/2 konfiguriert werden. Dazu kann HttpProtocols.Http1AndHttp2AndHttp3 als unterstützte Protokolle eines Endpunkts angegeben wird.

Weitere Informationen finden Sie unter Konfigurieren von Endpunkten für den Kestrel-Webserver von ASP.NET Core.

Alt-svc

HTTP/3 wird anhand des Headers alt-svc als Upgrade von HTTP/1.1 oder HTTP/2 erkannt. Das bedeutet, dass die erste Anforderung normalerweise HTTP/1.1 oder HTTP/2 verwendet, bevor der Wechsel zu HTTP/3 erfolgt. Kestrel fügt den Header alt-svc automatisch hinzu, wenn HTTP/3 aktiviert ist.

Localhost-Tests

  • Browser lassen keine selbstsignierten Zertifikate für HTTP/3 zu, z. B. das Kestrel-Entwicklungszertifikat.

  • HttpClient kann für Localhost-/Loopbacktests in .NET 6 oder höher verwendet werden. Wenn Sie HttpClient verwenden, um eine HTTP/3-Anforderung zu senden, ist eine zusätzliche Konfiguration erforderlich:

    • Legen Sie HttpRequestMessage.Version auf 3.0 fest, oder:
    • Legen Sie HttpRequestMessage.VersionPolicy auf HttpVersionPolicy.RequestVersionOrHigher fest.

Einschränkungen

Einige HTTPS-Szenarios werden für HTTP/3 in Kestrel noch nicht unterstützt. Wenn Sie Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps mit HttpsConnectionAdapterOptions aufrufen, während HTTP/3 verwendet wird, ist das Festlegen der folgenden Optionen für HttpsConnectionAdapterOptions keine Option, da es zu nichts führt:

Wenn Sie die folgenden Implementierungen von Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps aufrufen, wird bei Verwendung von HTTP/3 ein Fehler ausgelöst:

Vorteile von HTTP/3

HTTP/3 verwendet die gleiche Semantik wie HTTP/1.1 und HTTP/2: Alle Versionen verwenden die gleichen Anforderungsmethoden, Statuscodes und Nachrichtenfelder. Die Unterschiede bestehen beim zugrunde liegenden Datentransport. Sowohl HTTP/1.1 als auch HTTP/2 verwenden TCP für den Datentransport. HTTP/3 verwendet eine neue Datentransporttechnologie, die parallel zu HTTP/3 entwickelt wurde und QUIC heißt.

HTTP/3 und QUIC bieten im Vergleich zu HTTP/1.1 und HTTP/2 eine Reihe von Vorteilen:

  • Schnellere Antwortzeit der ersten Anforderung. QUIC und HTTP/3 handeln die Verbindung in weniger Roundtrips zwischen dem Client und dem Server aus. Die erste Anforderung erreicht den Server schneller.
  • Verbesserte Verarbeitung beim Verlust von Verbindungspaketen. HTTP/2 führt Multiplexing für mehrere Aufrufe über eine einzige TCP-Verbindung aus. Ein Paketverlust bei der Verbindung wirkt sich auf alle Anforderungen aus. Dieses Problem wird als „Head-of-Line Blocking“ (Blockierung durch den Anfang der Schlange) bezeichnet. Da QUIC natives Multiplexing bietet, wirken sich verlorene Pakete nur auf die Anforderungen aus, bei denen Daten verloren gegangen sind.
  • Unterstützt den Übergang zwischen Netzwerken. Dieses Feature ist nützlich für mobile Geräte, bei denen ein Wechsel zwischen WLAN und Mobilfunknetzwerken üblich ist, wenn ein mobiles Gerät den Standort ändert. Derzeit tritt bei HTTP/1.1- und HTTP/2-Verbindungen beim Wechsel des Netzwerks ein Fehler auf. Eine App oder ein Webbrowser muss alle fehlgeschlagenen HTTP-Anforderungen wiederholen. Bei HTTP/3 kann die App oder der Webbrowser nahtlos fortfahren, wenn sich ein Netzwerk ändert. Kestrel unterstützt keine Netzwerkübergänge in .NET 6. Möglicherweise wird dies in einem zukünftigen Release unterstützt.