ASP.NET Core Kestrel Web サーバーで HTTP/3 を使用する

注意

これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

重要

この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

HTTP/3 は承認された標準であり、HTTP の 3 番目のメジャー バージョンです。 この記事では、HTTP/3 の要件について説明します。 HTTP/3 は、ASP.NET Core 7.0 以降で完全にサポートされます。

重要

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 は libmsquic の 1.9.x バージョンとのみ互換性があります。 Libmsquic 2.x は破壊的変更に起因して互換性がありません。 セキュリティ修正プログラムを組み込む必要があるとき、Libmsquic では 1.9.x への更新プログラムを受け取ります。

macOS

現在、HTTP/3 は macOS ではサポートされていません。今後のリリースで利用可能になる可能性があります。

作業の開始

HTTP/3 は既定では有効になっていません。 HTTP/3 を有効にするには、Program.cs に構成を追加します。

var builder = WebApplication.CreateBuilder(args);

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

上記のコードでは、以下のことを行うためにポート 5001 を構成しています。

  • HttpProtocols.Http1AndHttp2AndHttp3 を指定することで、HTTP/1.1 および HTTP/2 と共に HTTP/3 を使用する。
  • UseHttps を使用して HTTPS を有効にする。 HTTP/3 には HTTPS が必要です。

すべてのルーター、ファイアウォール、およびプロキシで HTTP/3 が適切にサポートされているわけではないので、HTTP/1.1 および HTTP/2 と共に HTTP/3 を構成する必要があります。 これを行うには、エンドポイントでサポートされるプロトコルとして 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 では、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 ブラウザーをシームレスに続行できます。 Kestrel では、.NET 8 のネットワーク移行がサポートされていません。 今後のリリースで利用可能になる可能性があります。

HTTP/3 は標準提案であり、HTTP の 3 番目のメジャー バージョンです。 この記事では、HTTP/3 の要件について説明します。 HTTP/3 は、ASP.NET Core 7.0 以降で完全にサポートされます。

重要

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 は libmsquic の 1.9.x バージョンとのみ互換性があります。 Libmsquic 2.x は破壊的変更に起因して互換性がありません。 セキュリティ修正プログラムを組み込む必要があるとき、Libmsquic では 1.9.x への更新プログラムを受け取ります。

macOS

現在、HTTP/3 は macOS ではサポートされていません。今後のリリースで利用可能になる可能性があります。

作業の開始

HTTP/3 は既定では有効になっていません。 HTTP/3 を有効にするには、Program.cs に構成を追加します。

var builder = WebApplication.CreateBuilder(args);

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

上記のコードでは、以下のことを行うためにポート 5001 を構成しています。

  • HttpProtocols.Http1AndHttp2AndHttp3 を指定することで、HTTP/1.1 および HTTP/2 と共に HTTP/3 を使用する。
  • UseHttps を使用して HTTPS を有効にする。 HTTP/3 には HTTPS が必要です。

すべてのルーター、ファイアウォール、およびプロキシで HTTP/3 が適切にサポートされているわけではないので、HTTP/1.1 および HTTP/2 と共に HTTP/3 を構成する必要があります。 これを行うには、エンドポイントでサポートされるプロトコルとして 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 では、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 ブラウザーをシームレスに続行できます。 Kestrel では、.NET 6 のネットワーク移行がサポートされていません。 今後のリリースで利用可能になる可能性があります。

HTTP/3 は、予定されている HTTP の 3 番目のメジャー バージョンです。 この記事では、HTTP/3 の要件と、それを使用するために Kestrel を構成する方法について説明します。

重要

HTTP/3 は、.NET 6 で "プレビュー機能" として使用できます。 これは、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 は libmsquic の 1.9.x バージョンとのみ互換性があります。 Libmsquic 2.x は破壊的変更に起因して互換性がありません。 セキュリティ修正プログラムを組み込む必要があるとき、Libmsquic では 1.9.x への更新プログラムを受け取ります。

macOS

現在、HTTP/3 は macOS ではサポートされていません。今後のリリースで利用可能になる可能性があります。

作業の開始

HTTP/3 は既定では有効になっていません。 HTTP/3 を有効にするには、Program.cs に構成を追加します。

var builder = WebApplication.CreateBuilder(args);

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

上記のコードでは、以下のことを行うためにポート 5001 を構成しています。

  • HttpProtocols.Http1AndHttp2AndHttp3 を指定することで、HTTP/1.1 および HTTP/2 と共に HTTP/3 を使用する。
  • UseHttps を使用して HTTPS を有効にする。 HTTP/3 には HTTPS が必要です。

すべてのルーター、ファイアウォール、およびプロキシで HTTP/3 が適切にサポートされているわけではないので、HTTP/1.1 および HTTP/2 と共に HTTP/3 を構成する必要があります。 これを行うには、エンドポイントでサポートされるプロトコルとして 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 開発証明書など) は許可されません。

  • .NET 6 以降で localhost またはループバックのテスト用に、HttpClient を使用できます。 HttpClient を使用して HTTP/3 要求を行う場合は、追加の構成が必要です。

    • HttpRequestMessage.Version を 3.0 に設定するか、
    • HttpRequestMessage.VersionPolicyHttpVersionPolicy.RequestVersionOrHigher に設定します。

制限事項

Kestrel の HTTP/3 では、一部の HTTPS シナリオはまだサポートされていません。 HTTP/3 を使用しながら HttpsConnectionAdapterOptionsMicrosoft.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 では、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 ブラウザーをシームレスに続行できます。 Kestrel では、.NET 6 のネットワーク移行がサポートされていません。 今後のリリースで利用可能になる可能性があります。