UNIX Client-Server Program Interface, UCSPI-1996 Copyright 1996 D. J. Bernstein, djb@pobox.com 1. 序論 この文書はクライアント・サーバ通信ツールへのコマンドライン・インターフェ イスである UNIX Client-Server Program Interface、UCSPI (「うーくすぱい」 と発音)に関して記述する。 UCSPI にはいくつかの利点がある。第一に、UCSPI インターフェイスは下層の 通信媒体から独立している。UCSPI アプリケーションはインターネットが IPv4 から IPv6 にアップグレードしても再コンパイルされる必要さえない。第二に、 UCSPI はシェル・スクリプトがネットワーキングを利用できるようにする。第 三に、UCSPI クライアントとサーバはローカルとリモートのアドレスを示す環 境変数を慣習的に設定する。そのため、その情報はアプリケーションとユーザ にすぐに使える。 一般的な UCSPI フレームワークをここに示す。UCSPI ツールは通信媒体との 会話を理解するプログラムである。それは二つの記述子を設定し、UCSPI アプ リケーションを呼び出す。UCSPI アプリケーションは片方の記述子から読み込 み、他方の記述子へ書き出すことができる。どの通信媒体も信頼できる双方向 全二重ストリーム通信(厳密には順序付けられているが、時間的なものとは限 らない)を提供する。ある種の媒体は例えば、expedited (``out-of-band'') 伝送のような他の種類の通信手段を提供する。そこではストリームがもはや順 序付けられていない。しかし、多くの UCSPI アプリケーションは媒体から独 立していて、そのような特徴に依存しない。 2. ツール UCSPI ツールは実行可能プログラムである。次のような一般的形式でコマンド ラインを受け付ける。 [tool] [options] [address] [application] ここで、[tool]はツールの名前、[options]は 0 個以上のオプション引数、 [address]はプロトコル固有のアドレス、[application]は各接続に対して 起動されるユーザ指定のプログラムである。 [options]は getopt 標準により処理される。それで、-- の引数は[options] を終りを示す。[tool]は標準エラーに出力する情報を制御する三つのオプショ ンをサポートする。 -v 全てのメッセージを出力する -Q 全てのエラーメッセージを出力する; 成功の場合はメッセージを出力しない -q どんな場合でもメッセージを出力しない デフォルトは -Q である。後に表れた引数は前に表れた引数より優先される。 [tool]はもっと多くのオプションをサポートする。 [application]は execvp() の使用法に従った一つ以上の引数から成る。 [tool]はこれらの引数にどんな文字が表れても、そのまま全ての[application] の引数に渡す。 [tool]は[application]を実行する前には常に、第3節に記述するようにファイ ル記述子を変え、第4節に記述するように環境変数を変える。 [tool]は[application]を実行する前に fork することもあり、無視されてい るシグナルをリセットすることもある。これ以外に、[tool]は[application] を実行する前にはプロセスの状態を変えない。 [tool]は開始時に特定の記述子がオープンされているかクローズされているか は仮定しない。[tool]はそれ自身をバックグランド実行させない。また制御端 末から切り離そうともしない。 [tool]がその機能を果たせなければ、非 0 コードで終了する。 3. クライアントとサーバ UCSPI ツールには二種類ある。クライアントとサーバだ。 UCSPI クライアントは記述子 6 と 7 を閉じ、[address]のサーバに接続する。 接続すると、接続からの読み出し用記述子 6 と 書き出し用記述子 7 を伴い、 [application]を起動させる。クライアントはこれ以外の接続をしない。 [application]が死んだ時にクライアントは死ぬ。[application]が 0 コード で終了したときに限り、クライアントは 0 コードで終了する。 UCSPI サーバは記述子 0 と 1 を閉じ、[address]へ接続してくるクライアン トを待つ。接続を受け付けると、接続からの読み出し用記述子 0 と書き出し 用記述子 1 を伴い、[application]を起動させる。その間も、そしてその後も、 [address]への接続を受け付け続ける。サーバは SIGTERM シグナルを受け取る と、コード 0 で終了する。これは接続中のものには影響を与えない。 4. プロトコル 各 UCSPI ツールはプロトコルというものをサポートする。プロトコル定義は 次の三つの情報を提供する。プロトコル名、[address]の形式と意味、ツール により設定される環境変数。 プロトコル名は一文字以上の英数字の列である。プロトコル名の割り当てにつ いての情報は第5節を見なさい。 プロトコル定義では[address]に渡される引数の個数と各引数の許される形式 を必ず述べる。それはツールにより使われている下層の通信媒体も述べ、その 媒体での[address]の解釈を与える。 各ツールは[application]に対して以下の環境変数を渡す。 サポートされるプロトコル名 PROTO=[PROTO]、 プロトコル定義で述べられた [PROTO]LOCAL で始まる 0 個以上の変数、 プロトコル定義で述べられた [PROTO]REMOTE で始まる 0 個以上の変数。 クライアントでは、[PROTO]LOCAL 変数群はクライアントの情報を示し、 サーバでは逆に、[PROTO]REMOTE 変数群はサーバの情報を示す。 プロトコル定義は状況によっては設定されない環境変数を明示してもよい。そ れらの変数は UCSPI ツールの開始時に設定されるかも知れない。そうであれ ば、そのまま渡さずに、設定を解除しなければならない。 プロトコルの定義はクライアントとサーバに対して以下のようなより多くの仕 様を定めてもよい。サポートされるオプション、fork する動作、[application] に渡される記述子の性質。 5. プロトコル管理 公開されたプロトコル定義は私のところに登録してもよい。私は名前空間の問 題の理由で登録要求を断るかもしれないが、その場合、私は受け入れられる代 わりの名前を提案するでしょう。 x で始まるプロトコル名は自身のプロトコルを定義したい組織へと分割される でしょう。X で始まるプロトコル名は実験目的のために予約されている。