CSAサーバ プロトコル

2004年10月20日 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. ケーブル、コネクタ
7. プロトコル改定履歴

1. プロトコルの背景

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

2. 通信モデル

 本プロトコルが想定するネットワーク環境は、ひとつの対局サーバに多数の対局クライアントがTCP/IP接続する形態である。
サーバは中立の立場で、クライアント同士の対局を管理する審判の役割を果たす。
 最初に、クライアントがサーバにTCP接続することによって、各クライアントがサーバとのコネクションを確立する。サーバは何らかの方法によって、接続されたクライアント同士のマッチメイクを行い、対戦相手の名前その他の対局条件を通知する
パケットを対象となる複数のクライアントへ送出する。直後に対局の開始となり、サーバはその時点から、最初に着手を行うクライアントの消費時間の計測を開始する。
 消費時間は、計測開始から、手番を握っているクライアントの指し手を表すパケットがサーバに到着した直後の時間となる。
サーバは消費時間を計測し、時間切れか否かを判定するとともに、クライアントの指し手に従ってその局面を作成し、その着手がルールに合致しているか否か、また対局が終了したか否かの判定を行う。判定後、その指し手と消費時間、必要ならば判定結果を加えて両対局者に送信する。直後に、新たに手番を握ったクライアントの消費時間の計測を開始する。これを対局終了まで行う。対局終了後、クライアントとのコネクションを切断する。
 この通信モデルは、クライアントおよびサーバが仮想的に役割を演じる場合を含む。また、マッチメイクや対局条件の交渉を通信の中で行うようなケースは、ひとまず本案の対象外とする。

3. プロトコル

 コネクションの確立は常に、クライアントからサーバへのオープン要求によって開始される。オープン要求を受け付ける標準的なサーバ側のポート番号は、4081とする。
 コネクション確立後は、行単位の可読なコマンドのやりとりによって通信を行う。コマンド文字列は常に、LF(ラインフィード文字、ASCIIコード0x0a)、空白文字(' '、ASCIIコード0x20)およびASCIIコード0x21〜0x7fをもつ7ビットASCII文字列とし、大文字と小文字を明確に区別する。行末には常にLFが記述されるものとする。タブ文字は使用できない。また、複数の文字列をひとつの空白として使ってはならない。

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

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

LOGIN <username> <password>

ここで、<username> は 数字('0'-'9')、英大文字('A'-'Z')、英小文字('a'-'z')、アンダースコア('_')、ハイフン('-')のいずれかの文字を用いた32バイト以内のクライアントを識別するための文字列、<password> は空白を含まない32バイト以内の<username> に固有のパスワード文字列とする。パスワード認証が成功した場合、サーバは

LOGIN:<username> OK

というメッセージでログインの完了をクライアントに伝える。
ログイン後、クライアントは対局待ちの状態となる。認証が失敗した場合は、

LOGIN:incorrect

というメッセージでログインの失敗を伝える。
 ログアウトは、クライアントが

LOGOUT

というコマンドを、対局待ち状態で送信することによって行う。
サーバは、

LOGOUT:completed

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

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

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

BEGIN Game_Summary
Protocol_Version:1.1
Protocol_Mode:Server
Format:Shogi 1.0
Declaration:Jishogi 1.1
Game_ID:20060505-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
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ファイル形式に準ずる。必要に応じて、途中局面からの再開にも対応する。最後に、手番側のクライアントに指し手を要求するメッセージを送信し、そのクライアントの消費時間の計測を開始する。

3.2.1. 対局の一般情報

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

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

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

Format: (必須)
このプロトコルの、種目に依存した情報の書式を識別する文字列を表す。具体的には、'BEGIN Position' の行で始まり、'END Position' の行で終わる階層の内部の書式と、指し手の表記方法、および 'Declaration:' の行に記述された情報の意味内容を規定する。
 ここでは、将棋に関する記述についてのみ述べる。
