CSAサーバ プロトコル


2003年9月3日 CSA選手権LAN化計画担当 山田

目次

1. プロトコルの背景
2. 通信モデル
3. プロトコル
3.1. ログインとログアウト
3.2. 対局条件と対局の開始
3.2.1. 対局の一般情報
3.2.2. 対局の持時間情報
3.2.3. 対局の局面情報
3.3. 対局の合意
3.4. 指し手と意思表示
3.5. ログイン中のタイムライン
4. 選手権参加者の対応
5. TCP/IPによる1対1対局
6. ケーブル、コネクタ


1. プロトコルの背景

 本案は、直接的には、CSAが主催する世界コンピュータ将棋選手権をLAN上にて行うためのプロトコルを規定するものである。

 その一方、多くの多人数ゲームをインターネットを介して行うため、また、さまざまな持時間制のバリエーションを持たせるための拡張が可能な設計が行われている。これによって、多様な分野へのプロトコルの普及を促し、多くのソフトウェアにデファクト・スタンダードとして搭載されることを目指す。結果として、コンピュータ将棋の裾野が広がり、選手権参加者のプログラミング環境が整備されることを目標とする。

2. 通信モデル

 本プロトコルが想定するネットワーク環境は、ひとつの対局サーバに多数の対局クライアントがTCP/IP接続する形態である。サーバは中立の立場で、クライアント同士の対局を管理する審判の役割を果たす。

 最初に、クライアントがサーバにTCP接続することによって、各クライアントがサーバとのコネクションを確立する。サーバは何らかの方法によって、接続されたクライアント同士のマッチメイクを行い、対戦相手の名前その他の対局条件を通知するパケットを対象となる複数のクライアントへ送出する。直後に対局の開始となり、サーバはその時点から、最初に着手を行うクライアントの消費時間の計測を開始する。

 消費時間は、計測開始から、手番を握っているクライアントの指し手を表すパケットがサーバに到着した直後の時間となる。サーバは消費時間を計測し、時間切れか否かを判定するとともに、クライアントの指し手に従ってその局面を作成し、その着手がルールに合致しているか否か、また対局が終了したか否かの判定を行う。判定後、その指し手と消費時間、必要ならば判定結果を加えて両対局者に送信する。直後に、新たに手番を握ったクライアントの消費時間の計測を開始する。これを対局終了まで行う。対局終了後、クライアントとのコネクションを切断する。

 この通信モデルは、クライアントおよびサーバが仮想的に役割を演じる場合を含む。また、マッチメイクや対局条件の交渉を通信の中で行うようなケースは、ひとまず本案の対象外とする。

3. プロトコル

 コネクションの確立は常に、クライアントからサーバへのオープン要求によって開始される。オープン要求を受け付ける標準的なサーバ側のポート番号は、4081とする。

 コネクション確立後は、行単位の可読なコマンドのやりとりによって通信を行う。行末には常にLF(0x0a)の1バイトが記述されるものとする。

3.1. ログインとログアウト

 コネクション確立後、クライアントはサーバにログインする。対局を行うためには、クライアントは必ずログインしなければならない。ログインは原則としてクライアントからの、場合によってはサーバからのログアウトによって解消される。ログイン中、クライアントは複数の対局を繰り返し行うことができる。

 クライアントは、以下のコマンドでサーバにログインする。

LOGIN <username> <password>
ここで、<username> は空白を含まない32バイト以内のクライアントを識別するための文字列、<password> は空白を含まない32バイト以内の <username> に固有のパスワード文字列とする。パスワード認証が成功した場合、サーバは
LOGIN:<username> OK
というメッセージでログインの完了をクライアントに伝える。認証が失敗した場合は、
LOGIN:incorrect
というメッセージでログインの失敗を伝える。

 ログアウトは、クライアントが

LOGOUT
というコマンドを、対局が行われていない状態で送信することによって行う。サーバは、
LOGOUT:completed
というメッセージを返して、ログアウトが完了し通信が切断されたことを示す。また必要に応じて、クライアントからログアウトコマンドが送られなくても、サーバがクライアントのログアウトを強制的に行うことがある。

