搭配使用 HTTP/3 與 ASP.NET Core Kestrel Web 伺服器

注意

這不是這篇文章的最新版本。 如需目前版本,請參閱本文的 .NET 8 版本

重要

這些發行前產品的相關資訊在產品正式發行前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。

如需目前版本,請參閱本文的 .NET 8 版本

HTTP/3 是 HTTP 的已核准標準和第三個主要版本。 本文討論 HTTP/3 的需求。 ASP.NET Core 7.0 和更新版本完全支援 HTTP/3。

重要

設定來使用 HTTP/3 的應用程式也應該支援 HTTP/1.1 和 HTTP/2。

HTTP/3 需求

根據作業系統,HTTP/3 的需求會不同。 如果正在其上執行 Kestrel 的平台沒有 HTTP/3 的所有需求,則會將其停用,而且 Kestrel 將會回復至其他 HTTP 通訊協定。

Windows

  • Windows 11 組建 22000 或更新版本或是 Windows Server 2022。
  • TLS 1.3 或更新版本連線。

Linux

  • 已安裝 libmsquic 套件。

libmsquic 是透過位於 packages.microsoft.com 的 Microsoft 官方 Linux 套件存放庫所發行。 若要安裝此套件:

  1. 新增 packages.microsoft.com 存放庫。 如需指示,請參閱適用於 Microsoft 產品的 Linux 軟體存放庫
  2. 使用散發套件的套件管理員來安裝 libmsquic 套件。 例如,Ubuntu 上的 apt install libmsquic=1.9*

附註:.NET 6 只與 1.9.x 版的 libmsquic 相容。 Libmsquic 2.x 因中斷性變更而不相容。 Libmsquic 會在需要時收到 1.9.x 的更新,以納入安全性修正程式。

macOS

macOS 目前不支援 HTTP/3,未來版本則可能會提供。

開始使用

預設不會啟用 HTTP/3。 將設定新增至 Program.cs,以啟用 HTTP/3。

var builder = WebApplication.CreateBuilder(args);

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

上述程式碼會將連接埠 5001 設定為:

  • 指定 HttpProtocols.Http1AndHttp2AndHttp3,以搭配使用 HTTP/3 與 HTTP/1.1 和 HTTP/2。
  • 使用 UseHttps 來啟用 HTTPS。 HTTP/3 需要 HTTPS。

因為並非所有路由器、防火牆和 Proxy 都會正確支援 HTTP/3,所以應該同時設定 HTTP/3 與 HTTP/1.1 和 HTTP/2。 這可以將 HttpProtocols.Http1AndHttp2AndHttp3 指定為端點所支援的通訊協定來完成。

如需詳細資訊,請參閱設定 ASP.NET Core Kestrel Web 伺服器的端點

Alt-svc

HTTP/3 會透過 alt-svc 標頭探索為從 HTTP/1.1 或 HTTP/2 的升級。 這表示第一個要求通常會在切換至 HTTP/3 之前使用 HTTP/1.1 或 HTTP/2。 如果啟用 HTTP/3,則 Kestrel 會自動新增 alt-svc 標頭。

Localhost 測試

HTTP/3 優點

HTTP/3 所使用的語意與 HTTP/1.1 和 HTTP/2 相同:相同的要求方法、狀態碼和訊息欄位適用於所有版本。 差異在於基礎傳輸方式。 HTTP/1.1 和 HTTP/2 都使用 TCP 來做傳輸。 HTTP/3 使用與 HTTP/3 一起開發的新傳輸技術,稱為 QUIC

相較於 HTTP/1.1 和 HTTP/2,HTTP/3 和 QUIC 有許多好處:

  • 第一個要求的回應時間更快。 QUIC 和 HTTP/3 會以用戶端與伺服器之間的較少往返次數來交涉連線。 第一個要求更快抵達伺服器。
  • 連線封包遺失時的體驗較好。 HTTP/2 會透過一個 TCP 連線多工處理多個要求。 連線的封包遺失會影響所有要求。 此問題稱為「隊頭阻塞」。 由於 QUIC 提供原生的多工處理功能,因此封包遺失只會影響到遺失資料的要求。
  • 支援在網路之間轉換。 此功能適用於行動裝置,因為行動裝置變更位置時,通常會在 WIFI 和行動數據網路之間切換。 目前,HTTP/1.1 和 HTTP/2 連線在切換網路時會發生錯誤。 應用程式或網頁瀏覽器必須重試任何失敗的 HTTP 要求。 HTTP/3 可讓應用程式或網頁瀏覽器在網路變更時平順地繼續執行。 Kestrel 不支援 .NET 8 中的網路轉換。 未來的版本可能會提供此支援。

HTTP/3 是 HTTP 的已提議標準和第三個主要版本。 本文討論 HTTP/3 的需求。 ASP.NET Core 7.0 和更新版本完全支援 HTTP/3。

重要

