HTTP/3 是 HTTP 的第三個和最近標準化的主要版本。 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 可讓應用程式或網頁瀏覽器在網路變更時平順地繼續執行。 HttpClient 和 Kestrel 不支援 .NET 7 中的網路轉換。 未來的版本可能會提供此支援。
這很重要
設定來使用 HTTP/3 的應用程式也應該支援 HTTP/1.1 和 HTTP/2。 如果在 HTTP/3 中識別問題,建議您停用 HTTP/3,直到未來 .NET 版本中解決問題為止。
HttpClient 設定
可以透過將 HttpRequestMessage.Version 設定為 3.0 來設定 HTTP 版本。 不過,由於並非所有路由器、防火牆和 Proxy 都正確支援 HTTP/3,因此建議搭配 HTTP/1.1 和 HTTP/2 設定 HTTP/3。 在 HttpClient 中,這可以透過指定來完成:
- HttpRequestMessage.Version 至 1.1。
- HttpRequestMessage.VersionPolicy 至 HttpVersionPolicy.RequestVersionOrHigher。
平臺相依性
HTTP/3 使用 QUIC 作為其傳輸通訊協定。 HTTP/3 的 .NET 實作會使用 MsQuic 來提供 QUIC 功能。 因此,HTTP/3 的 .NET 支援取決於 MsQuic 平臺需求。 如需如何安裝 MsQuic 的詳細資訊,請參閱 QUIC 平臺相依性。 如果 HttpClient 執行的平台沒有 HTTP/3 的所有需求,則會停用。
使用 HttpClient
下列程式代碼範例使用 最上層語句 ,並示範如何在要求中指定 HTTP3:
// See https://aka.ms/new-console-template for more information
using System.Net;
using var client = new HttpClient
{
DefaultRequestVersion = HttpVersion.Version30,
DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact
};
Console.WriteLine("--- localhost:5001 ---");
HttpResponseMessage resp = await client.GetAsync("https://localhost:5001/");
string body = await resp.Content.ReadAsStringAsync();
Console.WriteLine(
$"status: {resp.StatusCode}, version: {resp.Version}, " +
$"body: {body.Substring(0, Math.Min(100, body.Length))}");
.NET 6 中的 HTTP/3 支援
在 .NET 6 中,HTTP/3 可作為 預覽功能 ,因為 HTTP/3 規格尚未完成。 行為或效能問題可能存在於 HTTP/3 與 .NET 6 中。 如需預覽功能的詳細資訊,請參閱 預覽功能規格。
若要在 .NET 6 中啟用 HTTP/3 支援,請在項目檔中包含 RuntimeHostConfigurationOption 節點,以啟用 HTTP/3 HttpClient。
<ItemGroup>
<RuntimeHostConfigurationOption Value="true"
Include="System.Net.SocketsHttpHandler.Http3Support" />
</ItemGroup>
或者,您可以從應用程式程式代碼呼叫 System.AppContext.SetSwitch ,或將 DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT 環境變數設定為 true。 如需詳細資訊,請參閱 .NET 環境變數:DOTNET_SYSTEM_NET_HTTP_*。
要求 HTTP/3 組態旗標的原因是在使用版本 RequestVersionOrHigher原則 時,保護應用程式免於未來中斷。 當呼叫目前使用 HTTP/1.1 和 HTTP/2 的伺服器時,如果伺服器稍後升級至 HTTP/3,用戶端會嘗試使用 HTTP/3,而且可能不相容,因為標準不是最終的,因此在 .NET 6 發行之後可能會變更。
.NET 6 只與 1.9.x 版的 libmsquic 相容。 由於連結庫中的重大變更,Libmsquic 2.x 與 .NET 6 不相容。 Libmsquic 會在需要時收到 1.9.x 的更新,以納入安全性修正程式。
HTTP/3 伺服器
ASP.NET 在 .NET 6(預覽版)中透過 Kestrel 伺服器支援 HTTP/3,.NET 7 則完全支援。 如需詳細資訊,請參閱 搭配 ASP.NET Core Kestrel 網頁伺服器使用 HTTP/3。
公用測試伺服器
Cloudflare 託管一個 HTTP/3 網站,可用來測試客戶端於 https://cloudflare-quic.com。