3.2. 対局条件と対局の開始

 ログイン後、クライアントはサーバによって対局の通知が行われるのを待つ。サーバはクライアントに、以下のようなメッセージで対局の開始を伝える。

BEGIN Game_Summary
Protocol_Version:1.0
Protocol_Mode:Server
Format:Shogi 1.0
Game_ID:20040505-CSA14-3-5-7
Name+:TANUKI
Name-:KITSUNE
Your_Turn:+
Rematch_On_Draw:NO
To_Move:+
BEGIN Time
Time_Unit:1sec
Total_Time:1500
Least_Time_Per_Move:1
END Time
BEGIN Position
Jishogi_Declaration:1.1
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
P2 * -HI *  *  *  *  * -KA *
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
P4 *  *  *  *  *  *  *  *  *
P5 *  *  *  *  *  *  *  *  *
P6 *  *  *  *  *  *  *  *  *
P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
P8 * +KA *  *  *  *  * +HI *
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
P+
P-
+
+2726FU,T12
-3334FU,T6
END Position
END Game_Summary
対局の情報は、BEGIN〜ENDによって階層構造で表現される。プロトコルのバージョンは将来のプロトコルの拡張のため、フォーマットは多くの競技への対応のために準備される。消費時間の書式は通算時間のほか、1手あたりの時間の定義、それらの併用その他をサポートする。局面の初期状態の表現はフォーマットに基づいて行われ、将棋の表現は次世代のCSAファイル形式に準ずる。必要に応じて、途中局面からの再開にも対応する。最後に、手番側のクライアントに指し手を要求するメッセージを送信し、そのクライアントの消費時間の計測を開始する。また、文字はすべて7ビットASCIIで表記し、大文字と小文字を明確に区別する。

3.2.1. 対局の一般情報

 開始する対局の情報は、'BEGIN Game_Summary' と書かれた行と、'END Game_Summary' と書かれた行の間に記述される。この情報のうち、持時間情報と局面情報については、この中の下部階層に記述され、その他一般情報についてはこの階層に記述される。以下、一般情報として表される情報について述べる。

Protocol_Version: (必須)

このプロトコルのバージョン番号を表す。バージョン番号は、このプロトコル全体の書式を規定する。

Protocol_Mode:(省略時はServer)

'Server' の場合は、サーバを経由する対局プロトコルであることを表す。'Direct' の場合は、対局者同士が直接指し手を送り合う1対1のプロトコルであることを表す。

Format: (必須)

このプロトコルの、種目に依存した情報の書式を識別する文字列を表す。具体的には、'BEGIN Position' の行で始まり、'END Position' の行で終わる階層の内部の書式と、指し手の表記方法を規定する。

Game_ID: (省略時は空文字列)

このゲームを識別するためのユニークな文字列を表す。

Name+, Name-: (必須)

先手、後手のプレイヤ名を表す。省略形として 'N+', 'N-'の表記を認める。

Your_Turn: (必須)

このメッセージを受け取るクライアントの手番を表す。したがって、このフィールドはクライアントごとに異なる。

Rematch_On_Draw: (省略時はNO)

このゲームの結果がドローであった場合に、自動的に再試合を行う場合はYES、そうでなければNOが記述される。

To_Move: (必須)

対局の開始直後に指し手を行う手番を示す。対局が途中局面からの再開である場合は、再開直後に指し手を行う手番を示すので、常に先手番が示されるとは限らない。

3.2.2. 対局の持時間情報

 開始する対局の持時間情報は、'BEGIN Time' と書かれた行と、'END Time' と書かれた行の間に記述され、対局者の持時間を表す。'Time' の階層に情報が書かれている場合は、全対局者が共通の持時間を用いる。手番ごとに個別の持時間を記述する場合は、それぞれ 'Time+', 'Time-' の階層に記述することによって区別し、'Time' の階層は省略される。

 Timeの階層が省略された場合、消費時間は計測されず、指し手は時間無制限となる。

 以下、この階層で用いられる表現について述べる。

Time_Unit: (省略時は1秒とする)

