システムは独立した2つのプロセス(civgs-logincivgs-gamebrowser)と、別途起動が必要なIRCサーバー(civgs-ircd)から成ります。2つのプロセスは互いに独立して動作しており、共有しているのはコードだけで、プロセス間通信は一切行いません。civgs-ircdが起動していないと、Civ4クライアントはログイン処理を完了できずフリーズしてしまいます。

サーバー構成

Civ4クライアントcivgs-loginTCP 29900・29901civgs-gamebrowserTCP 28910UDP 27900・27901civgs-ircdTCP 6667ログイン・検索部屋一覧・NAT越え在席確認プロセス間通信なし(コードのみ共有)
Civ4クライアントは civgs-login・civgs-gamebrowser・civgs-ircd という3つの独立したプロセスにそれぞれ接続する。civgs-loginとcivgs-gamebrowserはコードを共有するだけで、プロセス間通信は行わない。
プロセスポート役割対応するGameSpyドメイン
civgs-loginTCP 29900ログイン(GP presence)gpcm.gamespy.com
civgs-loginTCP 29901ユーザー検索(GP search)gpsp.gamespy.com
civgs-gamebrowserTCP 28910部屋一覧(ServerBrowser)<エディション>.ms*.gamespy.com
civgs-gamebrowserUDP 27900ホストのハートビート(QR)同上
civgs-gamebrowserUDP 27901NAT越え(NATNEG)natneg1〜3.gamespy.com
civgs-ircdTCP 6667在席確認・チャット(peerchat)peerchat.gamespy.com

通信シーケンス(部屋参加〜NAT越え)

ホストが部屋を作成してから、参加者が直接通信を始めるまでの流れは次の通りです。

ホストサーバー(civgs-gamebrowser)参加者部屋を作成(QR開始・UDP 27900)部屋一覧取得(TCP 28910)一覧を返す参加を選択→NATNEG開始INIT(UDP 27901)CONNECT ×2CONNECT_ACKREPORT / REPORT_ACK直接通信開始(UDP 2056・サーバーを介さない)
部屋参加からNAT越え(NATNEG)の4回のやり取りを経て、ホストと参加者が直接通信を始めるまでの流れ。NATNEG成立後はサーバーを経由しない。
  1. ホストが部屋を作成すると、civgs-gamebrowserへのハートビート(QR、UDP 27900)が始まる
  2. 参加者が部屋一覧を取得する(TCP 28910)
  3. 参加者が部屋への参加を選ぶと、NAT越え(NATNEG)処理が始まる
  4. ホスト・参加者の双方からcivgs-gamebrowserINITを送る(UDP 27901)
  5. サーバーは両者の通信先アドレスへCONNECTを能動的に送信する(それぞれ2回ずつ)
  6. 両者がサーバーへCONNECT_ACKを返す
  7. REPORTREPORT_ACKのやり取りが完了する
  8. ホストと参加者の間で直接通信が始まる(ゲームポート、UDP 2056。以降サーバーは経由しない)

各プレイヤー側でのポート開放が不要なのは、このNAT越え処理のおかげです。