この通信は何のためにあるのか
Civ4のマルチプレイでロビーにログインする際、クライアントは裏側で複数のGameSpy系サーバーと順番に通信している。その中の1つがpeerchat.gamespy.com(TCP 6667)で、これは目に見えるチャット機能ではなく、ログイン処理の一部として必須のハンドシェイクである。クライアントは接続直後にCRYPTという拡張コマンドを送り、サーバーからの暗号チャレンジ応答(705)を待つ。この一往復が成立しないと、クライアントはロビー画面にたどり着けない。
なぜ普通のIRCサーバーでは動かないのか
一般的なIRCサーバー実装(標準のminiircd本家など)は、GameSpy独自のCRYPTコマンドを理解しない。この場合に起きることは2通りある。
- そもそも接続できない場合: クライアントはログイン自体を取り消し、「サーバー接続不能: ゲーム検索サーバーと接続できませんでした」という分かりやすいエラーを表示する。
- 接続はできるが
CRYPTに応答が返らない場合: エラーメッセージが一切出ないまま、クライアントが無応答でフリーズする。
後者が厄介なのは、原因がひと目で分からないことである。Civ4 Internet Lobbyでは、CRYPT/705応答とciv4/civ4bts/civ4btsjp用の暗号レイヤーを実装したZulan/miniircdフォークをcivgs-ircdとして稼働させることで、この問題を解決している。
「部屋に参加できない」原因ではない
もう一つ、誤解されやすい点がある。このTCP 6667通信は、部屋への参加処理そのものとは無関係である。実際のパケットキャプチャでは、参加時のUDP 2056ハンドシェイクが完了してから38秒も経ってから、ようやく6667の通信が発生していることが確認できている。6667は参加とは独立した、buddy/chat presenceのための定期的なバックグラウンド処理である。
つまり、部屋に参加できない・NAT越えがうまくいかないといった症状の原因を探すときは、この6667通信は切り分けて考えてよい(NAT越えの仕組みについてはシステム全体像と通信シーケンスを参照)。逆に、ロビー画面にそもそも入れない・ログイン中にフリーズするという症状であれば、この6667のハンドシェイクが疑わしい候補になる。
そのようなときは、稼働状況・お知らせページを確認してほしい。ログイン(civgs-login)・ゲームブラウザ(civgs-gamebrowser)と並んで「IRC(civgs-ircd)」の行があり、緑色の「● 稼働中」であれば、このハンドシェイクを処理するサーバー側の準備はできている。ここが赤色の「● 停止中」になっている場合は、サーバー側の問題(このページで解説したcivgs-ircdの停止)が原因である可能性が高い。「● 稼働中」なのにフリーズする場合は、別の原因を疑う必要がある。