構築や調査の過程を記録しています。
このブログについて
Civilization IV のマルチプレイは、GameSpyのサービス終了後、有志によるロビーサーバーの実装によって続けられています。このブログでは、その一つとなる Civ4 Internet Lobbyプロジェクトに取り組む中で分かったことや直したこと等を記録していきます。 扱う予定のテーマ: GameSpyプロトコルの構造 NAT越え(NATNEG)の仕組み 運用上気づいた点
構築や調査の過程を記録しています。
Civilization IV のマルチプレイは、GameSpyのサービス終了後、有志によるロビーサーバーの実装によって続けられています。このブログでは、その一つとなる Civ4 Internet Lobbyプロジェクトに取り組む中で分かったことや直したこと等を記録していきます。 扱う予定のテーマ: GameSpyプロトコルの構造 NAT越え(NATNEG)の仕組み 運用上気づいた点
GameSpy終了後の仕組み オープンソースプロジェクトである pylobby は、Civilization IV のマルチプレイ・ロビー機能が依存していた GameSpy SDK のマスターサーバー群を、ゼロから再実装したものである。GameSpy は2010年代にオンラインサービス事業を終了しており、公式のロビーサーバー(gpcm.gamespy.com 等)はすでに存在しない。Civ4 クライアント側のプロトコル実装は変更できないため、クライアントが「GameSpy のサーバーだ」と信じて話しかけてくる相手を、自前サーバー上に用意するというアプローチを取っている。具体的には、Civ4 クライアントの hosts ファイルで gpcm.gamespy.com 等のホスト名を自前サーバーの IP に向け、そこで pylobby をベースにしたサーバー実装(本プロジェクト「Civ4 Internet Lobby」)を稼働させている。 GameSpy終了後のなりすまし構成かつてCiv4クライアントは実在するGameSpyのマスターサーバー群と通信していたが、GameSpyサービス終了後はhostsファイルでホスト名を自前サーバーのIPに向けることで、クライアントを改造せずにCiv4 Internet Lobbyへ通信させている。かつて現在(Civ4 Internet Lobby)Civ4 クライアントGameSpy マスターサーバー群(gpcm.gamespy.com 等)2010年代にサービス終了・現存せずCiv4 クライアント(無改造)hosts ファイルで書き換えgpcm.gamespy.com → 自前サーバーCiv4 Internet LobbyGameSpyになりすまして応答クライアント側の実装は変更せず、通信先だけをhostsファイルで自前サーバーへ差し替えている。 Civ4 Internet Lobbyの構成 pylobby は GameSpy Presence(ログイン)とサーバーブラウザ(部屋一覧)を実装したものだが、NAT 越え(NATNEG)機能は含まれていなかった。Civ4 Internet Lobbyでは pylobby のコードをベースに、NATNEG サーバーを新規実装として追加し、実機検証を通じてプロトコルの確定仕様に合わせ込んだ。 ...
システムは独立した2つのプロセス(civgs-login・civgs-gamebrowser)と、別途起動が必要なIRCサーバー(civgs-ircd)から成ります。2つのプロセスは互いに独立して動作しており、共有しているのはコードだけで、プロセス間通信は一切行いません。civgs-ircdが起動していないと、Civ4クライアントはログイン処理を完了できずフリーズしてしまいます。 サーバー構成 Civ4クライアント civgs-login TCP 29900・29901 civgs-gamebrowser TCP 28910 UDP 27900・27901 civgs-ircd TCP 6667 ログイン・検索 部屋一覧・NAT越え 在席確認 プロセス間通信なし (コードのみ共有) Civ4クライアントは civgs-login・civgs-gamebrowser・civgs-ircd という3つの独立したプロセスにそれぞれ接続する。civgs-loginとcivgs-gamebrowserはコードを共有するだけで、プロセス間通信は行わない。 プロセス ポート 役割 対応する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越え) ホストが部屋を作成してから、参加者が直接通信を始めるまでの流れは次の通りです。 ...
この通信は何のためにあるのか Civ4のマルチプレイでロビーにログインする際、クライアントは裏側で複数のGameSpy系サーバーと順番に通信している。その中の1つがpeerchat.gamespy.com(TCP 6667)で、これは目に見えるチャット機能ではなく、ログイン処理の一部として必須のハンドシェイクである。クライアントは接続直後にCRYPTという拡張コマンドを送り、サーバーからの暗号チャレンジ応答(705)を待つ。この一往復が成立しないと、クライアントはロビー画面にたどり着けない。 ログイン処理内でのIRCハンドシェイクの位置づけCiv4クライアントはGameSpy Presence認証に続けてpeerchat/IRC(TCP 6667)へ接続しCRYPTコマンドを送る。705応答が返ればロビー画面へ進み、応答がなければ無応答のままフリーズする。Civ4 クライアントGameSpy Presence認証(TCP 29900・ログイン)IRCハンドシェイク(peerchat, TCP 6667)CRYPTコマンド → 705応答を待つ705応答あり→ ロビー画面へ(civgs-ircdが正常稼働)705応答なし→ 無応答のままフリーズ(標準IRCサーバー等)peerchat(TCP 6667)でのCRYPTハンドシェイクが成立しないと、クライアントはエラーも出さずに無応答のままフリーズする。 なぜ普通のIRCサーバーでは動かないのか 一般的なIRCサーバー実装(標準のminiircd本家など)は、GameSpy独自のCRYPTコマンドを理解しない。この場合に起きることは2通りある。 ...