設定來使用 HTTP/3 的應用程式也應該支援 HTTP/1.1 和 HTTP/2。

HTTP/3 需求

根據作業系統,HTTP/3 的需求會不同。 如果正在其上執行 Kestrel 的平台沒有 HTTP/3 的所有需求,則會將其停用,而且 Kestrel 將會回復至其他 HTTP 通訊協定。

Windows

  • Windows 11 組建 22000 或更新版本或是 Windows Server 2022。
  • TLS 1.3 或更新版本連線。

Linux

  • 已安裝 libmsquic 套件。

libmsquic 是透過位於 packages.microsoft.com 的 Microsoft 官方 Linux 套件存放庫所發行。 若要安裝此套件:

  1. 新增 packages.microsoft.com 存放庫。 如需指示,請參閱適用於 Microsoft 產品的 Linux 軟體存放庫
  2. 使用散發套件的套件管理員來安裝 libmsquic 套件。 例如,Ubuntu 上的 apt install libmsquic=1.9*

附註:.NET 6 只與 1.9.x 版的 libmsquic 相容。 Libmsquic 2.x 因中斷性變更而不相容。 Libmsquic 會在需要時收到 1.9.x 的更新,以納入安全性修正程式。

macOS

macOS 目前不支援 HTTP/3,未來版本則可能會提供。

開始使用

預設不會啟用 HTTP/3。 將設定新增至 Program.cs,以啟用 HTTP/3。

var builder = WebApplication.CreateBuilder(args);

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

上述程式碼會將連接埠 5001 設定為:

  • 指定 HttpProtocols.Http1AndHttp2AndHttp3,以搭配使用 HTTP/3 與 HTTP/1.1 和 HTTP/2。
  • 使用 UseHttps 來啟用 HTTPS。 HTTP/3 需要 HTTPS。

因為並非所有路由器、防火牆和 Proxy 都會正確支援 HTTP/3,所以應該同時設定 HTTP/3 與 HTTP/1.1 和 HTTP/2。 這可以將 HttpProtocols.Http1AndHttp2AndHttp3 指定為端點所支援的通訊協定來完成。

如需詳細資訊,請參閱設定 ASP.NET Core Kestrel Web 伺服器的端點

Alt-svc

HTTP/3 會透過 alt-svc 標頭探索為從 HTTP/1.1 或 HTTP/2 的升級。 這表示第一個要求通常會在切換至 HTTP/3 之前使用 HTTP/1.1 或 HTTP/2。 如果啟用 HTTP/3,則 Kestrel 會自動新增 alt-svc 標頭。

Localhost 測試

HTTP/3 優點

HTTP/3 所使用的語意與 HTTP/1.1 和 HTTP/2 相同:相同的要求方法、狀態碼和訊息欄位適用於所有版本。 差異在於基礎傳輸方式。 HTTP/1.1 和 HTTP/2 都使用 TCP 來做傳輸。 HTTP/3 使用與 HTTP/3 一起開發的新傳輸技術,稱為 QUIC

相較於 HTTP/1.1 和 HTTP/2,HTTP/3 和 QUIC 有許多好處:

  • 第一個要求的回應時間更快。 QUIC 和 HTTP/3 會以用戶端與伺服器之間的較少往返次數來交涉連線。 第一個要求更快抵達伺服器。
  • 連線封包遺失時的體驗較好。 HTTP/2 會透過一個 TCP 連線多工處理多個要求。 連線的封包遺失會影響所有要求。 此問題稱為「隊頭阻塞」。 由於 QUIC 提供原生的多工處理功能,因此封包遺失只會影響到遺失資料的要求。
  • 支援在網路之間轉換。 此功能適用於行動裝置,因為行動裝置變更位置時,通常會在 WIFI 和行動數據網路之間切換。 目前,HTTP/1.1 和 HTTP/2 連線會因切換網路時發生錯誤而失敗。 應用程式或網頁瀏覽器必須重試任何失敗的 HTTP 要求。 HTTP/3 可讓應用程式或網頁瀏覽器在網路變更時平順地繼續執行。 Kestrel 不支援 .NET 6 中的網路轉換。 未來的版本可能會提供此支援。

HTTP/3 是 HTTP 的第三個和即將推出主要版本。 本文討論 HTTP/3 的需求,以及如何設定 Kestrel 來使用它。

重要

.NET 6 中提供 HTTP/3 作為「預覽功能」。 HTTP/3 規格未完成,而且搭配 .NET 6 的 HTTP/3 可能存在行為或效能問題。

如需預覽功能支援的詳細資訊,請參閱支援的預覽功能一節

設定來使用 HTTP/3 的應用程式也應該支援 HTTP/1.1 和 HTTP/2。 如果 HTTP/3 發現問題,則除非未來 ASP.NET Core 發行版本解決此問題,否則建議停用 HTTP/3。 公告 GitHub 存放庫會回報重大問題。

HTTP/3 需求