消費時間を計測する単位時間を示す。秒単位の数値を表す場合は 'sec', 分単位の数値を表す場合は 'min', ミリ秒単位は 'msec' の文字列を用いる。例えば最小単位が1分の場合、消費時間は1分ごとに記録され、秒単位以下の時間は切り捨てその他の適切な処理が行われる。

Least_Time_Per_Move: (省略時は0)

1手の着手に必ず記録される消費時間を単位時間で表現する。これが1秒である場合、少なくとも1手あたり1秒が消費される。

Time_Roundup: (省略時はNO)

YESの場合、単位時間未満の時間が切り上げて記録される。NOの場合は切り捨てられる。

以下、実際の時間を表記する表現について述べる。階層中には、以下のいずれかの表現がたかだか1つ含まれる。すべて省略された場合は、消費時間無制限とする。

Total_Time:

対局中の通算の持時間を単位時間で表す。通算の消費時間がこの数値以上になった場合は、時間切れとなる。

Byoyomi:

1手あたりの消費時間を単位時間で表す。1手の消費時間がこの数値以上になった場合は、時間切れとなる。

3.2.3. 対局の局面情報

 開始する対局の局面情報は、'BEGIN Position' と書かれた行と、'END Position' と書かれた行の間に記述され、初期状態の局面を表す。この階層の書式は、Formatに記述された文字列によって識別される。ここでは、将棋の書式についてのみ述べる。

 書式はCSAファイル形式に準拠した初期局面表記と指し手表記に一部変更を加えた形式からなる。指し手表記がない場合、対局は初期局面から開始される。指し手表記がある場合、初期局面と規定の持時間が与えられた状態から、表記された指し手がすでに完了しているものとし、そこから再開される。

 以下にCSAファイル形式からの変更点を示す。まず対局者名を表す情報については、対局の一般情報に移されたことにより、局面情報としては表記されない。したがってCSAファイル形式における 'N+','N-' は用いられない。次に書記局面表記は、必ず 'P1' - 'P9', 'P+','P-' で始まる各行によって表記され、'AL' は使用されない。持駒がないときは、持駒の表記は省略可能とする。さらに、日本将棋連盟ルールに基づく、入玉による勝利宣言ルールが採用されることを示す文字列 'Jishogi_Declaration:1.1'が追加されている。勝利宣言ルールを採用しない場合、この行を省略する。

3.3. 対局の合意

 クライアントは、サーバが示した対局条件に同意する場合は、

AGREE[ <GameID>]
(注:[]内は省略可能である事を示す。以下も同様。)

と書かれたコマンドを返す。<GameID>には、同意する対局条件中のGame_IDで示された文字列を記述し、その文字列が示す対局に同意したことを示す。省略された場合は、直前にサーバが送信した対局条件のGame_IDを指すものとする。対局するすべてのクライアントのAGREEコマンドが得られた場合、これをもって対局の合意が得られたとみなし、サーバは、

START:<GameID>
というメッセージを全クライアントに送信し、対局状態に移行を宣言するとともに、最初に指し手を行うクライアントの消費時間の計測を開始する。

 クライアントが、対局条件を拒絶する場合は、

REJECT[ <GameID>]
と書かれたコマンドを返す。<GameID>には、拒絶する対局条件中のGame_IDで示された文字列を記述し、その文字列が示す対局を拒絶したことを示す。省略された場合は、直前にサーバが送信した対局条件のGame_IDを指すものとする。対局するクライアントのうちのいずれかがREJECTコマンドを送信した場合、対局の合意が得られなかったとみなし、サーバは、
REJECT:<GameID> by <rejector>
というメッセージを送信し、<rejector>で示されたクライアントの対局拒絶により、サーバによる対局条件の送信が無効になったことを宣言し、対局条件送信前の状態に戻る。

3.4. 指し手と意思表示

 クライアントとサーバは、対局開始メッセージのFormatで定義されたフォーマットに準拠したメッセージによって指し手を表現する。ここでは、将棋の書式についてのみ述べる。本案で定義する指し手表現は、おおむねCSAファイル形式で定義されたものを使用する。

 クライアントは手番を握っているときに、一例として

