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:
- Fügen Sie das
packages.microsoft.com
-Repository hinzu. Eine Anleitung hierzu finden Sie unter Linux-Softwarerepository für Microsoft-Produkte. - Installieren Sie das
libmsquic
-Paket mithilfe des Paket-Managers der Distribution. Unter Ubuntu ist dies beispielsweiseapt 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 SieHttpClient
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
aufHttpVersionPolicy.RequestVersionOrHigher
fest.
- Legen Sie
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:
- Fügen Sie das
packages.microsoft.com
-Repository hinzu. Eine Anleitung hierzu finden Sie unter Linux-Softwarerepository für Microsoft-Produkte. - Installieren Sie das
libmsquic
-Paket mithilfe des Paket-Managers der Distribution. Unter Ubuntu ist dies beispielsweiseapt 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 SieHttpClient
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
aufHttpVersionPolicy.RequestVersionOrHigher
fest.
- Legen Sie
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:
- Fügen Sie das
packages.microsoft.com
-Repository hinzu. Eine Anleitung hierzu finden Sie unter Linux-Softwarerepository für Microsoft-Produkte. - Installieren Sie das
libmsquic
-Paket mithilfe des Paket-Managers der Distribution. Unter Ubuntu ist dies beispielsweiseapt 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 SieHttpClient
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
aufHttpVersionPolicy.RequestVersionOrHigher
fest.
- Legen Sie
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:
- UseHttps(this ListenOptions listenOptions, ServerOptionsSelectionCallback serverOptionsSelectionCallback, object state, TimeSpan handshakeTimeout)
- UseHttps(this ListenOptions listenOptions, TlsHandshakeCallbackOptions callbackOptions)
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.