根據作業系統,HTTP/3 的需求會不同。 如果正在其上執行 Kestrel 的平台沒有 HTTP/3 的所有需求,則會將其停用,而且 Kestrel 將會回復至其他 HTTP 通訊協定。

Windows

  • Windows 11 組建 22000 或更新版本或是 Windows Server 2022。
  • TLS 1.3 或更新版本連線。

Linux

  • 已安裝 libmsquic 套件。

libmsquic 是透過位於 packages.microsoft.com 的 Microsoft 官方 Linux 套件存放庫所發行。 若要安裝此套件:

  1. 新增 packages.microsoft.com 存放庫。 如需指示,請參閱適用於 Microsoft 產品的 Linux 軟體存放庫
  2. 使用散發套件的套件管理員來安裝 libmsquic 套件。 例如,Ubuntu 上的 apt install libmsquic=1.9*

附註:.NET 6 只與 1.9.x 版的 libmsquic 相容。 Libmsquic 2.x 因中斷性變更而不相容。 Libmsquic 會在需要時收到 1.9.x 的更新,以納入安全性修正程式。

macOS

macOS 目前不支援 HTTP/3,未來版本則可能會提供。

開始使用

預設不會啟用 HTTP/3。 將設定新增至 Program.cs,以啟用 HTTP/3。

var builder = WebApplication.CreateBuilder(args);

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

上述程式碼會將連接埠 5001 設定為:

  • 指定 HttpProtocols.Http1AndHttp2AndHttp3,以搭配使用 HTTP/3 與 HTTP/1.1 和 HTTP/2。
  • 使用 UseHttps 來啟用 HTTPS。 HTTP/3 需要 HTTPS。

因為並非所有路由器、防火牆和 Proxy 都會正確支援 HTTP/3,所以應該同時設定 HTTP/3 與 HTTP/1.1 和 HTTP/2。 這可以將 HttpProtocols.Http1AndHttp2AndHttp3 指定為端點所支援的通訊協定來完成。

如需詳細資訊,請參閱設定 ASP.NET Core Kestrel Web 伺服器的端點

Alt-svc

HTTP/3 會透過 alt-svc 標頭探索為從 HTTP/1.1 或 HTTP/2 的升級。 這表示第一個要求通常會在切換至 HTTP/3 之前使用 HTTP/1.1 或 HTTP/2。 如果啟用 HTTP/3,則 Kestrel 會自動新增 alt-svc 標頭。

Localhost 測試

  • 瀏覽器不允許 HTTP/3 上的自我簽署憑證 (例如 Kestrel 開發憑證)。

  • HttpClient 可以用於 .NET 6 或更新版本中的 localhost/loopback 測試。 使用 HttpClient 來提出 HTTP/3 要求時,需要額外設定:

    • HttpRequestMessage.Version 設定為 3.0 或
    • HttpRequestMessage.VersionPolicy 設定為 HttpVersionPolicy.RequestVersionOrHigher

限制

Kestrel 中的 HTTP/3 尚不支援某些 HTTPS 案例。 如果在使用 HTTP/3 時使用 HttpsConnectionAdapterOptions 來呼叫 Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps,則在 HttpsConnectionAdapterOptions 上設定下列選項沒有任何作業 (即不會執行任何動作):

使用 HTTP/3 時,呼叫下列 Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps 實作會擲回錯誤:

HTTP/3 優點

HTTP/3 所使用的語意與 HTTP/1.1 和 HTTP/2 相同:相同的要求方法、狀態碼和訊息欄位適用於所有版本。 差異在於基礎傳輸方式。 HTTP/1.1 和 HTTP/2 都使用 TCP 來做傳輸。 HTTP/3 使用與 HTTP/3 一起開發的新傳輸技術,稱為 QUIC

相較於 HTTP/1.1 和 HTTP/2,HTTP/3 和 QUIC 有許多好處:

  • 第一個要求的回應時間更快。 QUIC 和 HTTP/3 會以用戶端與伺服器之間的較少往返次數來交涉連線。 第一個要求更快抵達伺服器。
  • 連線封包遺失時的體驗較好。 HTTP/2 會透過一個 TCP 連線多工處理多個要求。 連線的封包遺失會影響所有要求。 此問題稱為「隊頭阻塞」。 由於 QUIC 提供原生的多工處理功能,因此封包遺失只會影響到遺失資料的要求。
  • 支援在網路之間轉換。 此功能適用於行動裝置,因為行動裝置變更位置時,通常會在 WIFI 和行動數據網路之間切換。 目前,HTTP/1.1 和 HTTP/2 連線會因切換網路時發生錯誤而失敗。 應用程式或網頁瀏覽器必須重試任何失敗的 HTTP 要求。 HTTP/3 可讓應用程式或網頁瀏覽器在網路變更時平順地繼續執行。 Kestrel 不支援 .NET 6 中的網路轉換。 未來的版本可能會提供此支援。