Używanie protokołu HTTP/3 z serwerem internetowym ASP.NET Core Kestrel
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
HTTP/3 jest zatwierdzonym standardem i trzecią główną wersją protokołu HTTP. W tym artykule omówiono wymagania dotyczące protokołu HTTP/3. Protokół HTTP/3 jest w pełni obsługiwany w systemie ASP.NET Core 7.0 lub nowszym.
Ważne
Aplikacje skonfigurowane do korzystania z protokołu HTTP/3 powinny być zaprojektowane tak, aby obsługiwały również protokół HTTP/1.1 i HTTP/2.
Wymagania dotyczące protokołu HTTP/3
Protokół HTTP/3 ma różne wymagania w zależności od systemu operacyjnego. Jeśli platforma Kestrel uruchomiona na platformie nie ma wszystkich wymagań dotyczących protokołu HTTP/3, zostanie wyłączona i Kestrel powróci do innych protokołów HTTP.
Windows
- Windows 11 Build 22000 lub nowszy LUB Windows Server 2022.
- Połączenie TLS 1.3 lub nowsze.
Linux
libmsquic
zainstalowany pakiet.
libmsquic
jest publikowany za pośrednictwem oficjalnego repozytorium pakietów systemu Linux firmy Microsoft pod adresem packages.microsoft.com
. Aby zainstalować ten pakiet:
packages.microsoft.com
Dodaj repozytorium. Aby uzyskać instrukcje, zobacz Repozytorium oprogramowania systemu Linux dla produktów firmy Microsoft.libmsquic
Zainstaluj pakiet przy użyciu menedżera pakietów dystrybucji. Na przykładapt install libmsquic=1.9*
w systemie Ubuntu.
Uwaga: platforma .NET 6 jest zgodna tylko z wersjami biblioteki libmsquic w wersji 1.9.x. Biblioteka Libmsquic 2.x nie jest zgodna ze względu na zmiany powodujące niezgodność. Biblioteka Libmsquic odbiera aktualizacje do wersji 1.9.x w razie potrzeby w celu uwzględnienia poprawek zabezpieczeń.
macOS
Protokół HTTP/3 nie jest obecnie obsługiwany w systemie macOS i może być dostępny w przyszłej wersji.
Wprowadzenie
Protokół HTTP/3 nie jest domyślnie włączony. Dodaj konfigurację w celu Program.cs
włączenia protokołu HTTP/3.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
Powyższy kod konfiguruje port 5001 na:
- Użyj protokołu HTTP/3 obok protokołu HTTP/1.1 i HTTP/2, określając wartość
HttpProtocols.Http1AndHttp2AndHttp3
. - Włącz protokół HTTPS za pomocą polecenia
UseHttps
. Protokół HTTP/3 wymaga protokołu HTTPS.
Ponieważ nie wszystkie routery, zapory i serwery proxy prawidłowo obsługują protokół HTTP/3, protokół HTTP/3 należy skonfigurować razem z protokołem HTTP/1.1 i HTTP/2. Można to zrobić, określając HttpProtocols.Http1AndHttp2AndHttp3
jako obsługiwane protokoły punktu końcowego.
Aby uzyskać więcej informacji, zobacz Konfigurowanie punktów końcowych dla serwera internetowego ASP.NET CoreKestrel.
Alt-svc
Protokół HTTP/3 jest wykrywany jako uaktualnienie z protokołu HTTP/1.1 lub HTTP/2 za pośrednictwem nagłówka alt-svc
. Oznacza to, że pierwsze żądanie zwykle będzie używać protokołu HTTP/1.1 lub HTTP/2 przed przełączeniem do protokołu HTTP/3. Kestrel automatycznie dodaje nagłówek, alt-svc
jeśli włączono protokół HTTP/3.
Testowanie hosta lokalnego
Przeglądarki nie zezwalają na certyfikaty z podpisem własnym w protokole HTTP/3, takie jak certyfikat dewelopera Kestrel .
HttpClient
można użyć do testowania localhost/sprzężenia zwrotnego na platformie .NET 6 lub nowszej. Dodatkowa konfiguracja jest wymagana w przypadku użyciaHttpClient
do utworzenia żądania HTTP/3:- Ustaw
HttpRequestMessage.Version
wartość 3.0 lub - Ustaw wartość opcji
HttpRequestMessage.VersionPolicy
naHttpVersionPolicy.RequestVersionOrHigher
.
- Ustaw
Korzyści http/3
Protokół HTTP/3 używa tej samej semantyki co http/1.1 i HTTP/2: te same metody żądania, kody stanu i pola komunikatów mają zastosowanie do wszystkich wersji. Różnice dotyczą transportu bazowego. Protokół HTTP/1.1 i HTTP/2 używają protokołu TCP jako transportu. Protokół HTTP/3 używa nowej technologii transportowej opracowanej obok protokołu HTTP/3 o nazwie QUIC.
Protokół HTTP/3 i QUIC mają wiele korzyści w porównaniu z protokołami HTTP/1.1 i HTTP/2:
- Krótszy czas odpowiedzi pierwszego żądania. QuiC i HTTP/3 negocjują połączenie w mniejszej liczbie rund między klientem a serwerem. Pierwsze żądanie dociera do serwera szybciej.
- Ulepszone środowisko w przypadku utraty pakietów połączenia. Protokół HTTP/2 multipleksuje wiele żądań za pośrednictwem jednego połączenia TCP. Utrata pakietów w połączeniu ma wpływ na wszystkie żądania. Ten problem jest nazywany "blokowaniem nagłówka wiersza". Ponieważ funkcja QUIC zapewnia natywne multipleksowanie, utracone pakiety wpływają tylko na żądania, w których dane zostały utracone.
- Obsługuje przechodzenie między sieciami. Ta funkcja jest przydatna w przypadku urządzeń przenośnych, w których często przełącza się między sieciami Wi-Fi i komórkowymi, ponieważ urządzenie przenośne zmienia lokalizację. Obecnie połączenia HTTP/1.1 i HTTP/2 kończą się niepowodzeniem z powodu błędu podczas przełączania sieci. Aplikacja lub przeglądarki internetowe muszą ponowić próbę wykonania wszystkich żądań HTTP, które zakończyły się niepowodzeniem. Protokół HTTP/3 umożliwia bezproblemowe kontynuowanie działania aplikacji lub przeglądarki internetowej po zmianie sieci. Kestrel nie obsługuje przejścia sieci na platformie .NET 8. Może być dostępna w przyszłej wersji.
HTTP/3 jest proponowanym standardem i trzecią główną wersją protokołu HTTP. W tym artykule omówiono wymagania dotyczące protokołu HTTP/3. Protokół HTTP/3 jest w pełni obsługiwany w systemie ASP.NET Core 7.0 lub nowszym.
Ważne
Aplikacje skonfigurowane do korzystania z protokołu HTTP/3 powinny być zaprojektowane tak, aby obsługiwały również protokół HTTP/1.1 i HTTP/2.
Wymagania dotyczące protokołu HTTP/3
Protokół HTTP/3 ma różne wymagania w zależności od systemu operacyjnego. Jeśli platforma Kestrel uruchomiona na platformie nie ma wszystkich wymagań dotyczących protokołu HTTP/3, zostanie wyłączona i Kestrel wróci do innych protokołów HTTP.
Windows
- Windows 11 Build 22000 lub nowszy LUB Windows Server 2022.
- Połączenie TLS 1.3 lub nowsze.
Linux
libmsquic
zainstalowany pakiet.
libmsquic
jest publikowany za pośrednictwem oficjalnego repozytorium pakietów systemu Linux firmy Microsoft pod adresem packages.microsoft.com
. Aby zainstalować ten pakiet:
packages.microsoft.com
Dodaj repozytorium. Aby uzyskać instrukcje, zobacz Repozytorium oprogramowania systemu Linux dla produktów firmy Microsoft.libmsquic
Zainstaluj pakiet przy użyciu menedżera pakietów dystrybucji. Na przykładapt install libmsquic=1.9*
w systemie Ubuntu.
Uwaga: platforma .NET 6 jest zgodna tylko z wersjami biblioteki libmsquic w wersji 1.9.x. Biblioteka Libmsquic 2.x nie jest zgodna ze względu na zmiany powodujące niezgodność. Biblioteka Libmsquic odbiera aktualizacje do wersji 1.9.x w razie potrzeby w celu uwzględnienia poprawek zabezpieczeń.
macOS
Protokół HTTP/3 nie jest obecnie obsługiwany w systemie macOS i może być dostępny w przyszłej wersji.
Wprowadzenie
Protokół HTTP/3 nie jest domyślnie włączony. Dodaj konfigurację w celu Program.cs
włączenia protokołu HTTP/3.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
Powyższy kod konfiguruje port 5001 na:
- Użyj protokołu HTTP/3 obok protokołu HTTP/1.1 i HTTP/2, określając wartość
HttpProtocols.Http1AndHttp2AndHttp3
. - Włącz protokół HTTPS za pomocą polecenia
UseHttps
. Protokół HTTP/3 wymaga protokołu HTTPS.
Ponieważ nie wszystkie routery, zapory i serwery proxy prawidłowo obsługują protokół HTTP/3, protokół HTTP/3 należy skonfigurować razem z protokołem HTTP/1.1 i HTTP/2. Można to zrobić, określając HttpProtocols.Http1AndHttp2AndHttp3
jako obsługiwane protokoły punktu końcowego.
Aby uzyskać więcej informacji, zobacz Konfigurowanie punktów końcowych dla serwera internetowego ASP.NET CoreKestrel.
Alt-svc
Protokół HTTP/3 jest wykrywany jako uaktualnienie z protokołu HTTP/1.1 lub HTTP/2 za pośrednictwem nagłówka alt-svc
. Oznacza to, że pierwsze żądanie zwykle będzie używać protokołu HTTP/1.1 lub HTTP/2 przed przełączeniem do protokołu HTTP/3. Kestrel automatycznie dodaje nagłówek, alt-svc
jeśli włączono protokół HTTP/3.
Testowanie hosta lokalnego
Przeglądarki nie zezwalają na certyfikaty z podpisem własnym w protokole HTTP/3, takie jak certyfikat dewelopera Kestrel .
HttpClient
można użyć do testowania localhost/sprzężenia zwrotnego na platformie .NET 6 lub nowszej. Dodatkowa konfiguracja jest wymagana w przypadku użyciaHttpClient
do utworzenia żądania HTTP/3:- Ustaw
HttpRequestMessage.Version
wartość 3.0 lub - Ustaw wartość opcji
HttpRequestMessage.VersionPolicy
naHttpVersionPolicy.RequestVersionOrHigher
.
- Ustaw
Korzyści http/3
Protokół HTTP/3 używa tej samej semantyki co http/1.1 i HTTP/2: te same metody żądania, kody stanu i pola komunikatów mają zastosowanie do wszystkich wersji. Różnice dotyczą transportu bazowego. Protokół HTTP/1.1 i HTTP/2 używają protokołu TCP jako transportu. Protokół HTTP/3 używa nowej technologii transportowej opracowanej obok protokołu HTTP/3 o nazwie QUIC.
Protokół HTTP/3 i QUIC mają wiele korzyści w porównaniu z protokołami HTTP/1.1 i HTTP/2:
- Krótszy czas odpowiedzi pierwszego żądania. QuiC i HTTP/3 negocjują połączenie w mniejszej liczbie rund między klientem a serwerem. Pierwsze żądanie dociera do serwera szybciej.
- Ulepszone środowisko w przypadku utraty pakietów połączenia. Protokół HTTP/2 multipleksuje wiele żądań za pośrednictwem jednego połączenia TCP. Utrata pakietów w połączeniu ma wpływ na wszystkie żądania. Ten problem jest nazywany "blokowaniem nagłówka wiersza". Ponieważ funkcja QUIC zapewnia natywne multipleksowanie, utracone pakiety wpływają tylko na żądania, w których dane zostały utracone.
- Obsługuje przechodzenie między sieciami. Ta funkcja jest przydatna w przypadku urządzeń przenośnych, w których często przełącza się między sieciami Wi-Fi i komórkowymi, ponieważ urządzenie przenośne zmienia lokalizację. Obecnie połączenia HTTP/1.1 i HTTP/2 kończą się niepowodzeniem z powodu błędu podczas przełączania sieci. Aplikacja lub przeglądarki internetowe muszą ponowić próbę wykonania wszystkich żądań HTTP, które zakończyły się niepowodzeniem. Protokół HTTP/3 umożliwia bezproblemowe kontynuowanie działania aplikacji lub przeglądarki internetowej po zmianie sieci. Kestrel nie obsługuje przejścia sieci na platformie .NET 6. Może być dostępna w przyszłej wersji.
HTTP/3 to trzecia i nadchodząca wersja główna protokołu HTTP. W tym artykule omówiono wymagania dotyczące protokołu HTTP/3 oraz sposób konfigurowania Kestrel go do użycia.
Ważne
Protokół HTTP/3 jest dostępny na platformie .NET 6 jako funkcja w wersji zapoznawczej. Specyfikacja HTTP/3 nie jest sfinalizowana, a problemy z zachowaniem lub wydajnością mogą istnieć w protokole HTTP/3 za pomocą platformy .NET 6.
Aby uzyskać więcej informacji na temat obsługi funkcji w wersji zapoznawczej, zobacz sekcję obsługiwane funkcje w wersji zapoznawczej.
Aplikacje skonfigurowane do korzystania z protokołu HTTP/3 powinny być zaprojektowane tak, aby obsługiwały również protokół HTTP/1.1 i HTTP/2. Jeśli problemy są identyfikowane w protokole HTTP/3, zalecamy wyłączenie protokołu HTTP/3 do momentu rozwiązania problemów w przyszłej wersji programu ASP.NET Core. Istotne problemy są zgłaszane w repozytorium GitHub anonsów.
Wymagania dotyczące protokołu HTTP/3
Protokół HTTP/3 ma różne wymagania w zależności od systemu operacyjnego. Jeśli platforma Kestrel uruchomiona na platformie nie ma wszystkich wymagań dotyczących protokołu HTTP/3, zostanie wyłączona i Kestrel wróci do innych protokołów HTTP.
Windows
- Windows 11 Build 22000 lub nowszy LUB Windows Server 2022.
- Połączenie TLS 1.3 lub nowsze.
Linux
libmsquic
zainstalowany pakiet.
libmsquic
jest publikowany za pośrednictwem oficjalnego repozytorium pakietów systemu Linux firmy Microsoft pod adresem packages.microsoft.com
. Aby zainstalować ten pakiet:
packages.microsoft.com
Dodaj repozytorium. Aby uzyskać instrukcje, zobacz Repozytorium oprogramowania systemu Linux dla produktów firmy Microsoft.libmsquic
Zainstaluj pakiet przy użyciu menedżera pakietów dystrybucji. Na przykładapt install libmsquic=1.9*
w systemie Ubuntu.
Uwaga: platforma .NET 6 jest zgodna tylko z wersjami biblioteki libmsquic w wersji 1.9.x. Biblioteka Libmsquic 2.x nie jest zgodna ze względu na zmiany powodujące niezgodność. Biblioteka Libmsquic odbiera aktualizacje do wersji 1.9.x w razie potrzeby w celu uwzględnienia poprawek zabezpieczeń.
macOS
Protokół HTTP/3 nie jest obecnie obsługiwany w systemie macOS i może być dostępny w przyszłej wersji.
Wprowadzenie
Protokół HTTP/3 nie jest domyślnie włączony. Dodaj konfigurację w celu Program.cs
włączenia protokołu HTTP/3.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
Powyższy kod konfiguruje port 5001 na:
- Użyj protokołu HTTP/3 obok protokołu HTTP/1.1 i HTTP/2, określając wartość
HttpProtocols.Http1AndHttp2AndHttp3
. - Włącz protokół HTTPS za pomocą polecenia
UseHttps
. Protokół HTTP/3 wymaga protokołu HTTPS.
Ponieważ nie wszystkie routery, zapory i serwery proxy prawidłowo obsługują protokół HTTP/3, protokół HTTP/3 należy skonfigurować razem z protokołem HTTP/1.1 i HTTP/2. Można to zrobić, określając HttpProtocols.Http1AndHttp2AndHttp3
jako obsługiwane protokoły punktu końcowego.
Aby uzyskać więcej informacji, zobacz Konfigurowanie punktów końcowych dla serwera internetowego ASP.NET CoreKestrel.
Alt-svc
Protokół HTTP/3 jest wykrywany jako uaktualnienie z protokołu HTTP/1.1 lub HTTP/2 za pośrednictwem nagłówka alt-svc
. Oznacza to, że pierwsze żądanie zwykle będzie używać protokołu HTTP/1.1 lub HTTP/2 przed przełączeniem do protokołu HTTP/3. Kestrel automatycznie dodaje nagłówek, alt-svc
jeśli włączono protokół HTTP/3.
Testowanie hosta lokalnego
Przeglądarki nie zezwalają na certyfikaty z podpisem własnym w protokole HTTP/3, takie jak certyfikat dewelopera Kestrel .
HttpClient
można użyć do testowania localhost/sprzężenia zwrotnego na platformie .NET 6 lub nowszej. Dodatkowa konfiguracja jest wymagana w przypadku użyciaHttpClient
do utworzenia żądania HTTP/3:- Ustaw
HttpRequestMessage.Version
wartość 3.0 lub - Ustaw wartość opcji
HttpRequestMessage.VersionPolicy
naHttpVersionPolicy.RequestVersionOrHigher
.
- Ustaw
Ograniczenia
Niektóre scenariusze HTTPS nie są jeszcze obsługiwane w przypadku protokołu HTTP/3 w systemie Kestrel. Podczas wywoływania Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps
polecenia przy HttpsConnectionAdapterOptions użyciu protokołu HTTP/3 ustawienie następujących opcji w obiekcie HttpsConnectionAdapterOptions jest operacją no-op (nic nie robi):
Wywołanie następujących implementacji zgłasza Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps
błąd podczas korzystania z protokołu HTTP/3:
- UseHttps(to ListenOptions listenOptions, ServerOptionsSelectionCallback serverOptionsSelectionCallback, stan obiektu, uzgadnianie TimeSpanTimeout)
- UseHttps (to listenOptions listenOptions, TlsHandshakeCallbackOptions callbackOptions)
Korzyści http/3
Protokół HTTP/3 używa tej samej semantyki co http/1.1 i HTTP/2: te same metody żądania, kody stanu i pola komunikatów mają zastosowanie do wszystkich wersji. Różnice dotyczą transportu bazowego. Protokół HTTP/1.1 i HTTP/2 używają protokołu TCP jako transportu. Protokół HTTP/3 używa nowej technologii transportowej opracowanej obok protokołu HTTP/3 o nazwie QUIC.
Protokół HTTP/3 i QUIC mają wiele korzyści w porównaniu z protokołami HTTP/1.1 i HTTP/2:
- Krótszy czas odpowiedzi pierwszego żądania. QuiC i HTTP/3 negocjują połączenie w mniejszej liczbie rund między klientem a serwerem. Pierwsze żądanie dociera do serwera szybciej.
- Ulepszone środowisko w przypadku utraty pakietów połączenia. Protokół HTTP/2 multipleksuje wiele żądań za pośrednictwem jednego połączenia TCP. Utrata pakietów w połączeniu ma wpływ na wszystkie żądania. Ten problem jest nazywany "blokowaniem nagłówka wiersza". Ponieważ funkcja QUIC zapewnia natywne multipleksowanie, utracone pakiety wpływają tylko na żądania, w których dane zostały utracone.
- Obsługuje przechodzenie między sieciami. Ta funkcja jest przydatna w przypadku urządzeń przenośnych, w których często przełącza się między sieciami Wi-Fi i komórkowymi, ponieważ urządzenie przenośne zmienia lokalizację. Obecnie połączenia HTTP/1.1 i HTTP/2 kończą się niepowodzeniem z powodu błędu podczas przełączania sieci. Aplikacja lub przeglądarki internetowe muszą ponowić próbę wykonania wszystkich żądań HTTP, które zakończyły się niepowodzeniem. Protokół HTTP/3 umożliwia bezproblemowe kontynuowanie działania aplikacji lub przeglądarki internetowej po zmianie sieci. Kestrel nie obsługuje przejścia sieci na platformie .NET 6. Może być dostępna w przyszłej wersji.