読者です 読者をやめる 読者になる 読者になる

sonickun.log

備忘録

スマブラ for 3DSの通信を解析してみた

 2014年9月13日発売の「大乱闘スマッシュブラザーズ for Nintendo 3DS」のネットワーク対戦について,どのような通信を行っているのか解析してみました.

スマブラ for 3DS

 みんな大好きスマブラです.今作では,ゲームをインターネットに接続して遠隔地にいる人とも対戦できるようになっています.また,対戦形式には様々な種類があり,エンジョイ部屋,ガチ部屋,大観戦などがあります.

大乱闘スマッシュブラザーズ for Nintendo 3DS
 
 

パケットキャプチャについて

 今回スマブラの通信について調べるために,対戦時に送信されるパケットをキャプチャして解析しました.そもそも3DSのパケットなんてどうやって拾うんだと思うかもしれませんが,少しテクニカルな方法でキャプチャが可能です.
 ここでキャプチャの方法は具体的には書きませんが,ヒントとなる記事を以前書いたので紹介しておきます.

【実験】ARPスプーフィングによる中間者攻撃 - sonickun.log
 
 上記の記事でも述べていますが,この方法は通信の盗聴にも使えてしまうので,取り扱いには要注意です.今回はあくまで調査,学習目的です.くれぐれもゲームの不正行為やその他の悪用目的でパケットキャプチャはしないでくださいね.
 
 

TCP/UDPについておさらい

 みなさんにとって常識かもしれませんが,この先TCPUDPの話が出てくるので少しおさらいしておきます.
 TCP,UDPOSI参照モデルトランスポート層で動作する通信プロトコルで,以下のような違いがあります.

プロトコル TCP UDP
通信方式 コネクション型 コネクションレス
信頼性 高い 低い
転送速度 低速 高速
主な用途 WEBの閲覧,メール送受信,ファイル転送 音声通話,ビデオストリーミング

 このようにTCPUDPは用途によって使い分けられています.この先この表を頭に入れながら読むとわかりやすいかと思います.
 
 

対戦時(エンジョイ部屋)の通信

 「エンジョイ部屋」とはランダムにマッチングされた4人で同時対戦する部屋です.
 

トラフィックについて

 まずは対戦時のトラフィックを見てみます.
f:id:sonickun:20141019231914p:plain
 グラフを見ると,対戦時はUDPを用いて通信していることがわかります.対戦中はきれーいにUDPトラフィックが発生しています.やはりリアルタイム性を重視する対戦ゲームですから,TCPよりも高速なUDPが用いられています.また最初のインターネット接続時にはTCPでどこかしらのサーバ(アメリカの任天堂社とかがあった)に接続しているようです.
 他にも,エンジョイ部屋に入ってマッチングが行われている時などにはスパイクが観測されました.引き分けサドンデスに突入する直前には一瞬グラフが下がっているのもしっかり見えますね.
 UDPポートは50000番台~60000番台が使われていて,プレイヤーごとに違うようです.
 

通信方式について

 次に対戦時の通信方式について見てみます.結論から言うと,スマブラではP2P接続により対戦をしているようです.つまり,対戦時に中継のサーバを介すことなくプレイヤー同士を直接つなぐので,対戦者間でより高速にパケットのやりとりが出来ます.
 P2P接続であると判断した根拠は以下のとおりです.

  • 4人対戦時には3つのホストと通信をしている
  • 3人に対して同じパケットを送信している
  • 接続先のIPアドレスのほとんどはISPのもの
  • 対戦相手が変わるごとに接続先のIPも変化する

 つまりはパケットキャプチャにより通信相手のIPアドレスがわかってしまうわけですねぇ...そういえば以前,IPアドレスから位置情報を推定する記事を書いたような...

GeoIPでIPアドレスから位置情報を取得する[Python] - sonickun.log
 

パケットの中身について

 次にUDPパケットのペイロード部分について調べてみます.といっても意味不明なバイト列が並んでいるだけで全く読めません.おそらくキー操作の情報やキャラクターの座標の情報をエンコードないしは暗号化して送信していると思われます.キー操作とパケットを照らしあわせてエンコード方式を推測するといった気力は僕にはありません.以上です.
 

パケットの転送頻度について

 スマブラ3DSでは60fpsでキャラクターが動くようになっています(1秒間に60フレーム切り替わるという意味).そこで僕は「通信対戦時には1秒間に60パケット送信している」という仮説を立てました.その検証結果がこちら.
f:id:sonickun:20141020002212p:plain
 仮説通り,1秒間で1人の対戦相手につき60パケット弱(多少ドロップしている)を3人に対して送信していることがわかりました.1パケットのデータ量は平均およそ300byteほどです.通信対戦でもfpsを落とさず,かつ遅延も殆ど無く対戦できるようにした任天堂はえらいですねぇ~ 
 

ガチ部屋(1on1)での通信トラフィック

 「ガチ部屋(1on1)」とはその名の通り1体1でガチンコ勝負する対戦形式です.ガチ部屋でのトラフィックを解析した結果がこちら.
f:id:sonickun:20141019235015p:plain
 グラフの形はエンジョイ部屋のものとほぼ同じです.注目すべきはエンジョイ部屋が4人対戦に対してガチ部屋が2人対戦になっているので,トラフィック量がおよそ半分になっている点です.なんとなく半分より少ない気がするのはガチ部屋ではアイテム無しなのでその分の情報量が少なくなっているから...?

大観戦(リプレイチャンネル)の通信

 最後に大観戦(リプレイチャンネル)の通信について調べてみます.リプレイチャンネルでは過去に誰かがプレイした動画を見ることができます.その際のトラフィックを解析した結果がこちら.
f:id:sonickun:20141020002318p:plain
 リプレイチャンネルでは,過去のプレイ情報を最初のロード時間に一括ダウンロードしているようです.その際にはTCPプロトコルが利用されています.これをWiresharkのFollow TCP Streamでつなげてみると,約127MBのデータ量がありました(対戦時間は2分).リプレイチャンネルでの通信はリアルタイム性よりも信頼性を重視するためにUDPではなくTCPを使っているということになりますね.
 また気になるダウンロード元ですが,Amazon EC2サーバと思われるIPでした.自社のサーバを使っていなかったのは少し意外でした.
 
 

まとめ

 スマブラ for 3DSのインターネット対戦ではP2PによるUDP通信が行われており,できるだけ遅延を減らすような工夫が施されていました.また,サービスの性質によって適切にプロトコルを使い分けています.
 さらに詳しく解析すればもっと面白いことがわかると思います.個人的にはセキュリティの見地からもみてみたいと思っています.「パケットを偽造して不正行為は可能か,あるいは不正は検知されるか」というのもやってみたいと思いましたが,3DSを2台用意して自分だけの環境でやる必要があるでしょうし,なんとなくグレーな感じがするのでやめておきます(笑).その他いろいろな解析方法については,まわりのひとにアイデアを貰いたいところです.
 スマブラを通してネットワークの勉強ができるなんて嬉しい限りですね!