+7776FU
という文字列を送信する。サーバはこの手を判定し、合法的であれば、
+7776FU,T12
と、カンマ付きの消費時間情報を添付し、対局する両方のクライアントに送信する。このパケットは対戦相手への指し手の通知、手を指したクライアントへの確認と判定結果の通知、双方への消費時間の通知を行うためのものである。

 サーバは千日手と禁手のチェックを行う。指し手によって千日手が成立した場合、サーバは

+6978KI,T2
#SENNICHITE
#DRAW
と、千日手であることを示す2行目の情報と、無勝負であることを示す3行目の情報を双方に送る。以後、このように勝敗情報を伴うパケットがサーバから送られると、同時にコネクションは切断される。
-8493OU,T2
#OUTE_SENNICHITE
#WIN(LOSE)
と、連続王手の千日手であることを示す2行目の情報と、勝敗を表す3行目の情報を双方に送る。言うまでもなく、勝敗情報は勝利した側と敗北した側で異なる。

 連続王手の千日手以外の不正な着手、もしくは不正な書式の指し手が送信された場合、サーバは、

+0031FU,T1
#ILLEGAL_MOVE
#WIN(LOSE)
のように返信する。不正な書式の場合、その内容のすべてを表示しないことがある。

 また、規定時間内に指し手が送信されなかった場合、サーバは着手を待つことなく、

#TIME_UP
#WIN(LOSE)
という情報を双方に送信する。

 これ以外の場合、対局は投了、勝利宣言のいずれかで終了する。投了の場合、

%TORYO
#RESIGN
#WIN(LOSE)
のようになる。一方、勝利宣言の条件を満たしている状態で勝利宣言を行う場合、
%KACHI
#JISHOGI
#WIN(LOSE)
のようになる。また、条件を満たしていない状態で勝利宣言が行われた場合、
%KACHI
#ILLEGAL_MOVE
#WIN(LOSE)
のように、禁手負けと同様に扱われる。

 その他、サーバは必要に応じて、

%CHUDAN
コマンドを送信し、対局の中断を宣言することがある。この場合、クライアントは自動的もしくは手動により、その時点からの再開が可能な状態で対局を中断する。

3.5. ログイン中のタイムライン

 クライアントがログイン中の、対局開始から終了までのタイムラインは以下の通りとなる。対局終了後は、ログイン状態が続く限りにおいて、繰り返し対局が可能である。

       machine1         server         machine2

 1                ←   [対局条件]   →
 2  AGREE aGAME   →                ←  AGREE aGAME
 3                ←  START:aGAME   →
 4                                  ← [指し手(初手)]
 5                ←  [確認&時間]   →
 6 [指し手(2手目)]→
 7                ←  [確認&時間]   →
 8                                  ←[指し手(3手目)]
 9                ←  [確認&時間]   →
…
        [投了]    →
                  ←[結果通知&終了] →
4. 選手権参加者の対応

 選手権参加者は最低限、対局の開始と自己の手番の解釈、指し手の送受信、送信する指し手の生成、受信する指し手と消費時間の解釈、指し手による内部状態の遷移をコンピュータが行えるよう、システムを開発しなければならない。

 一方、手番以外の対局条件の解釈を行うことは必須ではない。選手権での通常の対局は、すべて同一の条件で開始されるので、その条件で常に対局を開始できるようにすればよい。また中断された対局が再開される場合、対局条件によって中断局面までの指し手が送信されるが、その情報を解釈しなくても、再開時に何らかの作業によってその局面を再現できればよい。

5. TCP/IPによる1対1対局

 サーバ不在の状況での1対1対局プロトコルは別に定められる。

 選手権において、対局が1対1プロトコルにて行われた場合、対局者は対局後にCSA形式の棋譜ファイルを提出しなければならない。主催者側は、棋譜から対局の正当な勝敗結果を判断する。必要に応じて、対局中や対局終了時に審判員が判断を行うことがある。

6. ケーブル、コネクタ

 選手権は、10BASE-T Ethernetによって構築されたネットワークが用いられる。

 2台のコンピュータを直結する場合は、クロスケーブルを使用する。HUBを使う場合は、ストレートケーブルを使用する。