Slide 1

Slide 1 text

モンスターストライクの
 リアルタイム通信を支える技術
 開発本部 CTO室 SREグループ 
 神谷 元太
 Battle Conference U30 2019
 XFLAG


Slide 2

Slide 2 text

自己紹介
 ● 神谷 元太
 ● Twitter: @cloudear8
 ● 2018年 株式会社ミクシィに新卒入社
 ● 開発本部 CTO室 SREグループ
 ● モンスターストライク(モンスト)の
 開発・運用等を担当


Slide 3

Slide 3 text

発表の流れ
 ● モンストの大まかな構成
 ● STUN/TURNについて
 ● モンストでのTURNの使い方
 ● まとめ


Slide 4

Slide 4 text

モンストのマルチプレイについて
 ● 最大4人で協力してクエストを攻略する
 ● アクションRPG
 ○ リアルタイムに行動を同期する必要
 ● ホスト、ゲストという概念が存在する


Slide 5

Slide 5 text

モンストの大まかな構成 app
 TURN
 batch
 DB
 guest
 queue
 cache
 host


Slide 6

Slide 6 text

モンストの大まかな構成 app
 TURN
 batch
 DB
 guest
 queue
 cache
 host


Slide 7

Slide 7 text

モンストの大まかな構成
 ● クエスト外用のサーバー(app)
 ○ 普通のHTTPサーバー
 ● クエスト内用のサーバー(TURN)
 ○ ホスト─ゲスト間でクエストの進行状況を同期する
 app
 TURN
 guest
 host


Slide 8

Slide 8 text

STUN/TURNとは


Slide 9

Slide 9 text

理想
 ● ホストとゲストが直接やりとりできると嬉しい!
 guest
 host
 guest
 guest


Slide 10

Slide 10 text

現実
 ● 多くの場合直接通信はできない
 guest
 host
 guest
 guest
 N
 A
 T
 N
 A
 T
 N
 A
 T
 N
 A
 T
 ホストどこ…?


Slide 11

Slide 11 text

Session Traversal Utilities for NAT (STUN)
 ● RFC5389
 ● インターネット側から見たIPアドレス、ポートを取得するプロトコル
 ● 他の拡張と組み合わせて使う
 client
 STUN
 N
 A
 T
 僕のIPアドレスは? 203.0.113.45 です

Slide 12

Slide 12 text

Traversal Using Relays around NAT (TURN)
 ● RFC5766
 ● STUNの拡張
 ● 端末間の通信を仲介する
 ● UDP, TCP, TLS-over-TCPに対応
 client
 TURN
 N
 A
 T
 peer
 N
 A
 T


Slide 13

Slide 13 text

TURN Extensions for TCP Allocations
 ● RFC6062
 ● TURNでTCPを使うための拡張
 ● クライアントはサーバーと二種類のコネクションを張る
 ● モンストではこれを使う
 client
 TURN
 N
 A
 T
 peer
 N
 A
 T


Slide 14

Slide 14 text

モンストでのTURNの使い方


Slide 15

Slide 15 text

サーバー構成のおさらい
 ● クライアント == ホスト
 ● ピア == ゲスト
 app
 TURN
 guest
 host
 peer
 client
 ==
 ==


Slide 16

Slide 16 text

TURNサーバーのDiscovery
 ● appサーバーからTURNのIPアドレスを取得
 ○ ロードバランシングも兼ねている
 ● DNSを使ったDiscoveryは行っていない
 ● ALTERNATE-SERVER も使っていない
 host
 app
 TURNはどこ?
 198.51.100.67:3478 か
 198.51.100.68:3478 をみてね


Slide 17

Slide 17 text

ホスト・ゲストのマッチングからゲーム開始まで
 ● ホストがTURNサーバーと接続
 ● TURNの情報をapp経由でゲストとやり取り
 ● ゲストがホストに接続できたらクエスト開始
 
 app
 TURN
 host
 guest


Slide 18

Slide 18 text

ホスト・ゲストのマッチングからゲーム開始まで
 ● ホストがTURNサーバーと接続
 ● TURNの情報をapp経由でゲストとやり取り
 ● ゲストがホストに接続できたらクエスト開始
 
 app
 TURN
 host
 guest
 ゲストは 198.51.100.67:12345
 に繋いでね
 どこに繋げば
 マルチできるの?


Slide 19

Slide 19 text

ホスト・ゲストのマッチングからゲーム開始まで
 ● ホストがTURNサーバーと接続
 ● TURNの情報をapp経由でゲストとやり取り
 ● ゲストがホストに接続できたらクエスト開始
 
 app
 TURN
 host
 guest


Slide 20

Slide 20 text

IPv6対応
 ● TURNのIPv4アドレスを受け取る
 ● IPv4アドレスから機械的にドメインを生成
 ● DNS64サーバーからIPv6アドレスを取得
 ● NAT64でIPv4に変換されてTURNに届く
 app
 TURNはどこ?
 198.51.100.67:3478 か
 198.51.100.68:3478 をみてね
 host


Slide 21

Slide 21 text

IPv6対応
 ● まずはTURNのIPv4アドレスを受け取る
 ● IPv4アドレスから機械的にドメインを生成
 ● DNS64サーバーからIPv6アドレスを取得
 ● NAT64でIPv4に変換されてTURNに届く
 198.51.100.67
 ↓
 ip-198-51-100-67.example.com
 host


Slide 22

Slide 22 text

IPv6対応
 ● まずはTURNのIPv4アドレスを受け取る
 ● IPv4アドレスから機械的にドメインを生成
 ● DNS64サーバーからIPv6アドレスを取得
 ● NAT64でIPv4に変換されてTURNに届く
 DNS64
 ip-198-51-100-67.example.com 
 AAAA
 64:ff9b::c633:6443
 host


Slide 23

Slide 23 text

IPv6対応
 ● まずはTURNのIPv4アドレスを受け取る
 ● IPv4アドレスから機械的にドメインを生成
 ● DNS64サーバーからIPv6アドレスを取得
 ● NAT64でIPv4に変換されてTURNに届く
 64:ff9b::c633:6443
 TURN
 NAT64
 198.51.100.67
 host


Slide 24

Slide 24 text

まとめ


Slide 25

Slide 25 text

まとめ
 ● クエスト内とクエスト外で仕組みが大きく違う
 ● ホスト─ゲスト間の通信はTURNサーバー経由
 ● IPv6対応はDNS64 + NAT64


Slide 26

Slide 26 text

おまけ


Slide 27

Slide 27 text

モンスターストライクスタジアム
 ● 最大4対4でクエストのクリア時間を競う
 ● TURNのコネクションは二種類
 ○ チーム内のホスト─ゲスト間の通信用
 ○ チーム同士のクエスト進行情報の共有用 ← new!
 TURN
 host
 guest
 TURN
 host
 guest
 TURN


Slide 28

Slide 28 text

大会での観戦用端末
 ● TURNのコネクションは三種類
 ○ チーム内のホスト─ゲスト間の通信用
 ○ チーム同士のクエスト進行情報の共有用
 ○ 観戦用端末へのクエスト情報同期用 ← new!
 TURN
 host
 guest
 TURN
 host
 guest
 TURN
 TURN
 TURN
 観戦用
 観戦用


Slide 29

Slide 29 text

ご清聴ありがとうございました