次の方法で共有


MsQuic

このトピックでは、Microsoft Game Development Kit (GDK) で MsQuic を使用する方法について説明します。 MsQuic は、IETF QUIC プロトコルの Microsoft 実装です。 クロスプラットフォームで、C 言語で記述されており、汎用の QUIC ライブラリとして設計されています。

QUIC は当初、HTTP などの "TCP 経由の TLS "を使用するシナリオを置き換えるために設計されましたが、その後、単一の接続でリアルタイムの信頼性のないデータグラム メッセージと信頼性のある TCP などのストリームを多重化するのに適した汎用 UDP データ トランスポート層に拡張されました。 この機能は、クライアント/サーバー型のトランスポート層として、また、リアルタイム ゲーム トラフィック データ フローの基盤として、特に魅力的です。

MsQuic は、GDK タイトル向けに開発されており、Windows サーバー、Linux デスクトップおよびサーバー、iOS、Android、MacOS など、さまざまなプラットフォームで利用できます。

MsQuic API ドキュメントでは、多くの重要な MsQuic のコンセプトをカバーし、MsQuic API サーフェスに対してどのようにコーディングするかを示します。

QUIC の機能

  • すべてのパケットは暗号化され、ハンドシェイクは TLS 1.3 を使用して認証されます。
  • 信頼できるアプリケーション データと信頼できないアプリケーション データの並列ストリーム。
  • 最初のラウンド トリップ (0-RTT) でアプリケーション データを交換します。
  • 輻輳制御と損失回復が改善されました。
  • クライアントの IP アドレスやポートの変更にも対応します。
  • ステートレスな負荷分散。
  • 新しい機能や拡張機能用に簡単に拡張できます。

MsQuic 実装

MsQuic は、GDK タイトルでの使用に合わせて作られていることに加え、他の QUIC 実装とは異なるいくつかの機能があります。

  • クライアントとサーバーに最適化されています。
  • 最大のスループットと最小のレイテンシーに最適化されています。
  • 非同期 IO。
  • Receive side scaling (RSS) サポート。
  • UDP の送信および受信の結合をサポート。

MsQuic は次の QUIC RFC を実装します。

MsQuic は、以下の QUIC ドラフト拡張機能を実装します。

MsQuic の取得

MsQuic は、オープンソースの GitHub リポジトリでホストされます。 MsQuic は、こちらにある公式リリースのいずれかを介して入手する必要があります。 Xbox Series X|Sコンソールのサポートはプレリリース/1.9 で追加されましたが、 Microsoft Game Development Kit (GDK) のタイトルでは、可能な場合は最新の公式リリース バージョンを使用することをお勧めします。

特定のリリース用にビルド済みの MsQuic バイナリは、そのリリースの [アセット] セクションで利用できます。 MsQuic の特定のバージョンのすべてのビルド フレーバーは、相互に完全に互換性があります。 MsQuic は、リリースの下位互換性も維持しようとしますが、異なるバージョン間の互換性の期待については、MsQuic のドキュメントとリリース ノートを参照してください。

Microsoft Game Development Kit (GDK).PC

Microsoft Game Development Kit (GDK).PC のタイトルには、msquic_windows_x64_Release_openssl のビルド済みバイナリをお勧めします。

PC 上の Microsoft Game Development Kit (GDK) のタイトルは、ネイティブの x64 Win32 アプリケーションとして実行されます。 x64 プラットフォーム用に構築されたバージョンの MsQuic を使用する必要があります。 PC では、Windows 11 OS 以降でのみサポートされる Schannel とは対照的に、Microsoft Game Development Kit (GDK) がサポートするすべての OS バージョンをサポートする OpenSSLで構築されたバージョンの MsQuic を使用することをお勧めし ます。

Microsoft Game Development Kit (GDK).Console

Microsoft Game Development Kit (GDK).PC のタイトルには、msquic_gamecore_console_x64_Release_schannel のビルド済みバイナリをお勧めします。

MsQuic は、Xbox コンソールの Microsoft Game Development Kit (GDK) タイトルに特別なビルド フレーバーを提供します。 このフレーバーは、MsQuic を WINAPI_PARTITION_GAMES の下の API に制限し、MsQuic を XGamePlatform.lib にリンクさせます。 このビルド フレーバーを使用するには、2021 年 10 月リリース以降の XGDK がインストールされている必要があります。 MsQuic は、Microsoft Game Development Kit (GDK) コンソール用にビルドするときに Schannel を使用します。

クライアント サーバー認証

MsQuic は、HTTPS Web リクエストに使用されるのと同じ認証パスと検証パスを自動的に利用して、サーバーの認証を行います。 クライアント認証は、「安全なクライアント/サーバー通信に関するベスト プラクティス (NDA トピック)認可が必須です」に記載されているベスト プラクティスに従う必要があります。

MsQuic では、証明書を構成するために、クライアントとサーバーの両方で ConfigurationLoadCredential API と適切な QUIC_CREDENTIAL_CONFIG を使用する必要があります。 MsQuic に既定で含まれるすべての暗号スイートは安全であるとみなされますが、安全で認証された通信チャネルが確立されていることを保証するために、MsQuic がクライアントとサーバーの両方で証明書を検証する方法を適切に設定することが重要です。

サーバーでは、XSTS トークンのクライアント認証を使用するために、QUIC_CREDENTIAL_FLAG_REQUIRE_CLIENT_AUTHENTICATIONQUIC_CREDENTIAL_FLAG_INDICATE_CERTIFICATE_RECEIVEDQUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION フラグを指定する必要があります。 QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION フラグを指定した場合は、「安全なクライアント/サーバー通信に関するベスト プラクティス (NDA トピック)認可が必須です」セクションで説明したように、QUIC_CONNECTION_EVENT_PEER_CERTIFICATE_RECEIVED イベント コールバック内で、クライアント証明書を自分自身で検証する必要があります。

