備忘録

備忘録

Photonの生パケットを読む

f:id:kagasu:20170521183308p:plain

Ⅰ. はじめに

1. Photon とは

クロスプラットフォームで動作する「ネットワークエンジン」です。
ドイツのベンチャー企業「Exit Games」が開発しています。

クラウド(SaaS)」と「オンプレミス」が選択できます。
アジアリージョンのクラウドGMOが独占して提供しています。

サーバは Windows Server のみで動作します

2. 仕組み

Photon には「ネームサーバ」と「マスタサーバ」と「ゲームサーバ」が存在します。
※この記事では「ネームサーバ」について触れません。
「マスタサーバ」は「ゲームサーバ」のインスタンスの状態を全て監視します。
負荷状態等をもとにユーザーをどの「ゲームサーバ」に割り当てて通信させるか最適な選択を行います。

Ⅱ. マスタサーバの生パケットを読む

詳しいことはこちらに書いてあるようです。

英語
https://doc.photonengine.com/en-us/onpremise/current/reference/binary-protocol
日本語
https://doc.photonengine.com/ja-jp/onpremise/current/reference/binary-protocol

重要な部分だけをメモ。

1. 赤色の枠で囲んでいる部分を見つける

f:id:kagasu:20170521191036p:plain
画像の場合 0x04 0xF3 0x02 です。

# 意味
1バイト目 データ送信(受信)回数
2バイト目 0xF3固定
3バイト目 不明。0x01~0x10の場合が多い

2. 緑色の枠で囲んでいる部分を見つける

f:id:kagasu:20170521191138p:plain
画像の場合 0xE1 です。
この部分は 「OperationCode」 を意味しています。
0xE1 を 10進数表記すると 225 です。
以下のリファレンスから 225 は OperationCode.JoinRandomGame であることが解ります。
https://photonengine.jp/pun-api/class_exit_games_1_1_client_1_1_photon_1_1_operation_code.html

3. オレンジ色の枠で囲んでいる部分を見つける

f:id:kagasu:20170521191346p:plain
画像の場合 0x00 0x04 です。
この部分は「パラメータが何個あるか」を意味しています。
0x00 0x04の場合4個です。

4. 水色の枠で囲んでいる部分を見つける

f:id:kagasu:20170521191551p:plain
画像の場合 0xD5 です。
この部分は「ParameterCode」を意味しています。
0xD5 を 10進数表記すると 213 です。
以下のリファレンスから 213 は ParameterCode.LobbyName であることが解ります。
https://photonengine.jp/pun-api/class_exit_games_1_1_client_1_1_photon_1_1_parameter_code.html

5. ピンク色の枠で囲んでいる部分を見つける

画像の場合 0x73 です。
f:id:kagasu:20170521192000p:plain
この部分は「GpType」を意味しています。
0x73 を 10進数表記すると 115 です。
GpType は 逆コンパイラを用いて調べます。
以下の表から 115 は GpType.String であることが解ります。

GpType 値(10進数)
Array 121
Boolean 111
Byte 98
ByteArray 120
ObjectArray 122
Short 107
Float 102
Dictionary 68
Double 100
Hashtable 104
Integer 105
IntegerArray 110
Long 108
String 115
StringArray 97
Custom 99
Null 42
EventData 101
OperationRequest 113
OperationResponse 112

6. 茶色の枠で囲んでいる部分を見つける

f:id:kagasu:20170521192910p:plain
画像の場合 0x00 0x01 です。
この部分は「長さ」を意味しています。
0x00 0x01 の場合1バイトです。

5 の項目が GpType.String だったので、String型で1バイトということが解ります。

7. 紫色の枠で囲んでいる部分を見つける

f:id:kagasu:20170521193148p:plain
画像の場合 0x31 です。
この部分は「データの値」を意味しています。
5 の項目が GpType.String だったので、0x31はASCII文字コード表より'A'であることが解ります。

8. これ以降は同様にします。

留意点
・ParameterCode の Enum に含まれてない値が出てきた。
Photon マスタサーバに対する独自の拡張です。
Photon Server (On-Premises) を利用している場合は独自の拡張が可能となります。

・GpType.String は最大 0xFFFF バイトです。
・GpType.ByteArrayは最大 0xFFFFFFFF バイトです。

Ⅲ. ゲームサーバの生パケットを読む

こちらを使います。
WiresharkLua スクリプを読み込むだけです。
https://github.com/AltspaceVR/wireshark-photon-dissector