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ą, zapoznaj się z wersją tego artykułu platformy .NET 8.

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ą, zapoznaj się z wersją tego artykułu platformy .NET 8.

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:

  1. packages.microsoft.com Dodaj repozytorium. Aby uzyskać instrukcje, zobacz Repozytorium oprogramowania systemu Linux dla produktów firmy Microsoft.
  2. libmsquic Zainstaluj pakiet przy użyciu menedżera pakietów dystrybucji. Na przykład apt 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

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:

  1. packages.microsoft.com Dodaj repozytorium. Aby uzyskać instrukcje, zobacz Repozytorium oprogramowania systemu Linux dla produktów firmy Microsoft.
  2. libmsquic Zainstaluj pakiet przy użyciu menedżera pakietów dystrybucji. Na przykład apt 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

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:

  1. packages.microsoft.com Dodaj repozytorium. Aby uzyskać instrukcje, zobacz Repozytorium oprogramowania systemu Linux dla produktów firmy Microsoft.
  2. libmsquic Zainstaluj pakiet przy użyciu menedżera pakietów dystrybucji. Na przykład apt 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życia HttpClient do utworzenia żądania HTTP/3:

    • Ustaw HttpRequestMessage.Version wartość 3.0 lub
    • Ustaw wartość opcji HttpRequestMessage.VersionPolicy na HttpVersionPolicy.RequestVersionOrHigher.

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:

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.