接続フロー

接続フローとは、割り当てサービスRelay サーバー にスロットを予約し、複数のプレイヤーを 1 つのマッチにグループ化するプロセスのことです。このプロセスには、ホストプレイヤーと参加プレイヤーの 2 種類の プレイヤー が関与します。接続プロセスに関わるおおまかなステップは、以下のとおりです。

  1. ホストプレイヤーが割り当てをリクエストする
  2. 割り当てサービスが Relay サーバーを選択する
  3. 割り当てサービスがホストプレイヤーに接続データを送信する
  4. ホストプレイヤーを Relay サーバーにバインドする
  5. ホストプレイヤーが参加コードをリクエストする
  6. 割り当てサービスがホストプレイヤーに参加コードを返す
  7. ホストプレイヤーが参加コードを参加プレイヤーと共有する
  8. 参加プレイヤーが参加コードを使用する
  9. 割り当てサービスが参加プレイヤーに接続データを送信する
  10. 参加プレイヤーを Relay サーバーにバインドする
  11. 参加プレイヤーが接続リクエストを送信する

ホストプレイヤーが割り当てをリクエストする

ホストプレイヤーは、割り当てサービスから割り当てをリクエストすることで、接続フローを開始します。割り当てリクエストには、その割り当てで許可される接続の最大数が含まれます。また、具体的な 地域 も含まれます。リクエストに地域が含まれない場合、割り当てサービスは QoS を使用してそのリクエストに最適な地域を選択します。

割り当てサービスが Relay サーバーを選択する

割り当てサービスがホストプレイヤーのリクエストを受け取り、適切な Relay サーバーを選択します。選択される Relay サーバーは、許可される最大接続数と、地域によって変わります。

割り当てサービスが Relay サーバーを見つけると、ゲームセッションのためにその Relay サーバー上にスペースを予約します。また、この時点で Relay サーバーで一意の秘密鍵が生成されます。Relay サーバーが、Relay サーバー IP、Relay サーバーポート、接続データ に加え、秘密鍵を割り当てサービスに返します。

割り当てサービスがホストプレイヤーに接続データを送信する

割り当てサービスがホストプレイヤーのゲームクライアントに Relay サーバーの接続データを送信します。

ホストプレイヤーを Relay サーバーにバインドする

ホストが割り当てリクエストのレスポンスから受け取ったデータを使用して、選択された Relay サーバーに BIND メッセージ を送信します。BIND には接続データ、承諾モード、nonce、ハッシュベースメッセージ認証コード (HMAC、hash-based message authentication code) があります。割り当て後 60 秒以内にホストから Relay サーバーにバインドが送信されないと、割り当てが アクティビティ未検知によりタイムアウトします

リクエストの情報が正しい場合、Relay サーバーは BIND_RECEIVED メッセージ をホストクライアントに返すことで、バインドリクエストを受け取ったことを知らせます。

ノート: BIND メッセージは通常、割り当て API や参加 API を呼び出した後に送信します。これらの API は、BIND メッセージで使用する Relay サーバーの宛先アドレスを取得します。

ホストプレイヤーが参加コードをリクエストする

Relay サーバーにバインドされたホストプレイヤーは、割り当てサービスから 参加コード をリクエストできます。

割り当てサービスがホストプレイヤーに参加コードを返す

割り当てサービスが参加コードを生成し、ホストプレイヤーに返します。割り当てサービスが返す参加コードは、ホストプレイヤーが Relay サーバーに割り当てられたことを一意に表し、参加プレイヤーを同じ Relay サーバーにバインドし、ホストプレイヤーとつながることを許可します。

ホストプレイヤーが参加コードを参加プレイヤーと共有する

ホストプレイヤーがさまざまなメソッド (口頭、テキストメッセージ、Lobby など) を通じて、他のプレイヤーと一意の参加コードを共有します。参加コードは短く覚えやすいので、簡単に共有できます。

割り当てサービスへの参加リクエストで参加コードを使用するプレイヤーが、参加プレイヤーになります。

ノート: 最初の割り当てリクエストで指定された接続の最大数を超えない限り、任意の数の参加プレイヤーが同じ参加コードを使用できます。

参加プレイヤーが参加コードを使用する

参加プレイヤーがホストプレイヤーから受け取った参加コードを使用して、割り当てサービスに参加リクエストを送信します。

ノート: "参加" とは、参加プレイヤー (ホスト以外のプレイヤー) のクライアントがホストクライアントのゲームセッションに参加することです。内部的には、Relay バックエンドサービスへのもう 1 つの割り当て呼び出しです。

割り当てサービスが参加プレイヤーに接続データを送信する

割り当てサービスが参加コードを使用してホストプレイヤーの割り当てを検出し、そのデータを参加プレイヤーに返します。

割り当てサービスからのレスポンスには Relay サーバー IP アドレス、Relay サーバーポート、秘密鍵、参加プレイヤーの暗号化された接続データ、参加プレイヤーの割り当て ID、ホストの暗号化された接続データが含まれます。これで参加プレイヤーが秘密鍵を使用して解読し、ホストの接続データを使用してホストに接続できるようになります。

参加プレイヤーを Relay サーバーにバインドする

参加プレイヤーが、割り当てサービスへの参加リクエストのレスポンスから受け取った接続データを使用して、BIND メッセージ を Relay サーバーに送信します。

正常に完了すると、Relay サーバーが参加プレイヤーのゲームクライアントに BIND_RECEIVED メッセージ を送信することで、受け取ったことを知らせます。

ノート: BIND メッセージは通常、割り当て API や参加 API を呼び出した後に送信する必要があります。これらの API は、BIND メッセージで使用する Relay サーバーの宛先アドレスを取得します。

参加プレイヤーが接続リクエストを送信する

ホストプレイヤーと同じ Relay サーバーにバインドされた参加プレイヤーが、ホストプレイヤーに接続リクエストを送信します。接続リクエストが正常に完了すると、参加プレイヤーとホストプレイヤーが互いに Relay サーバーを通じてデータを送信できるようになります。