III. 環境
典型的なホストは、CPU をプロセスが共有するタイムシェアリングオペレーティングシステムを持つものと想定する。
プロセス
各プロセスにはユーザー番号が付けられていると想定する。同じユーザー番号を持つプロセスが複数存在してもよく、その場合、それらはすべてネットワークの使用に関して協調しているべきである。
各プロセスは、そのプロセスに固有のポートの集合を含んでいると想定する。これらのポートは、ファイル、デバイス、または他のプロセスから当該プロセスへの入力、あるいは当該プロセスからそれらへの出力に使われる。
また、各プロセスはごく短いメッセージ (数ビット) を受け取ることのできるイベントチャネルを持つと想定する。この機構は、プロセスの外部で何らかの動作が発生したことをプロセスに通知するために使う。
ネットワーク活動に参加するため、プロセスは自らのポートの一つにローカル socket を接続する。socket はユーザー番号、ホスト、AEN によって識別され、ユーザー番号が一致し同じホストにある場合、その socket はそのプロセスにとってローカルである。プロセスがローカル socket を参照するときには、AEN を指定するだけでよい。
各ポートは状態を持ち、それはシステムコールおよびプロセス外で並行して起こるイベントによって変更される。ポートの状態が変わるたびに、どのポートの状態が変わったかを示すイベントがイベントチャネルを通じてプロセスに送られる。プロセスはその後、ポートの状態を調べることができる。
これらの前提は、以下の説明的な記述で用いられる。ただし、これらの前提はネットワークプロトコルによって課されるものではなく、第 IV 節で示す実装も決して拘束力を持つものではない。
この記述は、実装上の困難がどのようなものであり得るかについての手がかりを与えるためだけに示すものであり、特定の規律を課すためのものではないことを、はっきりさせておきたい。
たとえば、我々は接続されていないローカル socket 宛てに到着した <RFC> を正当なものとして扱い、キューに入れる。望むなら、NCP は Meyer が提案するようにそれらを拒否してもよいし、しばらく保持して、すぐに満たされなければ拒否してもよい。提示するプロトコルはこれらすべての選択肢をサポートする。
もう一つのローカルな選択肢は、前述した、一つの socket に複数のポートを接続することである。我々は一対一対応を示したが、これは無視してもよい。同様に、システムコールも示唆にすぎない。
システムコール
以下は、ユーザープロセスが実行し得る典型的なシステムコールである。これらは網羅性のために示すにすぎない。各サイトは間違いなく、都合のよい何らかの同等の集合を実装するであろう。
次の記法を用いる。
Syscall ( arg , arg ...; val ... )
1 2 1
ここで
-
Syscall はシステムコールである。
-
arg₁ などは呼び出しとともに渡されるパラメータである。
-
val₁ などはシステムコールが返す値である。
Init (P,AEN,FS,Bsiz;C)
-
P: プロセスのポートを指定する。
-
AEN: ローカル socket を指定する。このプロセスのユーザー番号とこのホストのホスト番号は暗黙に含まれる。
-
FS: 任意のホストにある、任意のユーザー番号、任意の AEN を持つ socket を指定する。
-
Bsiz: ユーザーがメッセージのバッファリングに充てたい記憶域の量をビット単位で指定する。
-
C: 返される条件コード。
Init は、AEN で指定されたローカル socket をポート P に接続し、socket FS との接続を開始しようとする。C として返され得る値は次のとおりである。
-
C = ok: Init は正当であり、socket FS に接触中である。接続が確立されたとき、または FS が拒否したとき、プロセスはイベントを受け取る。
-
C = busy: ローカル socket は、このプロセスまたは同じユーザー番号を持つ他のプロセスのポートによって使用中であった。何も行われなかった。
-
C = homosex: AEN と FS が、どちらも送信 socket であるか、どちらも受信 socket であった。
-
C = nohost: FS 内で指定されたホストが既知でない。
-
C = bufbig: Bsiz が大きすぎる。
Listen (P,AEN,Bsize;C)
-
P: プロセスのポートを指定する。
-
AEN: ローカル socket を指定する。
-
Bsiz: バッファサイズを指定する。
-
C: 返される正当性コード。
C のコードは次のとおりである。
C = ok
C = busy
C = bufbig
AEN で指定されたローカル socket が P に接続される。待機中の呼び出しがあればそれが処理され、なければ何も行われない。呼び出しが来ると接続が確立され、イベントによってプロセスに通知される。
Close (P)
P はプロセスのポートを指定する。
あらゆる活動が停止され、ポートは他の用途のために解放される。
Transmit (P,M,L1;L2,C)
-
P: 開いている接続を持つポートを指定する。
-
M: 送信するテキスト。
-
L1: テキストの長さを指定する。
-
L2: 実際に送信された長さ。
-
C: エラーコード。
ポートの両側にあるプロセス間で送信が行われる。
C のコードは次のとおりである。
C = ok
または
- C = not open: 現在開いている接続がなく、かつそれ以外に抑止されていない場合
Status (P;C)
ポート P の状態が C として返される。