注意
這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。
HTTP/3 是 HTTP 的已核准標準和第三個主要版本。 本文討論 HTTP/3 的需求。 .NET 7 或更新版本中完全支援 HTTP/3。
重要
設定來使用 HTTP/3 的應用程式也應該支援 HTTP/1.1 和 HTTP/2。
HTTP/3 優點
HTTP/3
:
- 這是超文本傳輸通訊協定的最新版本。
- 在解決某些限制的同時,特別是在效能、延遲、可靠性和安全性方面,
HTTP/2
建立在其優勢之上。
特徵 / 功能 | HTTP/2 |
HTTP/3 |
---|---|---|
運輸 | 使用 TCP | 使用 QUIC |
連線 | 由於 TCP + TLS 而變慢 | 使用 0-RTT QUIC 更快 |
設定 | 握手 | 握手 |
隊列前端 | 受 TCP 層級影響 | 透過 QUIC 消除 |
封鎖 | 阻塞 | 數據流多路复用 |
加密 | TLS over TCP | TLS 內建於QUIC |
HTTP/2
到 HTTP/3
之間的主要差異如下:
-
傳輸通訊協定:
HTTP/3
使用 QUIC 而非 TCP。 QUIC 提供改善的效能、較低的延遲,以及更好的可靠性,特別是在行動和遺失網路上。 -
隊首阻塞:
HTTP/2
可能會遭受 TCP 層級的隊首阻塞,其中一個數據流的延遲可能會影響其他數據流。HTTP/3
使用 QUIC 時,提供獨立的數據流,因此一個數據流中的封包遺失不會讓其他數據流停滯不前。 - 客戶端連線建立:使用 QUIC 可以更快建立連線,有時對回頭客戶端以零往返時間(0-RTT)進行連接,因為它結合了傳輸和加密握手。
-
加密:
HTTP/3
授權 TLS 1.3 加密,預設提供增強的安全性,而在 中HTTP/2
則是選擇性的。 -
多任務處理:雖然兩者都支援多任務處理,
HTTP/3
但使用QUIC的實作更有效率,並避免TCP層級的行首封鎖問題。 -
連線遷移:在
HTTP/3
中的QUIC允許連線在用戶端的IP位址變更時(例如從 Wi-Fi 切換至行動網路)仍能持續,以改善行動用戶的使用體驗。
HTTP/3 需求
HTTP/3 使用 QUIC 作為其傳輸通訊協定。 HTTP/3 ASP.NET Core 實作取決於 MsQuic 來提供 QUIC 功能。 因此,ASP.NET HTTP/3 的核心支持取決於 MsQuic 平臺需求。 如需如何安裝 MsQuic 的詳細資訊,請參閱 QUIC 平臺相依性。 如果正在其上執行 Kestrel 的平台沒有 HTTP/3 的所有需求,則會將其停用,而且 Kestrel 將會回復至其他 HTTP 通訊協定。
開始使用
預設不會啟用 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 要求時,需要額外設定:
如需如何使用 HTTP/3 搭配 HttpClient
的詳細資訊,請參閱 HTTP/3 搭配 .NET。
HTTP/3 是 HTTP 的已提議標準和第三個主要版本。 本文討論 HTTP/3 的需求。 .NET 7 或更新版本中完全支援 HTTP/3。
重要
設定來使用 HTTP/3 的應用程式也應該支援 HTTP/1.1 和 HTTP/2。
HTTP/3 需求
根據作業系統,HTTP/3 的需求會不同。 如果正在其上執行 Kestrel 的平台沒有 HTTP/3 的所有需求,則會將其停用,而且 Kestrel 將會回復至其他 HTTP 通訊協定。
窗戶
- Windows 11 組建 22000 或更新版本或是 Windows Server 2022。
- TLS 1.3 或更新版本連線。
Linux
- 已安裝
libmsquic
套件。
libmsquic
是透過位於 packages.microsoft.com
的 Microsoft 官方 Linux 套件存放庫所發行。 若要安裝此套件:
- 新增
packages.microsoft.com
存放庫。 如需指示,請參閱適用於 Microsoft 產品的 Linux 軟體存放庫。 - 使用散發套件的套件管理員來安裝
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 要求時,需要額外設定:
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 11 組建 22000 或更新版本或是 Windows Server 2022。
- TLS 1.3 或更新版本連線。
Linux
- 已安裝
libmsquic
套件。
libmsquic
是透過位於 packages.microsoft.com
的 Microsoft 官方 Linux 套件存放庫所發行。 若要安裝此套件:
- 新增
packages.microsoft.com
存放庫。 如需指示,請參閱適用於 Microsoft 產品的 Linux 軟體存放庫。 - 使用散發套件的套件管理員來安裝
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 時使用 Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps
來呼叫 HttpsConnectionAdapterOptions,則在 HttpsConnectionAdapterOptions 上設定下列選項沒有任何作業 (即不會執行任何動作):
使用 HTTP/3 時,呼叫下列 Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps
實作會擲回錯誤:
- UseHttps(this ListenOptions listenOptions, ServerOptionsSelectionCallback serverOptionsSelectionCallback, object state, TimeSpan handshakeTimeout)
- UseHttps(this ListenOptions listenOptions, TlsHandshakeCallbackOptions callbackOptions)
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 中的網路轉換。 未來的版本可能會提供此支援。