対戦の仕組み

▼PS3版追加要素


興味があったので対戦の仕組みについて調べてみました。
この項目は、PS3が送受信するパケットをキャプチャして解析したものであり、推測が多々あります。
また細かなケースについては対応できてません。
筆者の環境がルータ1台で「NATタイプ2、UPnPあり」となっており、これを前提で記述してます。
PS3のNATタイプやUPnPについてはこちら

接続構成とパケットキャプチャ方法

PS3-[LANケーブル1]-PC-[LANケーブル2]-Router---インターネット

上の接続構成で、PCのLANポート2つをブリッジ接続にして、
LANケーブル1が挿さっているPCのLANポートをパケットキャプチャソフトで取る。

使用しているサーバ

サーバ名 機能
加入者 起動時にDLCチェック、メールやフレンドの通知
統計資源 資源(ランキングやマッチングなど)に関するサーバ情報の通知、通信速度計測
エージェント 自分や相手の情報(ID、グローバルIPなど)の通信、どのセッションサーバに登録したか、キープアライブ
セッション 対戦セッションに関する管理・制御、対戦中のキープアライブ
セッション検索 セッションサーバ(15台)から対戦セッション検索し該当セッションサーバの通知
ランキング表示 対戦相手の戦績表示、通信メッセージ登録
ランキング登録 自分の戦績などをランキングに登録
ストレージ 自分の戦績など保存

サーバは他にもトロフィーやプロフィールなどあるが省略。
海外ゲームだとメーカー独自でサーバを用意しているところもあるが、日本ゲームは基本共有しているようだ。

使用しているポート番号

TCP/UDP ポート番号 サービス名 用途
TCP 80 http 統計資源サーバ、ランキング表示サーバとの通信
TCP 443 https エージェントサーバ、ランキング登録サーバ、ストレージサーバとの暗号通信
TCP 3478 stun エージェントサーバとの通信
TCP 3479 twrpc セッション検索サーバとの通信
TCP 3480 plethora セッションサーバとの通信
TCP 5223 hpvirtgrp 加入者サーバとの通信
TCP 8080 http-alt PS3のネットワーク設定でプロキシを指定したときのhttpの代わり
UDP 3478 stun サインイン時のSTUNサーバとの通信
UDP 3479 twrpc サインイン時のSTUNサーバとの通信
UDP 3658 ps-ams 対戦相手の検索(ping用途)や対戦相手との通信

ルータがある環境では外部からの接続は普通できない(NATを使っていればなおさら)。
基本的に最初の通信はどれもPS3(ルータ内部)発信なので、それ以降のサーバからの各通信はルータを通過できる。
ただ対戦者同士のやりとりはP2P通信を使用していて、他者発信の通信も受ける必要があるため、
よく言われる3658/udpのポート開放が必要となる。

PS3およびルータがUPnPありならば、PS3起動時にルータに3658/udpのポート開放が登録され、
PS3シャットダウン時に3658/udpのポートマッピング情報が削除される。
ルータにブラウザでアクセスして、UPnP情報とか状態のページで確認できる。
ルータがあるのにUPnPなしの人は、3658/udpのポート開放をルータに手動で行う必要がある。

3658/udpポートが空いてない場合(PS3のNATタイプ3)、3658/udpではなくPS3がランダムなポート番号を使って通信する。
ただし確実なP2P通信するのが難しいため、制限される場合があるといわれてる。
これらについてはSTUN、UDPホールパンチングなどのNATトラバーサルでどうにか対処しようとしているようだ。

右上の通信状態のアンテナ表示について

次の場合のいずれかのタイミングで、サーバとのテストデータを送受信して上りと下りの速度が計測される。
一度計測したら更新されることはない。再計測したいならゲームを終了してまた起動するだけ。
  • サインイン中にEXVSを起動時
  • サインインせずにEXVS起動後、サインインしてからプレマかランクマ選択時
  • サインインせずにEXVS起動後、プレマかランクマ選択したときのサインイン時

上り速度 PS3から統計資源サーバへ128kBのテストデータを送信
下り速度 統計資源サーバからPS3に2MBのテストデータを受信

これは、通信速度計測サイトのように転送速度(bps)を計測している。
上り速度と下り速度をそれぞれ判定して、悪い方のアンテナ色(青~赤)を表示しているはず。

この通信速度は、統計資源サーバが都内にあるから(ユーザによって違うかも)距離に影響するし、
日本のトラフィックピークは19時から23時で土日は日中も多い(総務省資料)から時間帯も影響する。
さらにPSNのサーバは別ゲームも使用していて、サーバの負荷やトラフィックに左右される。
結局、一度きりの計測なので右上の通信状態は目安にしかならない。

ただ、もしかするとプレマやランクマをやるとき、この通信状態をサーバに登録して
相手探しの一番最初の手がかりに使ってるかもしれない。

対戦相手のアンテナ表示について

対戦相手のアンテナ表示は、自分と相手との通信状態を段階別にアンテナ色(青~赤)で表している。

自分と相手とは常にps-ams(3658/udp)を利用したP2P通信をしていて、
自分と相手との応答速度(往復時間、RTT)をps-amsパケットで計測し、アンテナ色を表示している。
サーバとの転送速度計測とは違い、pingと同じような遅延計測をしている。
アンテナ表示の更新間隔はわからないが数秒以内ごとに行っていると思われる。

自分が見てる相手のアンテナ色は、基本的には相手側が自分を見たときのアンテナ表示と同じ。
対戦時は、自分自身のアンテナではなく対戦する相手3人~7人のアンテナを見て判断すること。
自分自身のアンテナ表示は統計資源サーバとの計測結果なので、相手との通信には関係ない。

