
2025.02.12
職員一人あたり52時間の残業削減に成功 kintone導入がもたらした富士吉田市の自治体DX“変革”ハウツー
モンスターストライクのリアルタイム通信を支える技術(全1記事)
リンクをコピー
記事をブックマーク
神谷元太氏:それでは「モンスターストライクのリアルタイム通信を支える技術」というタイトルで発表させていただきます。よろしくお願いします。
(会場拍手)
まず最初に軽く自己紹介をさせていただきたいと思います。2018年に株式会社ミクシィに新卒入社をしました。開発本部CTO室SREグループの神谷と言います。よろしくお願いします。業務内容としては主にモンストの開発や運用などを担当しています。
この発表ではモンストの大まかな構成について触れたあとに、主にモンストがマルチプレイで使っている「STUN/TURN」という技術について紹介していきたいと思います。
まず最初に前提として、モンストのマルチプレイについて軽く触れていきたいと思います。モンストは最大4人で協力してクエストを攻略していくゲームですけど、1つ重要な要素として「アクションゲームである」という点があります。そのため各プレイヤーの行動が他のプレイヤーにリアルタイムに伝わっていく必要があります。
また、ホスト・ゲストという概念が存在して、ホストが部屋を作ってゲストがその中に入っていくというようなイベントになっている点だけ覚えておいてください。
次にモンストの大まかな構成について説明します。こんな感じでモンストにはいろんなサーバがあるんですけど、今回は(スライド左側を指して)この辺だけの説明をします。
このうち、guestと書いてあるのが、いわゆるアプリ側、クライアント側です。クライアントはappサーバとTURNサーバと呼ばれている2種類のサーバと接続します。
このappと呼ばれているものは、普通のHTTPサーバで、これはクエストの外で使われます。そしてもう1つがTURNというサーバで、これはクエスト内でホストとゲストがクエストの状況を同期するのに使われています。
次に「このTURNとはなんぞや?」という話をしていきたいと思います。
その前に「なぜSTUN/TURNというものが必要なのか?」という話なんですけど、理想的なマルチプレイの状況としては例えばホストがサーバになったりしてゲストがホストに通信できて、そのままやりとりができたらすごいうれしいですよね。
ただ現実はうまくいかなくて、基本的にホストもゲストもNATの奥側にいるので、ゲストがホストに直接通信をするのは基本的には無理になっています。
それを解決するための技術が、STUNやTURNとか言われているやつですね。まずはその1つ目のSTUNについて説明します。これはRFC5389で定義されているプロトコルで、これはすごい単純なものでクライアントがサーバにSTUNのリクエストを送ったときに、STUNサーバのほうがクライアントのインターネット側から見えるIPアドレスをそのまま返すだけというすごくシンプルなプロトコルになっています。
基本的にSTUNを単体で使うことはなくて、他のSTUNの拡張がこれから出てくるんですけど、そのいろいろな拡張と組み合わせてホストとゲストの通信を実現していくかたちになっていきます。
次にTURNの説明をしていきたいと思います。TURNはRFC5766で定義されているSTUNの拡張です。これはクライアントとサーバ以外にピアと呼ばれるものが出てきます。「ピアとは何か?」というと、TURNサーバを経由してクライアントと通信をしたい人のことです。
TURNサーバはSTUNの持つ機能の他に、クライアントとサーバが通信する以外にももう1個ポートを開けてそこにピアが接続することによって、ピアとクライアントがあたかも直接通信を行っているかのようにデータのやりとりを中継することができます。
さらにTURNでTCPを使うための拡張としてRFC6062で定義されているものがあります。こちらはちょっとやり方が変わって、クライアントとTURNのコネクションが2種類に増えます。片方がコントロールコネクションと呼ばれているもので、これを使ってクライアントはTURNに「このピアと接続したい」というような命令を送ったりします。もう片方がデータコネクションと言われるコネクションで、これを使ってクライアントとピアは疑似的に1対1の通信を行うことができます。
モンストではこの方法を使ってホストとゲストの間でTCP通信を行っています。
次に「モンストでどのようにTURNを使っているか?」という話をしていきます。まず最初にサーバ構成のおさらいです。
このようにappとTURNの2つのサーバが出てきて、モンストの場合はホストがTURNのクライアント、ゲストがTURNのピアという扱いになっています。
まず最初にクライアント側。ホストやゲストがどのようにしてTURNサーバを見つけているかの話をしていきたいと思います。まず、ホストは普通のHTTPサーバであるappサーバに対してTURNの所在を問い合わせます。
するとappサーバはappの知っているTURNサーバのIPアドレスとポートの組み合わせの中からランダムに数個をホストに返します。これによってTURNサーバのロードバランシングも兼ねています。
また、TURNのRFCだったりそれ以外とかで、TURNのディスカバリーの方法はいくつか定義されているんですけど、モンストではそういうのは使っておらず、このような方法を取っております。またTURNには「ALTERNATE-SERVER」という「今は自分のTURNサーバは手いっぱいだから他のTURNサーバを見てね」という機能があるんですけど、これもモンストでは使っていません。
次にホスト側につないでからホストとゲストのコネクションが確立されるまでの流れについて説明していきます。ホストは先ほどの手順でTURNサーバのIPアドレスとポートを取得し、TURNサーバに接続をします。そしてTURNサーバのAllocationが取れると、TURNサーバはゲストがつなぐ用のポートを開いてその情報をホストに返します。
するとホストはそれをappサーバに登録します。このようにしてホストとゲストがTURNサーバにつなげために必要な情報をappサーバを介してやりとりします。
最終的にこのようにゲストとホストがTURNサーバを返して接続ができたらクエストが開始されます。
次に、IPv6の対応について説明していきたいと思います。やっぱり今のこのアプリケーションとなるとIPv6に対応していないといけないですし、対応ていないアプリは審査に通らないというようなこともあるので、こうなると重要な話になってきます。
モンストの場合、何が一番大変かと言うと、普通のTURNはIPv4しか対応をしていないんですね。TURNのIPv6に対応できるようなRFCの拡張もあるんですけど、モンストではそれを使わずに次のような方法を取っています。今回はその流れについて説明します。
ホストがIPv6に対応している場合でも、まず最初にTURNのIPアドレスをappサーバから取得するところまではIPv4と同じ流れになっています。このとき返されるIPアドレスもIPv4のものになっています。その後ホストはあらかじめ決められた手順でIPサーバから一意に生成できるドメインを生成します。
これでポイントになっているのは、モンストのTURNサーバはすべて自身のグローバルIPアドレスと、それに対応した一意に生成できるドメインを持っています。
ドメインを生成するとクライアント側はそのドメインに対するAAAAレコードをDNS64サーバに問い合わせます。そして疑似的なTURNのIPv6のアドレスを取得します。
そして、ホストはそのIPv6アドレスがTURNのアドレスと思い込んだまま、TURNと普通に通信をします。しかし、間にNAT64のゲートウェイが挟まっているので、こいつがIPv4に変換をして無事にTURNとつながるというかたちになっています。
まとめを話していきたいと思います。モンストではクエスト内とクエスト外で仕組みがそれぞれ大きく違って、つなぐサーバも違う設計になっています。また、ホストとゲストの間ではTURNというプロトコルを使って、TURNサーバ経由で通信を行っています。そしてIPv6の対応は、TURNのIPv6用の拡張を使うのではなく、DNS64とNAT64を使っています。
モンストは本家のアプリ以外にも「モンスターストライクスタジアム」という対戦用のアプリがあるんですけど、こちらはホストとゲストの通信以外にも各チームごとにクエストの進行状況をやりとりするためのTURNが存在して、このようにチーム1のホストとゲストとチーム2のホストとゲストの間のTURNの他に各チームのホスト同士のTURNの接続も出てきます。
もう1つ、モンストスタジアムを使ったモンストのeスポーツ大会がありまして、これはその先ほどの対戦を会場で行ってそれがリアルタイムで中継されるかたちになっています。その中継の映像を再生する用の観戦端末もこのように各チームのホストとTURNで接続して、それぞれクエストの進行状況をやりとりしている流れになっています。
それでは時間がきましたので、発表は以上にしたいと思います。ご清聴ありがとうございました。
(会場拍手)
2025.02.06
すかいらーく創業者が、社長を辞めて75歳で再起業したわけ “あえて長居させるコーヒー店”の経営に込めるこだわり
PR | 2025.02.07
プロジェクトマネージャーは「無理ゲーを攻略するプレイヤー」 仕事を任せられない管理職のためのマネジメントの秘訣
2025.02.06
落合陽一氏や松尾豊氏の研究は社会に届いているか? ひろゆき氏が語るアカデミアの課題と展望
2025.02.05
「納得しないと動けない部下」を変える3つのステップとは マネージャーの悩みを解消する会話のテクニック
2025.01.07
1月から始めたい「日記」を書く習慣 ビジネスパーソンにおすすめな3つの理由
2025.02.10
A4用紙を持ち歩いて殴り書きでアウトプット コクヨのワークスタイルコンサルタントが語る、2種類のメモ術
2025.02.05
エンジニアとして成功するための秘訣とは? ひろゆき氏が語る、自由な働き方を叶えるアプリ開発とキャリア戦略
2025.02.04
日本企業にありがちな「生産性の低さ」の原因 メーカーの「ちょっとした改善」で勝負が決まる仕組みの落とし穴
2025.02.03
「昔は富豪的プログラミングなんてできなかった」 21歳で「2ちゃんねる」を生んだひろゆき氏が語る開発の裏側
PR | 2025.02.04
能登半島地震で自宅は全壊、「これでどうやってDXするねん」 被災したサイボウズ社員と支援者らが語る災害支援のノウハウ
新人の報連相スキルはマネージメントで引きあげろ!~管理職の「他責思考」を排除~
2025.01.29 - 2025.01.29
【手放すTALK LIVE#45】人と組織のポテンシャルが継承されるソース原理 ~人と組織のポテンシャルが花開く「ソース原理」とは~
2024.12.09 - 2024.12.09
『これで採用はうまくいく』著者が語る、今こそ採用担当に届けたい「口説く」力のすべて
2024.11.29 - 2024.11.29
【著者来館】『成果を上げるプレイングマネジャーは「これ」をやらない』出版記念イベント!
2025.01.10 - 2025.01.10
片付けパパ対談【特別編】 整理術×行動術×メモ術で、仕事も人生も自在にデザイン!
2024.12.16 - 2024.12.16