この通信は何のためにあるのか

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通りある。

  • そもそも接続できない場合: クライアントはログイン自体を取り消し、「サーバー接続不能: ゲーム検索サーバーと接続できませんでした」という分かりやすいエラーを表示する。
  • 接続はできるがCRYPTに応答が返らない場合: エラーメッセージが一切出ないまま、クライアントが無応答でフリーズする。

後者が厄介なのは、原因がひと目で分からないことである。Civ4 Internet Lobbyでは、CRYPT/705応答とciv4/civ4bts/civ4btsjp用の暗号レイヤーを実装したZulan/miniircdフォークをcivgs-ircdとして稼働させることで、この問題を解決している。

標準IRCサーバーとcivgs-ircdでのCRYPTハンドシェイクの違い標準のIRCサーバーはGameSpy独自のCRYPTコマンドに応答できず無応答のままフリーズするが、civgs-ircd(Zulanフォーク)はCRYPTコマンドに705応答を返しログイン処理が続行する。標準IRCサーバーの場合civgs-ircd(対応フォーク)の場合Civ4 クライアント標準IRCサーバーCRYPT des 1 civ4btsCRYPTを理解できない応答なし(705が返らない)無応答のままフリーズCiv4 クライアントcivgs-ircdCRYPT des 1 civ4bts705(暗号チャレンジ応答)ログイン処理を続行→ ロビー画面へ
標準のIRCサーバーはGameSpy独自のCRYPTコマンドに応答できずフリーズの原因になるが、civgs-ircd(Zulanフォーク)はこれに対応しているため正常にログインできる。

「部屋に参加できない」原因ではない

もう一つ、誤解されやすい点がある。このTCP 6667通信は、部屋への参加処理そのものとは無関係である。実際のパケットキャプチャでは、参加時のUDP 2056ハンドシェイクが完了してから38秒も経ってから、ようやく6667の通信が発生していることが確認できている。6667は参加とは独立した、buddy/chat presenceのための定期的なバックグラウンド処理である。

UDP 2056の参加ハンドシェイクとTCP 6667の時間差実測では、部屋参加時のUDP 2056ハンドシェイク完了から約38秒後にTCP 6667のIRC通信が発生しており、両者は独立した処理であることを示している。時間UDP 2056参加ハンドシェイク完了TCP 6667IRC通信開始約38秒後(実測)6667の通信は参加のトリガーではない
6667のIRC通信は参加のトリガーではなく、独立したバックグラウンド処理であることが実測で確認できている。

つまり、部屋に参加できない・NAT越えがうまくいかないといった症状の原因を探すときは、この6667通信は切り分けて考えてよい(NAT越えの仕組みについてはシステム全体像と通信シーケンスを参照)。逆に、ロビー画面にそもそも入れない・ログイン中にフリーズするという症状であれば、この6667のハンドシェイクが疑わしい候補になる。

そのようなときは、稼働状況・お知らせページを確認してほしい。ログイン(civgs-login)・ゲームブラウザ(civgs-gamebrowser)と並んで「IRC(civgs-ircd)」の行があり、緑色の「● 稼働中」であれば、このハンドシェイクを処理するサーバー側の準備はできている。ここが赤色の「● 停止中」になっている場合は、サーバー側の問題(このページで解説したcivgs-ircdの停止)が原因である可能性が高い。「● 稼働中」なのにフリーズする場合は、別の原因を疑う必要がある。