この通信は何のためにあるのか
Civ4のマルチプレイでロビーに入るとき、クライアントが最初に話しかける相手がcivgs-loginである。GameSpyは、かつて多くのPCゲームのマルチプレイを支えていたオンラインサービスである。その中で、アカウントの作成、ログイン認証、ユーザーの検索、フレンドの管理といった「誰がオンラインにいるか」を扱う部分が**GameSpy Presence(以下、GP)**で、ロビーへの入り口にあたる。本物のGameSpyではgpcm.gamespy.comとgpsp.gamespy.comがこれを受け持っていた。hostsファイルでこの2つの名前をロビーサーバーに向けることで、civgs-loginが代わりに応答している。
| ポート | 役割 |
|---|---|
| TCP 29900 | アカウント作成・ログイン認証 |
| TCP 29901 | ユーザー検索 |
ログインは、パスワードそのものをネットワークに流さないチャレンジ・レスポンス方式で行われる。クライアントが接続すると、サーバーが確認用のデータ(チャレンジ)を送ってくる。クライアントはこれを元にパスワードから計算した値を返し、サーバーも同じ計算をして、一致すれば認証成功となる。
ログイン後、クライアントは続けて29901にTCP接続を張り、さらに、ログイン処理の一部として必須のチャット系の通信であるpeerchat/IRC(TCP 6667)のハンドシェイクへ進む。ここまで通ってはじめて、ロビー画面に到達する。
認証で何を確認しているのか
サーバーはログイン要求を受け取ると、次の3段階で確認する。どこで落ちても、理由を添えたエラーが返る。失敗してもサーバーは接続を切らない。
ニックネームには、使える文字と長さに制限がある。半角英数字が基本で、日本語などは使えない。
アカウントの情報はサーバー側に保存される。ロビーのパスワードは、他のサービスと使い回さず、ロビー専用のものを設定してほしい。
29901は「つなぐだけ」でも必要
29901(gpsp.gamespy.com)は、ユーザー検索のためのポートである。サーバー側の処理は簡素で、実質的にはほとんど使われない。それでも待ち受けは必須で、その理由はバディ(フレンド)機能にある。
バディ(フレンド)機能とは、ゲーム内で相手をフレンドとして登録し、オンラインかどうかを確認したりメッセージを送ったりする、GameSpyの機能である。フレンドを追加する操作をすると、クライアントは相手を探すために29901へ接続する。**このポートにTCP接続が張れないと、クライアントは自分から切断してしまう。**Civ4 Internet Lobbyでは、フレンド機能そのものは本格的には動いておらず、追加してもフレンドリストとして保存はされないが、接続を受け付けることだけは欠かせない。
「部屋に参加できない」原因ではない
civgs-loginが受け持つのは、「誰であるか」の確認までである。部屋の一覧や参加の処理は、別のプロセスであるcivgs-gamebrowserの役割になる。この2つはコードを共有しているだけで、プロセス間の通信は一切ない。ゲームブラウザの側はログイン済みかどうかを参照しないし、対戦中のデータもロビーサーバーを通らない。
したがって、ログインが済んでロビー画面まで入れているのに部屋を作れない、見えない、参加できないという場合は、この29900・29901は切り分けから外してよい。部屋の一覧や参加を扱うゲームブラウザの通信(部屋を登録するQRと、一覧を取得するSB)については、部屋の登録・一覧取得のゲームブラウザ通信(QR/SB、TCP 28910・UDP 27900)についてにまとめている。全体の位置づけはシステム全体像と通信シーケンスを参照してほしい。
症状から見る切り分け
プレイする側が確認できることを、症状ごとにまとめる。
- アカウント作成・ログインの画面にすら進めない: hostsファイルの設定がロビーサーバーに向いていない可能性が高い。参加方法の手順どおりに設定できているかを確認し、書き換えたあとはCiv4を再起動する。
- hostsを設定したのにアカウント作成でエラーになる: まず稼働状況・お知らせでログインの状態を確認する。「● 稼働中」なら、パソコンのウイルス対策ソフトやファイアウォールが通信を遮断していないかを確認する。それでも直らないときは、サーバー側の問題の可能性があるので掲示板に報告してほしい。
- ログインで「アカウントが存在しない」と返される: そのニックネームのアカウントがまだ作られていない。綴りの違いも含めて確認する。
- ログインで「パスワードが違う」と返される: 大文字・小文字も含めてパスワードを確認する。
- ログインは成功したが、直後にエラーが出る、またはエラーも出ずにフリーズする: この記事で説明したログイン自体は成功していて、その次の段階のpeerchat/IRC(TCP 6667)の通信で止まっている可能性が高い。稼働状況ページのIRCの行が「● 停止中」なら、サーバー側の問題なので復旧を待つ。「● 稼働中」のままなら、掲示板に報告してほしい。
- フレンド(バディ)を追加する操作をしたら、ゲームが切断される: サーバー側の設定の問題である可能性が高い。プレイする側でできることは少ないので、掲示板に報告してほしい。
稼働状況ページでの確認
サーバー側の状態は、稼働状況・お知らせページで確認できる。ログイン(civgs-login)の行が緑色の「● 稼働中」であれば、29900・29901を処理するサーバー側の準備はできている。赤色の「● 停止中」になっている場合は、サーバー側の問題である可能性が高い。「● 稼働中」なのにログインできない場合は、hostsの設定や、通信経路(ファイアウォール等)を疑う必要がある。