記事を書いた人
新里 祐教
プログラマー。GMOインターネットグループにて開発案件・新規事業開発に携わる。またオープン・プロジェクトであるSIPropでオープンソースやいろいろなアイデアを形にして展示をするなどの活動を国内外で行っている。主にネットワークから開発全般を得意としている。
『スプラトゥーン』『フォートナイト』『荒野行動』などのインターネットを使って対戦するゲームでは、どのようなネットワークのやり取りがあるのでしょうか。それを少し覗いてみることで、ネット対戦ゲームのしくみが見えてきます。
インターネットを使って対戦するゲームはたくさんあります。たとえば『スプラトゥーン』『フォートナイト』『荒野行動』など、たくさんのプレイヤーが同じフィールドに集まって、リアルタイムでバトルを行うようなゲームでは、インターネットが使われています。
このようなインターネットを使った対戦ゲームで遊んだことがある人も多いでしょう。私は主に、スプラトゥーン2を時間があるときにプレイしています。
フォートナイトには、3.5億人以上ものプレイヤー数、世界中から1,230万人がフォートナイトに同時接続という記録を打ち立てたり、凄まじいほどのプレイヤーが遊んでいます。私はフォートナイトをパーティーロイヤルのイベントが始まったころから参加しました。これほどたくさんの人が遊んでいるなら遊んでみよう!!と思い、PCで始めたのがきっかけです。
フォートナイトは、使える環境も「PC(Windows/Mac)」「スマートフォン」「PlayStation4/5」「Nintendo Switch」「Xbox」など、一通りの端末で遊べます。
これらのインターネットを使ったゲームでは、どのようにして世界中の人とリアルタイムにつながって、バトルやチャットをしたり、さまざまな端末同士で遊べるようになっているのでしょうか。
まず、自分と相手で何かデータをやり取り(=通信)している、ということは容易に予想できます。大量のユーザーをリアルタイムに処理するために、運営側で負荷対策をしていることも予想できるでしょう。他にも、プレイヤーの個人情報を保護したり、チート行為のような不正ができないように、データを暗号化してわからないようにしているはずです。
これらがどういったしくみで動いているのかや、通信に関わるさまざまな技術は、アプリの通信を実際に見てみることで知ることができます。どんな通信をしているのかと興味が湧いてきたら、実際に通信を見てみましょう。
実際の通信を見るツールとしてよく使われるものに、Wiresharkがあります。Wiresharkは、簡単に通信を見ることができ(この通信を見ることを"パケットキャプチャ"と呼びます)、このアプリはどんなサーバと通信をしているのか、などといったことを簡単に知ることができます。
Wiresharkは実際に開発や仕事でも利用されています。開発しているシステムで通信がうまく行われていないとき、Wiresharkを使ってどの通信が間違っているのか、正しいのかなどを分析できます。私は新しくPCをセットアップするときは、必ずインストールしていて、開発者には必須のツールのひとつだと思っています。
Wiresharkは無料でダウンロード、インストールして使えます。まずはPCにインストールして、起動してみましょう。
最初にWiresharkを起動するとPC上の通信インタフェース(Wi-Fiやイーサーネットといったアダプタ)の一覧が出てきます。Wiresharkのパケットキャプチャは、通信を行っているインタフェースに対して実行する必要があります。私のPCではWi-Fiを使っているので、Wi-Fiをダブルクリックします。
そうするとWiresharkがパケットキャプチャを開始します。アプリを起動していなくても、PCはバックグラウンドで通信を行っているので、表示がたくさんされていると思います。ここでは例としてGoogle Chromeで検索したときのパケットキャプチャをしてみましょう。
Wiresharkでパケットキャプチャをしながら、PC上でGoogle Chromeを起動して「ラーメン」と検索してみました。Wiresharkの画面で、大量に表示がされていると思います。
表示されている1行ずつが、Chromeが行っている実際の通信です。Google Chromeで少し検索してみるだけでも、大量の通信がされているこがわかるでしょう。
この表示列は次のようになっています。
No. | パケットキャプチャを始めたときからの通番 |
---|---|
Time | パケットキャプチャを始めたときからの経過秒数 |
Source | 送信元のIPアドレス |
Destination | 送信先のIPアドレス |
Protocol | 通信で利用されているプロトコル(仕様) |
Length | フレームのバイトサイズ |
Info | このパケットの概要情報 |
ここでは私のPCのIPアドレスが192.168.50.177で、Googleからの検索結果は172.217.175.4というサーバから受け取っていることがわかります。
またプロトコルには、QUICが使われていることがわかりました。プロトコルとは、通信を行うための仕様で、通信を行うための仕様を合わせることで、異なるデバイスやアプリ間でも通信できるようになります。
ここで使われているQUICは高速な通信ができるプロトコルで、検索結果をできるだけ速く表示させるための工夫がなされていることがわかります。
そして、Wiresharkのパケットのどれかをクリックすると、一覧の画面の下に、QUICで通信している詳細な内容とバイト列が表示さています。これらを確認することで、実際にGoogle ChromeとGoogleのサーバがどういったデータの送受信を行っているのかを確認できるというわけです。
ここで、パケットキャプチャをするときのポイントとして、キャプチャをしたいアプリ以外はできるだけ停止させておいたほうがいいでしょう。何か通信するアプリがあると、どのアプリの通信なのかよくわからなくなってしまうためです。
それでは、次はGoogle Chromeを落として、フォートナイトの通信をパケットキャプチャしてみます。
ではここで、フォートナイトのバトルロイヤルのパケットキャプチャをしてみましょう。私のPC環境はOSはWindows、CPUはIntel Core i7-7700HQ、GPUはNVIDIA GTX 1060を搭載していて、60fpsでプレイしています。たまにバトルを行って、パーティーロイヤルなどのイベントに参加しているくらいなので、バトルはとても弱いです。
それでは、バトルロイヤルに参加するタイミングで、Wiresharkでパケットキャプチャを開始します。バトルが終わったらパケットキャプチャを終了させて、キャプチャしたパケットを確認するといった流れです。
Wiresharkで見ると大量のパッケットキャプチャがされていることがわかると思います。Wiresharkで通信を見てみましょう。
プロトコルにTLSv1.2と記載されているところを見てみます。TLSは暗号化通信を利用するプロトコルで、フォートナイト通信では、暗号化が使われているところがあることがわかります。
次にInfoに"Client Hello"というところをクリックして、プロトコルの詳細をクリックしていくと、Server Nameのところに"fortnite-public-service-prod11.ol.epicgames.com"というのが見つかりました。これは暗号化通信でEpic Gamesのサーバに接続を開始しているパケットです。
次にこのサーバのIPアドレスを調べてみましょう。普段、私たちが見ているURLなどは「ドメイン」というわかりやすい名前になっていますが、実際の通信は、インターネット上の住所である「IPアドレス」で行います。
さきほどの"fortnite-public-service-prod11.ol.epicgames.com"はドメイン名にあたります。このドメイン名とIPアドレスの紐づけを調べるコマンドに「nslookup」というものがあります。Windowsのコマンドプロンプトを立ち上げて、nslookupを実行してみます。
nslookup fortnite-public-service-prod11.ol.epicgames.com
Non-authoritative answer:
Name: fortnite-public-service-prod11.ol.epicgames.com
Address: 34.231.137.204
Name: fortnite-public-service-prod11.ol.epicgames.com
Address: 52.0.138.83
Name: fortnite-public-service-prod11.ol.epicgames.com
Address: 54.208.7.106
Name: fortnite-public-service-prod11.ol.epicgames.com
... (以下略) ...
1個のドメインからたくさんのIPアドレスが戻ってきました。これはDNSラウンドロビンと呼ばれる、1個のドメインに複数のIPアドレス(サーバ)を割り当てて、たくさんの人が接続しに来ても負荷を分散さられる方法です。つまりフォートナイトでは、DNSラウンドロビンで負荷分散しているということがわかりました。
次にこのサーバがどこにあるのかを見てみましょう。同じくnslookupコマンドを使って、IPを調べてみると、
nslookup 34.231.137.204
Non-authoritative answer:
204.137.231.34.in-addr.arpa name = ec2-34-231-137-204.compute-1.amazonaws.com.
このIPアドレスのサーバは、Amazon AWSにあることがわかりました。
このように、Wiresharkからわかる情報と他のツールを組み合わせることで、いろいろなことを調べられます。
Wiresharkには、パケットキャプチャ以外にも便利な機能がついています。
Wiresharkのメニューから「統計」→「IPv4 Statistics」→「IP Protocol Type」をクリックすると、プロトコルがどれくらい使われているのか、仕分けをしてくれます。
バトル中のパケットではUDPが全体の94.3%も使われています。UDPは、遅延が少なくストリーミングのようなデータを送るときに適したプロトコルです。攻撃したりプレイヤー同士の位置など、インターネットを介したリアルタイムのバトルは、UDPによって支えられていることがわかります。
また、同じくWiresharkの「統計」→「入出力グラフ」からは、帯域を確認できます。
普段は約200Kbps以下で推移していて、バトルが開始して倒れるまでは600Kbps程度まで帯域が上がっています。恐らくフィールドの移動ではそれほど通信が行われず、バトルになったときは攻撃や当たり判定が必要なため、大量に通信が行われていると推測できます。
このように実際に使われている帯域についても、簡単に調べられるというわけです。
パケットキャプチャを行って、普段はあまり見ることがない、Google Chromeとフォートナイトの通信を確認できました。アプリの動きを通信から知ることができるのはおもしろいですが、他にもアプリの通信を知ることで役に立つことがたくさんあります。
たとえば自分がアプリを作りたいと思ったときや、開発をするときの大きな助けになります。今回の例で出てきた、大量のユーザーが来たときの負荷分散、ユーザーの個人情報を守るためには暗号化通信が必要になる、リアルタイムバトルにはUDPを使えばいいんだな、といったことは、開発するときの参考にもなります。
パケットキャプチャは、実際の開発現場において、主に何か問題があったときの分析・解析ツールとして、よく使われています。それだけでなく、他のアプリの通信を知ることは、生きたお手本・教科書としても使えます。「このアプリは安全な通信を行っているのか?」などといった、セキュリティの確認もできます。
このようにパケットキャプチャを使えるようになると、開発から問題分析まで、大きな助けとなるのです。
フォートナイトでは、バトルの他にも、LINEのようにボイスチャットで友達と話すことができます。会話にはリアルタイム性が必要になります。たとえば、自分が話した内容が相手に届くまで時間かかってしまうと、会話を続けるのが難しくなります。
Wiresharkでボイスチャット中のパケットキャプチャをすると、通信にはUDPが使われていることがわかります。では、話す相手とはどのようにつながっているでしょうか? それには「NAT Traversal」と呼ばれる「STUN/TURN」の技術が使われていることも、パケットキャプチャからわかります。
ちょっぴり気になってきましたか? 今度は自分でボイスチャットのパケットキャプチャを行って、アプリで使われているいろいろな通信技術を学んでみましょう。
新里 祐教
プログラマー。GMOインターネットグループにて開発案件・新規事業開発に携わる。またオープン・プロジェクトであるSIPropでオープンソースやいろいろなアイデアを形にして展示をするなどの活動を国内外で行っている。主にネットワークから開発全般を得意としている。