HTTP/3 は、HTTP の 3 番目および最近標準化されたメジャー バージョンです。 HTTP/3 では、HTTP/1.1 および HTTP/2 と同じセマンティクスを使用します。つまり、同じ要求メソッド、状態コード、メッセージ フィールドがすべてのバージョンに適用されます。 異なる点は、基になるトランスポートにあります。 HTTP/1.1 と HTTP/2 では、どちらもトランスポートとして TCP が使用されます。 HTTP/3 は 、QUIC と呼ばれる HTTP/3 と共に開発されたトランスポート テクノロジを使用します。
HTTP/3 と QUIC の両方に、HTTP/1.1 と HTTP/2 と比較していくつかの利点があります。
- 最初の要求の応答時間が短縮されます。 QUIC と HTTP/3 は、クライアントとサーバー間のラウンド トリップを減らして接続をネゴシエートします。 最初の要求がより速くサーバーに到達します。
- 接続パケットが失われた場合のエクスペリエンスが向上しました。 HTTP/2 では、1 つの TCP 接続を介して複数の要求が多重化されます。 接続でのパケットの損失は、すべての要求に影響します。 この問題は、"ヘッドオブライン ブロッキング" と呼ばれます。 QUIC はネイティブ多重化を提供するため、失われたパケットはデータが失われた要求にのみ影響します。
- ネットワーク間の移行がサポートされます。 この機能は、モバイル デバイスが場所を変更する際に WIFI ネットワークと携帯ネットワークを切り替えるのが一般的なモバイル デバイスに役立ちます。 現在、ネットワークを切り替えると、HTTP/1.1 接続と HTTP/2 接続がエラーで失敗します。 アプリまたは Web ブラウザーは、失敗した HTTP 要求を再試行する必要があります。 HTTP/3 を使用すると、ネットワークが変更されたときにアプリまたは Web ブラウザーをシームレスに続行できます。 HttpClient Kestrel では、.NET 7 でのネットワーク移行はサポートされていません。 今後のリリースで利用可能になる可能性があります。
Von Bedeutung
HTTP/3 を利用するように構成されたアプリは、HTTP/1.1 および HTTP/2 もサポートするように設計する必要があります。 HTTP/3 で問題が特定された場合は、.NET の将来のリリースで問題が解決されるまで、HTTP/3 を無効にすることをお勧めします。
HttpClient の設定
HTTP バージョンは、 HttpRequestMessage.Version
を 3.0 に設定することで構成できます。 ただし、すべてのルーター、ファイアウォール、プロキシが 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 機能が提供されます。 その結果、.NET での HTTP/3 のサポートは、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 は プレビュー機能 として使用できます。 動作またはパフォーマンスの問題は、.NET 6 の HTTP/3 に存在する可能性があります。 プレビュー機能の詳細については、 プレビュー機能の仕様を参照してください。
.NET 6 で HTTP/3 のサポートを有効にするには、プロジェクト ファイルに RuntimeHostConfigurationOption
ノードを含め、 HttpClient
で HTTP/3 を有効にします。
<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 は、libmsquic の 1.9.x バージョンとのみ互換性があります。 ライブラリの破壊的変更により、Libmsquic 2.x は .NET 6 と互換性がありません。 セキュリティ修正プログラムを組み込む必要があるとき、Libmsquic では 1.9.x への更新プログラムを受け取ります。
HTTP/3 サーバー
HTTP/3 は、.NET 6 (プレビュー) および .NET 7 (完全にサポート) の Kestrel サーバーを使用した ASP.NET でサポートされています。 詳細については、 ASP.NET Core Kestrel Web サーバーでの HTTP/3 の使用に関するページを参照してください。
パブリック テスト サーバー
Cloudflare は、 https://cloudflare-quic.comでクライアントをテストするために使用できる HTTP/3 用のサイトをホストします。
こちらも参照ください
.NET