VRChatってどんなアーキテクチャなのか探ってみる(1)

VRChat ( https://www.vrchat.com/ ) がどんな仕組みで動いているのか気になったので少し調べてみました(無料サービスでユーザー間の音声通話のデータをどうさばいているのか、と)。
※なお、VRChatはデスクトップ版もあってVRヘッドセットが無くてもプレイできます。
 
以下、自分のFBへの投稿の転載。
 

1つめ

VRChatってどんな通信をしてるのか気になって軽く眺めてみたが、Wiresharkとかでパケットキャプチャすると、STUN(NAT越えの時とかに使うサーバの名前だったりなんだり)のパケットが流れてるし、サーバっぽくないマシンとUDPのパケットのやりとしたりしてるので、ユーザ間はNAT越えでP2P通信をしている感じがする。
 
WindowsのパフォーマンスモニタでVRChatのプロセスのコネクション(TCPのみ)とか眺めてても、server-xx-xx・・・ みたいなアドレス(運営のサーバくさい)との通信は最初はあるがしばらくすると無くなったりしてたし。
 
WebRTCとか使ってるのかなあ。もしくは、ただSTUNサーバとか使ってNAT越えするところまでやってる?(STUNってWebRTCだけで使われる仕様じゃないよね?)
 
gyazo.com


 

2つめ

VRChatの仕組みを調べてみようその2。
 <1つ目の投稿へのリンク>
 
↑の投稿に続いて、VRChatがUPnPでルータのポートを開けに行ってないかパケットキャプチャしてみた。
で、結果としては、確実にUPnPでポートを空けると(私が)知っているソフトウェアの出してるパケットと異なり、自分の存在を advertise するようなメッセージはLAN内でブロードキャスト(かな)してるようだが、その後のルータへの notify (空けてくれやってメッセージだと思うのだけど)が無いので、どっちとも分からないという結果でした。
 前に使っていたルータはUPnPでポート開けるとルータのログにそれが記録されたのだけど、最近新しくしたものは、そのログを出さないようで、よう分らんかった。
 
話は変わって、前回の投稿でもコメント欄に貼ったのですが、もう5年前の投稿ですが、ver0.2.0のリリースノートが↓で、
 
www.reddit.com

 
どうも、改めて読むと、この時点ではユーザが今でいうワールドに対応するものをホストして、そのリストは運営側?で管理するか、もしくはホストしているユーザが登録して、他のユーザはリストにあるIPに接続しに行くというような作りだったみたい。
 
この初期の設計の話を踏まえて、昨日、WiresharkUDPパケットをキャプチャして眺めていた結果を考えてみると、ワールドに10を超えるユーザがいるのに、UDPで、VRChatに関するデータだろうと思われる通信をしているのは一つのホストとだけだったりしました(たまに別のホストと通信してるとかはあったかもだけど)。
WiresharkではCLASSIC-STUNと分類されるUDPパケットがあって、それはいろんなホストにrequestして、responseが来るってなことはしていた
 
さらに、VRChatの開発者コミュニティ用の掲示板?のようなものを見ると以下のような投稿がありました。
 
vrchat.canny.io

 
まだ、ちゃんと読んでいないのですが、要は複数のマシン(ホストと書くとややこしいのでここだけ表現を変えています)で一つのワールド(のインスタンス)をホストしたら、これこれの問題が解決されるんじゃね?という提案のようです。
 
で、以上のことを踏まえると、UPnPで穴開けてるかは確実ではないけれど、グローバルIPで外部からアクセス可能になっている状態のマシン(普通のユーザの使っているマシン)を、運営鯖が何らかの基準で選択して、ワールド(の1つのインスタンス)をホストさせて、他のユーザはワールド固有の情報(マップやら造形の情報等々)を運営鯖からダウンロードさせた上で、そこに接続しに行かせる。それらのユーザは、音声チャットや、各ユーザの移動、アバターの変更などのデータはワールド(のインスタンス)をホストしているサーバ経由で受け取ると。
 
そんな作りになっているんじゃないかな、と推測しました。
 
音声もしゃべってなければ、そのための通信は発生しないし(喋っているユーザは喋っていることを表す表示が行われるので、喋っているかいないかを判定していることは間違いない)、ユーザの位置関係によって音声が聞こえる聞こえないとかもあるので、それによって、同じワールドにいたとしても、音声を中継する相手を絞ることも可能なはず。
 
ホストしてるマシンが突然VRChatを終了させてしまったとしても、他のユーザが当該マシンがホストしていたワールドにいたのであれば、他のユーザがどこにいたかとかは知っているはずなので、"新しくホストしてくれるマシン"を運営が割り当てたら、ワールドにいたユーザが持っている情報を元にほぼ完全な形で前サーバがホストしていた状態に復旧?できるはず。(ホストしているマシンの離脱により、0人になったらどっちにしろ復旧する必要が無いので問題なし)
 
まあ、考え方としては、MSに買収された後、いくらか経ってアーキテクチャが変わってしまう(しまった)前のSkypeが採用していたスーパーノードという考え方と近いのではないかと。
 
と、いい加減な根拠で推測してみましたが、実際のとこどうなんでしょうねー。