システムは独立した2つのプロセス(civgs-login・civgs-gamebrowser)と、別途起動が必要なIRCサーバー(civgs-ircd)から成ります。2つのプロセスは互いに独立して動作しており、共有しているのはコードだけで、プロセス間通信は一切行いません。civgs-ircdが起動していないと、Civ4クライアントはログイン処理を完了できずフリーズしてしまいます。
サーバー構成
| プロセス | ポート | 役割 | 対応するGameSpyドメイン |
|---|---|---|---|
civgs-login | TCP 29900 | ログイン(GP presence) | gpcm.gamespy.com |
civgs-login | TCP 29901 | ユーザー検索(GP search) | gpsp.gamespy.com |
civgs-gamebrowser | TCP 28910 | 部屋一覧(ServerBrowser) | <エディション>.ms*.gamespy.com 等 |
civgs-gamebrowser | UDP 27900 | ホストのハートビート(QR) | 同上 |
civgs-gamebrowser | UDP 27901 | NAT越え(NATNEG) | natneg1〜3.gamespy.com |
civgs-ircd | TCP 6667 | 在席確認・チャット(peerchat) | peerchat.gamespy.com |
通信シーケンス(部屋参加〜NAT越え)
ホストが部屋を作成してから、参加者が直接通信を始めるまでの流れは次の通りです。
- ホストが部屋を作成すると、
civgs-gamebrowserへのハートビート(QR、UDP 27900)が始まる - 参加者が部屋一覧を取得する(TCP 28910)
- 参加者が部屋への参加を選ぶと、NAT越え(NATNEG)処理が始まる
- ホスト・参加者の双方から
civgs-gamebrowserへINITを送る(UDP 27901) - サーバーは両者の通信先アドレスへ
CONNECTを能動的に送信する(それぞれ2回ずつ) - 両者がサーバーへ
CONNECT_ACKを返す REPORT・REPORT_ACKのやり取りが完了する- ホストと参加者の間で直接通信が始まる(ゲームポート、UDP 2056。以降サーバーは経由しない)
各プレイヤー側でのポート開放が不要なのは、このNAT越え処理のおかげです。