'Shogi 1.0' となっている場合、このプロトコルにおいて規定された将棋のゲームをプレイすることを意味する。

Declaration: (省略時は情報なし)
ゲームのプレイ時、指し手以外の宣言に関する規定を示す文字列を表す。情報の意味は、Formatに記述された文字列に依存する。
 'Jishogi 1.1' の記述がある場合、日本将棋連盟ルールに基づく、入玉による勝利宣言ルールが採用されることを示す。
現状では、この記述のみ許可されている。

Game_ID: (省略時は空文字列)
このゲームを識別するためのユニークな文字列を表す。

Name+, Name-: (必須)
先手、後手のプレイヤ名を表す。

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

Rematch_On_Draw: (省略時はNO)
このゲームの結果がドローであった場合に、自動的に再試合を行う場合はYES、ゲームを終了する場合はNOが記述される。
現時点では、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:
対局中の通算の持時間を単位時間で表す。通算の消費時間がこの数値以上になった場合は、時間切れとなる。この記述が省略された場合、1局通算での時間制限は課せられない。

Byoyomi:
1手あたりの消費時間を単位時間で表す。1手の消費時間がこの数値以上になった場合は、時間切れとなる。この記述が省略された場合、1手単位での時間制限は課せられない。

3.2.3. 対局の局面情報

 開始する対局の局面情報は、'BEGIN Position' と書かれた行と、'END Position' と書かれた行の間に記述され、初期状態の局面を表す。この階層の書式は、Formatに記述された文字列によって識別される。ここでは、将棋の書式についてのみ述べる。
 書式はCSAファイル形式に準拠した初期局面表記と指し手表記に一部変更を加えた形式からなる。指し手表記がない場合、対局は初期局面から開始される。指し手表記がある場合、初期局面と規定の持時間が与えられた状態から、表記された指し手がすでに完了しているものとし、そこから再開される。
 以下にCSAファイル形式からの変更点を示す。まず対局者名を表す情報については、対局の一般情報に移されたことにより、局面情報としては表記されない。したがってCSAファイル形式における 'N+','N-' は用いられない。次に書記局面表記は、必ず 'P1' - 'P9', 'P+','P-' で始まる各行によって表記され、'AL' は使用されない。
持駒がないときは、持駒の表記は省略可能とする。

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

と、カンマ付きの消費時間情報を添付し、対局する両方のクライアントに送信する。このパケットは対戦相手への指し手の通知、手を指したクライアントへの確認と判定結果の通知、双方への消費時間の通知を行うためのものである。
 投了、千日手ほか、対局の終了もしくは中断に至る何らかの事象が発生した場合、サーバは '#' で始まる文字列を2行続けて送信し、何らかの事象の発生を通知する。事象発生後、双方のクライアントは対局待ち状態に戻る。まず、サーバは千日手と禁手のチェックを行う。指し手によって連続王手でない千日手が成立した場合、サーバは

+6978KI,T2
#SENNICHITE
#DRAW

と、通常の指し手および消費時間に加え、その手によって千日手が成立したことを示す2行目の情報と、無勝負であることを示す3行目の情報の計3行を双方に送る。
 連続王手の千日手が成立した場合、サーバは

-8493OU,T2
#OUTE_SENNICHITE
#WIN(LOSE)

と、通常の指し手および消費時間に加え、その手によって連続王手の千日手が成立したことを示す2行目の情報と、勝敗を表す3行目の情報の計3行を双方に送る。以後、このように無勝負以外の勝敗情報が送られる場合、その内容は勝利した側と敗北した側で異なる。
 連続王手の千日手以外の不正な着手、もしくは不正な書式の指し手が送信された場合、サーバは、

+0031FU,T1
#ILLEGAL_MOVE
#WIN(LOSE)

