システムコールと制御コマンド
ここでは、接続の確立、切り替え、切断の仕組みを概説します。上で述べたように、NCP はシステムコールを介してユーザープロセスと対話し、制御コマンドを介して他の NCP と対話します。したがって、まずシステムコールと制御コマンドの部分的な説明から始めます。
システムコールはオペレーティングシステムごとに異なるため、以下の説明はあくまで示唆的なものです。ここでは、プロセスがいくつかの入出力経路を持ち、それをポートと呼ぶと仮定します。各ポートはシーケンシャル I/O デバイスに接続されてよく、接続されている間は一方向にのみ情報を伝送します。さらに、伝送が進む間はプロセスがブロックされる (ディスミスされる、スリープさせられる) と仮定します。以下がシステムコールの一覧です:
Init <port>, <AEN 1>, <AEN 2>, <foreign socket>
where <port> is part of the process issuing the Init
_
<AEN 1> |
and +- are 8-bit AEN's (see Figure 2)
<AEN 2> |
_|
最初の AEN は接続を開始するために用いられ、2番目の AEN は接続が存在する間用いられます。
<foreign socket> は、接続の遠端の 40 ビットの socket 名です。
<AEN 1> と <AEN 2> の下位ビットは一致しなければならず、これらは <foreign socket> の下位ビットの補数でなければなりません。
NCP は <AEN 1> と <AEN 2> のそれぞれを、プロセスのユーザー番号およびホスト番号と連結して 40 ビットの socket を形成します。次に、遠端の NCP へ接続要求 (RFC) 制御コマンドを送信します。遠端の NCP が肯定的に応答すると、接続が確立され、プロセスのブロックが解除されます。遠端の NCP が否定的に応答すると、ローカル NCP は要求元プロセスのブロックを解除しますが、システムコールが失敗したことを通知します。
Listen <port>, <AEN 1>
ここで <port> と <AEN 1> は上記と同じです。NCP はポートと <AEN 1> を保持し、プロセスをブロックします。ローカル socket を指定する RFC 制御コマンドが到着すると、プロセスのブロックが解除され、外部プロセスが呼び出していることが通知されます。
Accept <AEN 2>
Listen が満たされた後、プロセスはその呼び出しを拒否するか、受け入れて別の socket へ切り替えることができます。呼び出しを受け入れるには、プロセスは Accept システムコールを発行します。次に NCP は RFC 制御コマンドを送り返します。
Close <port>
接続を確立した後、プロセスは接続を切断するために Close を発行します。Close は、呼び出しを拒否するために Listen の後にも発行されます。
Transmit <port>, <addr>
<port> が送信 socket に接続されている場合、<addr> は送信すべきメッセージを指します。このメッセージの前には、その長さがビット単位で置かれます。
<port> が受信 socket に接続されている場合、メッセージは <addr> に格納されます。メッセージの長さが最初に格納されます。
制御コマンド
ネットワーク制御プログラム間の通信のために、制御コマンドの語彙が定義されています。各制御コマンドは、その機能を示す 8 ビットのオペレーションコードと、それに続くいくつかのパラメータからなります。パラメータの数と形式はオペレーションコードごとに固定です。特定のホスト宛ての制御コマンドの並びは、単一の制御メッセージに詰め込むことができます。
RFC <my socket 1>, <my socket 2>.
<your socket>, (<link>)
このコマンドは、プロセスが Init システムコールまたは Accept システムコールのいずれかを実行したために送信されます。リンクは受信側となる側によって割り当てられるため、<my socket 1> が送信 socket である場合は省略されます。
接続を開始する (Init) ためと、呼び出しを受け入れる (Accept) ために同じコマンドを使用することには、明確な利点があります。応答するコマンドが開始するコマンドと異なる場合、2つのプロセスが互いを呼び出し、相手が応答するのを待ってブロックされたままになる可能性があります。この方式ではデッドロックは発生せず、プロセスの集合を接続するより簡潔な方法を提供します。
CLS <my socket>, <your socket>
指定された接続が終了されます。
CEASE <link>
受信プロセスが入力を到着と同じ速さで消費しない場合、受信側ホストのバッファ空間が待機中のメッセージを待ち行列に入れるために使用されます。一般に利用できる空間は限られているため、受信側ホストは、問題となっている接続上で送信側ホストがそれ以上メッセージを送信するのを抑制する必要があるかもしれません。送信側ホストがこのコマンドを受信すると、メッセージを生成しているプロセスをブロックする場合があります。
RESUME <link>
このコマンドも受信側ホストから送信側ホストへ送信され、以前の CEASE を打ち消します。