HIPCでは、何らかの通信路を通してサーバーとクライアントがメッセージを送り合うことで通信が行われる。 通信には開始と終了があり、開始から終了までの一連のメッセージが1つのセッションを形成する。 HIPCプロトコルは、これらのメッセージとセッションについて定めている。
HIPCでは、ユーザーは書式に従ったコンフィギュレーションファイルを作成することで、構成を作成出来る。 HIPCプロトコルに従った通信では、出来上がった構成に含まれる以下の情報を利用する。
ユーザーが作成する構成は、ユーザーが定めた複数の構造体型の定義を含むことが出来る。 そして、HIPCではこらら構造体型の変数のサーバーにおけるメモリイメージを通信に利用する。 HIPCではこの構造体のイメージを構造体データと呼ぶ。 構造体データは、(struno, offset, rngsize)という3つの値から成るタプルにより、どの構造体型のどの範囲であるかが示される。 HIPCではこのタプルを構造体タプルと呼ぶ。
strunoは"structure number"を短縮した表記で、構造体型番号である。複数あるかもしれない構造体型のうち、どの構造体型であるかを示す。
offsetは構造体の先頭とメモリイメージの先頭とのオフセットバイト数である。
rngsizeは"range size"を短縮した表記で、メモリイメージに対応する構造体の範囲のバイト数であり、これはメモリイメージのサイズでもある。
メモリイメージは複数のメンバーを含んでも良い。 例えば、offsetが0でrngsizeが構造体サイズのタプルは、全てのメンバーを含んだ構造体全体を示す。
HIPCメッセージはヘッダとボディから成るバイト列である。 メッセージには種類があり、クライアントが送るものとサーバーが送るものに分類される。 具体的には以下の通りである。
セッションの開始はクライアントのHELLOメッセージである。 サーバーはHELLOメッセージを受け取るといくつかのSYSTEMメッセージを返す。
全てのSYSTEMメッセージが送られた後は、構成で定められた構造体型のデータが、 リクエスト(GETまたはPUTメッセージ)とレスポンス(SUCCESSメッセージ)の組、 もしくはCASTメッセージを通して送受信される。
セッションの終了はサーバーからのQUITメッセージである。 QUITメッセージは、クライアントのセッション終了要求(BYEメッセージ)に対して、 または、エラーが発生した場合に送られる。
HIPCメッセージは、ヘッダとボディから成る。
4バイトのバイト列である。
0バイト以上255バイト以下のバイト列である。 ボディの意味はヘッダによって決まる。
メッセージヘッダのバイト0は常にメッセージタイプを示す。 以下メッセージタイプ毎に以下の情報を示す。
HELLOメッセージは、クライアントからサーバーへのセッション開始の要求である。
ヘッダは以下の値を取る。
メッセージボディは構成IDである。
BYEメッセージは、クライアントからサーバーへのセッション終了の要求ある。
ヘッダの値は固定されている。
BYEメッセージに、メッセージボディはない。ボディサイズは常に0であ
GETメッセージは、クライアントからサーバーへの構造体データの要求ある。
ヘッダバイト1から3は構造体タプルに対応する。
GETメッセージに、メッセージボディはない。ボディサイズは常に0である。
PUTメッセージは、クライアントからサーバーへの構造体データの送付と、その処理要求である。
ヘッダバイト1から3は構造体タプルに対応する。
メッセージボディは、構造体データである。
SUCCESSメッセージは、クライアントの要求が正常に処理されたことを示すサーバーからの返答である。
SUCCESSレスポンスは2種類がある。
このSUCCESSメッセージにメッセージボディはない。ボディサイズは常に0である。
ヘッダの値は固定されている。
このSUCCESSメッセージのメッセージボディは、構造体データである。
ヘッダバイト1から3は構造体タプルに対応する。
CASTメッセージは、サーバーからクライアントへの一方的な構造体データの送付である。
ヘッダバイト1から3は構造体タプルに対応する。
メッセージボディは、構造体データである。
QUITメッセージは、サーバーからクライアントへのセッション終了の通知である。
ヘッダは以下の値を取る。
メッセージボディはエラー詳細文字列である。
SYSTEMメッセージは、サーバーからクライアントへ送られるHIPCの通信に必要となる基礎的データを運ぶメッセージである。
ヘッダバイト2の値によって、以下のように異なるデータを表す。
ヘッダは、サーバーマシンのエンディアンとユーザーが定義した構造体型の数を表す。
ボディは、各構造体型のサイズを表す。 ボディの1バイトが構造体型1つのサイズに対応し、構造体型番号昇順で並んでいる。
ヘッダは、構造体型番号とその構造体型に定義されているメンバの数を表す。
ボディは各メンバの構造体先頭からのオフセットを表す。 ボディの1バイトがメンバ1つのオフセットに対応し、並びは構成で定義された順である。
ヘッダは、構造体型番号とその構造体型に定義されているメンバの数を表す。
ボディは各メンバのサイズを表す。 ボディの1バイトがメンバ1つのサイズに対応し、並びは構成で定義された順である。
クライアントのHELLOメッセージをサーバーに送ることで、セッションは開始される。 サーバーはこの直後から、セッションを終了させるためにQUITメッセージを送って良い。
サーバーはHELLOメッセージに含まれる構成IDが、サーバーの受け入れ対象であるか確認する。 対象でない場合は、QUITメッセージが送られてセッションは終了する。 対象である場合は、構成によって予め定められた数のSYSTEMメッセージがサーバーからクライアントに送られる。
全てのSYSTEMメッセージが送られた後は、 リクエストとレスポンスの組、もしくはCASTメッセージによって、構造体データがやり取りされる。
全てのSYSTEMメッセージを送信した後、サーバーはCASTメッセージを随時クライアントへ送って良い。
全てのSYSTEMメッセージを受信した後、クライアントはリスエスとをサーバーに送って良い。 リクエストはGETメッセージまたはPUTメッセージである。
リクエストを受け取ったサーバーはレスポンスを返す。 サーバーは、リクエストの処理に成功すると、レスポンスとしてSUCCESSメッセージを返す。
リクエストの処理に失敗した場合、サーバーはQUITメッセージを返す。この場合、セッションは終了となる。
サーバーはセッション開始後(HELLOメッセージの後)いつでもQUITメッセージを送って良い。 QUITメッセージの送信と受信をもってセッションは終了となる。
クライアントからセッションを終わらせる場合はBYEメッセージををサーバーに送る。 BYEメッセージを受け取るとサーバーはQUITメッセージを返す。
< HELLO[07 ff 00 05] 43 46 47 49 44
> SYS[02 6c 00 02] 09 04
> SYS[02 00 01 02] 00 01
> SYS[02 00 02 02] 01 08
> SYS[02 01 01 02] 00 02
> SYS[02 01 02 02] 02 01
< GET[04 00 00 01]
> SUCCESS[01 00 00 01] 00
< PUT[05 00 00 09] 02 01 00 00 00 00 00 00 00
> SUCCESS[01 ff 00 00]
> CAST[03 01 00 04] 01 00 01 00
< PUT[05 00 00 09] 00 00 00 00 00 00 00 00 00
> CAST[03 01 00 04] 02 00 00 00
> SUCCESS[01 ff 00 00]
< BYE[06 ff 00 00]
> QUIT[00 ff 00 00]
<
はクライアントからサーバーへ、>
はサーバーからクライアントへのメッセージである。四角括弧[]
で囲まれた部分がヘッダでそれに続く部分がボディである。数値は全て16進数表示である。
以下のサイズや個数は、HIPCヘッダ内で1バイトで表現されるため、最大値が255となる。
なお、構造体データの最大サイズが255なので、通常の使い方では構造体タプルのオフセットバイト数は254までが利用される。 また、同じ理由から、構造体タプルのオフセットバイト数と範囲バイト数の合計値も通常の使い方では255までとなる。(offset+rngsize <= 255)
GETメッセージ以外のメッセージはヘッダのバイト3がボディサイズを表す点が共通している。
また、SYSTEM以外のメッセージは、構造体に関するメッセージとそうでないメッセージに大別され、それぞれ以下のような共通した構造を持っている。
GET、PUT、CAST、データ付きSUCCESSの4つのメッセージのヘッダは、全て構造体タプルを持つ。 この中でGETを除く3つのボディは構造体データとなっている。
HELLO、BYE、QUIT、データ無しSUCCESSのメッセージのヘッダでは、バイト1が全て255となっている。 また、これらのメッセージのボディは全く無いか、構造のない単なるバイト列となっている。
構造体タプルではヘッダバイト1が構造体型番号に相当し、有効な構造体型番号は0から254までである。 よって、ヘッダバイト1が0から254ならそのヘッダは構造体タプルを表していて、255ならそうでないということになる。 このことにより、データ無しのSUCCESSメッセージはとデータ付きのSUCCESSメッセージは、バイト1によって明確に区別できるようになっている。
Last modified: 2015/07/27 08:00:59 +09:00