例えば自分Aが高速回線で、相手BCDのアンテナの色がB青、C青、D黄のとき
AとB、AとCは青でできるが、AとDが黄なので4人対戦の遅延は黄色になる。
この場合、Dの通信回線が遅い可能性が大。BやCからDを見ても黄色だろう。

レアケースだが、Dは遅いがBとCとDが距離的に近くでAが3人から距離が遠いなどの場合、
BとCは全員青に見え、AはDが黄色、DはAが黄色に見えることも考えられる。

対戦中の遅延(人型マーク)

ネットゲームの実装についてここを参考にすれば、EXVSは完全同期型/キー入力同期方式のようなものであると推測できる。
対戦開始時や対戦中、画面中心下に表示される人型マーク(青~赤)が同期のための遅延フレーム数を表しているだろう。

ゲームは60fpsなので1フレーム=16.6ミリ秒で描画。
対戦中のps-amsパケットを見ると、自分から他3人それぞれに16.6ミリ秒ごとに、
つまり相手一人に対し1秒間に60回パケットを送信している。

理論上では、自分と他3人それぞれとの応答速度が16.6ミリ秒より小さければCPU戦のように遅延はない。
青色の人型マークのときはほぼ遅延のない環境で対戦しているようだ。
ちなみに対戦前は約50ミリ秒ごとにパケット送信していた。

青色の人型マークでも、対戦途中で止まったり重くなるのは次の要因だろう。
  • どこかの通信回線が重くなった
  • パケット損失が起き、損失パケットを補う情報パケット待ち
  • 誰かの回線が安定した回線速度ではないため、対戦遅延(人型マーク)計測時と対戦中では速度が違う

対戦遅延計測は、ランクマなら4人が決定してからチームや味方相手の4人対戦表示されるまで、
プレマなら4人が機体選択終わってからチーム・味方・相手の対戦表示までだろう。

対戦中の通信速度

対戦中のパケットで上り下りの転送速度(bps)を計測してみた。
  • 上りの速度:自分から他3人へのパケットの合計サイズ(bit)を経過時間(秒)で割る
  • 下りの速度:他3人から自分へのパケットの合計サイズ(bit)を経過時間(秒)で割る

実は自分から他3人、他3人から自分へ送信するパケットサイズは変わらないし、
経過時間もほぼかわらないので上下の通信速度は同じ。青遅延の3回対戦で計測してみた。

188kbps、190kbps、212kbps

データ転送量としてはたいしたことないのがわかる。
対戦相手のアンテナ表示や対戦中の遅延で述べたように、
呼び名はいろいろあるが応答速度(RTT、往復時間)が対戦の指標になることを表してる。

無線LANについて

無線LANはCSMA/CAという制御方式を使っていて、電波が衝突してパケットが破壊されないようにしている。
そのため、送信する前に毎回待ち時間(μ秒単位)がある。
送信したいときに電波が使われてると電波が空くまで待ち、さらに待ち時間+ランダム時間待ってから送信する。

無線は、送信と受信が同時にできない(半二重)、パケットロスや再送が起きやすいなど
リアルタイムで継続的にデータのやりとりをするには微妙な遅延が生じやすい。

一方有線LANは、送信と受信が同時にできる(全二重通信)LANケーブルが使われていて
衝突が起こらず安定した通信ができるので、対戦には有線が推奨される。

ランクマのシャッフル検索の大まかな流れ(1Pのとき)

  1. エージェントサーバに自分の情報登録
  2. エージェントサーバから相手リスト(PSNID、アバターURL、ルータのグローバルIP、PS3のプライベートIP、通信対戦ポート番号など)取得
  3. リストの全グローバルIPに対し、ポート番号が3658ならps-ams(3658/udp)送信、0ならping送信
  4. エージェントサーバからセッションサーバ情報教わる
  5. セッションサーバに自分の情報登録
  6. セッションサーバから対戦相手の情報通知×3回
  7. ランキング表示サーバに通信メッセージ登録
  8. 対戦(自分と他3人とのP2P通信)
  9. ストレージサーバと暗号通信
  10. ランキング登録サーバと暗号通信
  11. セッションサーバのセッション解放

相手のプライベートIPは同じ住居内の対戦のときのために必要なようだ。
2P~4Pでは対戦開始後エージェントサーバとの切断を行うなど1Pと2P~4Pで動作が少し違う。
セッションが見つからなかったときやセッションサーバに自分の情報登録して
相手からのps-amsが送信されるのを待機して対戦相手を決めるなど様々な動作があるようだ。

プレマの大まかな流れ(ジョイン)

  1. エージェントサーバに自分の情報登録
  2. 検索すると、エージェントサーバからホストリスト(情報はランクマと同じ)取得
  3. ホストのグローバルIPアドレスに対し、ポート番号が3658ならps-ams(3658/udp)送信、0ならping送信
  4. 部屋に入ると、ランキング表示サーバに通信メッセージ登録、セッションサーバに自分の情報登録
  5. セッションサーバから入室中の相手の情報(PSNIDやIPなど)が通知される
  6. 対戦(自分と他3人とのP2P通信、部屋にいる他の人ともアンテナ表示のためP2P通信をしている)
  7. 部屋からでるとセッション解放

実は、プレマの時は対戦中や部屋で待っている間も部屋にいる全員とP2P通信している。
ただし対戦中のデータは他3人としか通信しない。

ルームクリエイトの場合は多少動作が違う。
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。