と、通常の指し手および消費時間に加え、その手が不正な指し手であることを示す2行目の情報と、勝敗を表す3行目の情報の計3行を双方に送る。不正な書式の指し手が送られた場合、その内容のすべてを表示しないことがある。Formatが 'Shogi 1.0'である場合、不正な書式の指し手文字列は、文字列の先頭7文字から使用可能な文字のみが切り出されて送信される。
 また、規定時間内に指し手が送信されなかった場合、サーバは着手を待つことなく、

#TIME_UP
#WIN(LOSE)

という2行の情報を双方に送信する。
 これ以外の場合、対局はクライアントによる投了もしくは勝利宣言のいずれかで終了する。クライアントは、投了する場合、自らの手番において、

%TORYO

という文字列をサーバに送信する。サーバは、これを受信した場合、対局する双方のクライアントに、

%TORYO,T4
#RESIGN
#WIN(LOSE)

と、投了を示す文字列および文字列送信までの消費時間に加え、投了が行われたことを示す2行目の情報と、勝敗を表す3行目の情報の計3行を双方に送る。
 一方、勝利宣言の条件を満たしている状態でクライアントが勝利宣言を行う場合、クライアントは自らの手番において、

%KACHI

という文字列をサーバに送信する。サーバは、これを受信したとき、条件が満たされている場合には、対局する双方のクライアントに、

%KACHI,T8
#JISHOGI
#WIN(LOSE)

と、勝利宣言を示す文字列および文字列送信までの消費時間に加え、勝利宣言によって対局が終了したことを示す2行目の情報と、勝敗を表す3行目の情報の計3行を双方に送る。また条件を満たしていない場合には、この宣言を不正な着手と同様に取り扱い、

%KACHI,T8
#ILLEGAL_MOVE
#WIN(LOSE)

という3行のメッセージを送信する。
 その他、サーバは必要に応じて、

#CHUDAN

というメッセージを送信し、対局の中断を宣言することがある。
この場合、クライアントは自動的もしくは手動により、その時点からの再開が可能な状態で対局を中断する。
 一方クライアントは、一定の状況のもとで、サーバに対局の中断を要請するため、

%CHUDAN

というメッセージを送ることができる。これを受け、サーバは対局の中断を宣言することがあるが、状況によってはこのメッセージを送ったクライアントを反則負けとして扱う。
クライアントによる中断要請の是非は、現状ではプロトコルの外部において規定されるものとし、このプロトコルでは規定を設けない。
 またクライアントは対局中、手番にかかわらず、長さゼロの文字列、もしくはLF1文字のみをサーバに送信することができる。
サーバは前者を受け取った場合、単純に無視する。後者を受け取った場合、短い待ち時間の後にLF1文字のみをそのクライアントに返信する。クライアントは、これらの送信を頻繁に行ってはならない。
具体的には、当該クライアントからの何らかの文字列をサーバが受信してから30秒を経ずして同一のクライアントからこれらの送信を行ってはならない。クライアントがこの規定に反した場合、サーバは当該クライアントを反則負けとして扱うことができる。

 対局終了後、クライアントは、ログイン直後の状態に復帰する。

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を使う場合は、ストレートケーブルを使用する。

7. プロトコル改定履歴

●2003年 9月 3日 V1.0

●2004年10月20日 V1.1
V1.0 からの変更点
・ログイン時の<username>に記号は認めないように。
・対局者名の表記は、混乱を防止するため、'N+', 'N-'の表記を中止し、Name+, Name-だけに。
・入玉による勝利宣言ルール
 対局の局面情報から対局の一般情報へ移動し、Declaration:で宣言するように。
・クライアントからの中断 '%CHUDAN' を条件付きで可能に。
・ログイン直後のクライアントの状態を「対局待ち状態」という表現に統一し、それに関する表現を微調整した。
・対局終了後、コネクションは切断されず、対局待ち状態に戻るようになった。同時に、対局終了時の数箇所の表現を微調整。
・以上の変更に合わせ、Protocol_Versionを 1.0 から 1.1 に。

以上