さらに、サーバー上では、HTTPS Web サーバーと同様にクライアントがサーバーを認証できるように、適切にルート化された証明書を提供する必要があります。

MsQuic 既定のサーバー認証の動作は、ID を検証する最も簡単で安全な方法であるため、クライアントでは、決してQUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION フラグを指定するべきではありません。 代わりに、XSTS トークンによるクライアント認証では、「安全なクライアント/サーバー通信に関するベスト プラクティス (NDA トピック)認可が必須です」セクションで説明したように、QUIC_CREDENTIAL_FLAG_CLIENT フラグとサーバーで生成された証明書を指定する必要があります。 QUIC_CREDENTIAL_TYPE_CERTIFICATE_CONTEXT モードを指定してクライアント証明書を供給し、CertCreateContext などの API を使用して、Web リクエストの応答データから直接コンテキストを生成することをお勧めします。

ネットワークの初期化

MsQuic は、Microsoft ゲーム開発キット (GDK) タイトルのネットワーク初期化を自動的に処理しません。 タイトル起動後、再開毎にネットワークが初期化されるのを待ってから、MsQuicOpenVersion または MsQuicOpen を使用して MsQuic を初期化します。

一時停止と再開

RegisterAppStateChangeNotification を使用して、一時停止および再開のイベントに登録する必要があります。 サスペンド時には、開いているストリームをすべて閉じ、続いて MsQuic を閉じる必要があります。 その後、再開時には、ネットワークの初期化を待ってから MsQuic を再度開く必要があります。

すべての MsQuic ストリームを一時停止タイムアウトの間に素早く閉じるためには、まず、開いているストリームごとに StreamShutdownQUIC_STREAM_SHUTDOWN_FLAG_ABORT および QUIC_STREAM_SHUTDOWN_FLAG_IMMEDIATE フラグ付きで呼び出す必要があります。 これで、すぐに QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE イベントをトリガーし、その時点で StreamClose を呼び出してストリームを閉じるのが安全です。 特定の接続ですべてのストリームが閉じられたら、ConnectionShutdownQUIC_CONNECTION_SHUTDOWN_FLAG_SILENT フラグ付きで呼び出し、続いて ConnectionClose を呼び出す必要があります。 すべての接続が終了したら、未処理の登録や設定について、RegistrationCloseConfigurationClose を呼び出し、続いて MsQuicClose を呼び出す必要があります。

優先ポート

Microsoft Game Development Kit (GDK) タイトルでは、メインのゲーム トラフィックに優先ローカル UDP マルチプレイヤー ポートを使用することが推奨されます。 MsQuic でこのポートを設定するには、SetParam 関数を使用して、ConnectionStart を呼び出す前に、接続オブジェクト ハンドルで QUIC_PARAM_CONN_LOCAL_ADDRESS 設定を実行します。

QUIC_PARAM_CONN_LOCAL_ADDRESS を設定する場合は、IPv4 と IPv6 のデュアル スタック ソケットを実現するために、AF_UNSPEC ファミリーを指定することをお勧めします。 ここでは、MsQuicOpen から MsQuicCallTable が返され、ConnectionOpen から MsQuicConnectionHandle が返された場合に、優先ポートを設定する例を示します。

uint16_t preferredPort;
if (SUCCEEDED(XNetworkingQueryPreferredLocalUdpMultiplayerPort(&preferredPort)))
{
    QUIC_ADDR localAddress = {};
    localAddress.si_family = AF_UNSPEC;
    localAddress.Ipv4.sin_port = htons(preferredPort);

    QUIC_STATUS status = MsQuicCallTable->SetParam(
        MsQuicConnectionHandle,
        QUIC_PARAM_LEVEL_CONNECTION,
        QUIC_PARAM_CONN_LOCAL_ADDRESS,
        sizeof(localAddress),
        &localAddress);
}

メモリの考慮事項

MsQuic パフォーマンスの実装により、Microsoft Game Development Kit (GDK) タイトルとの間で高帯域幅を転送できます。 WinSock メモリの考慮事項への拡張機能として、MsQuic を使用する場合は、カーネルによるメモリ消費を最小限に抑えるために、以下のベスト プラクティスに従う必要があります。

Microsoft Game Development Kit (GDK) タイトルは、コールバックの実行時間を最小限に抑える必要があります。 MsQuic は、プロトコルの実行とアプリへのアップコールに個別のスレッドを使用しません。 そのため、コールバックが大幅に遅れると、プロトコルが遅延し、カーネルに必要なメモリ消費量が増加します。 タイトルの完成に必要な重要な時間や作業は、独自のスレッドで行う必要があります。

Microsoft Game Development Kit (GDK) のタイトルは、カーネルのメモリ使用量を最小限に抑えるために、送信バッファーを効率的に管理する必要があります。 MsQuic のタイトルでこの機能を管理する方法の詳細については、「MsQuic でバッファーを送信する」を参照してください。

受信したデータがユーザー モードのバッファーに効率よく転送されるように、MsQuic で非同期受信を使用することを強くお勧めします。 MsQuicでの受信には、非同期受信の処理方法についての詳細が記載されています。 さらに、消費されるカーネル メモリの量を最小限に抑えるために、MsQuic GDK クライアントで部分的なデータ受け入れ機能を使用しないことをお勧めします。

関連項目

MsQuic

MsQuic API ドキュメント

MsQuic のリリース

MsQuic ドキュメントの構築