VIII. 入力インタプリタのアルゴリズム
以下は、到着したネットワークコマンドに対する NCP の応答を簡潔に記述したものである。CS は常に接続状態(Connection State)を表す。なお、CLOSE はローカルのユーザプロセスが実行するシステムコールであり、CLS はネットワークコマンドである。
NOP
破棄する。
RFC (RTS or STR)
エントリが存在しなければ、ステータス = PENDING CALL としてエントリを作成し、メッセージをキューイングする。
CS = LISTENING であれば、エントリをキューイングし、RFC-RCVD 状態に入り、ユーザに要求を通知する。
CS = RFC-SENT であるが新たな RFC が要求と一致しない場合は、その RFC を拒否する。
それ以外のすべての場合は、RFC が一致するかを検査する。一致するものがなければ、RFC をキューイングする。RFC が一致する場合は、次のとおりとする。
- CS = RFC-SENT の場合、OPEN 状態に入る。
- CS = CLS-WAIT の場合、RFC は無視される。
- それ以外の場合、要求がすでに受信済みであることを示すすべての状態において、その要求は不正である(それらの状態は 1,3,4,6,8,9 である)。
いずれの場合も、RFC の処理によってオーバーフロー状態(資源の枯渇)が生じる場合は、接続を拒否する(CLS を送る)。
CLS
保留中の呼び出しキューが検索される。CLS が現在の要求とは一致しないが他の要求と一致する場合は、その要求を削除して CLS を発行する。一致するものがなければ、CLS は無視される。
CLS が現在の要求と一致し、かつ CS が次の値である場合:
- PENDING の場合、現在の要求を削除する。要求キューが空であればエントリを削除し、そうでなければエントリはそのままにしておく。
- RFC-RCVD の場合、CLS を発行し、ABORT 状態に入る。
- ABORT の場合、無視する。
- RFC-SENT の場合、CLS を発行する。保留中の呼び出しキューが空であればエントリを削除し、そうでなければ PENDING 状態に入る。
- OPEN の場合、我々が受信側にあれば、応答は RFC-SENT の場合と同じである。我々が送信側にあれば、データキューをクリアし、RFNM がまだ保留中であれば RFNM-WAIT 状態に入る。そうでなければ、応答は RFC-SENT の場合と同じである。
- CLS-WAIT の場合、CLS を発行し、保留中の呼び出しキューが空であればエントリを削除し、そうでなければ CS = PENDING とする。
- DATA-WAIT の場合、データキューをクリアし、RFNM-WAIT 状態に入る。一致する CLS が CLOSED 状態または LISTENING 状態で発生することはない。
ERR
エラーはシステムプログラマが後で対処できるようキューイングされ、そのやり取りを発したホストにおけるシステムエラーとみなされる。(どの状態にも関連付けられない。)
ECO
オペコードを ERP に変更して再送信する(どの状態にも関連付けられない)。
ERP
ERP を受信すると、システムはコマンドのテキストを、ECO を発行したプロセスに返す。
INR, INS
これらのコマンドは OPEN 状態でのみ有効である。INTERRUPT を受信すると、システムは関連するプロセスに事象を送らせる。INTERRUPT は CLS-WAIT、DATA-WAIT、RFNM-WAIT の各状態では無視される。それ以外の状態ではエラーである。
ALL
ALLOCATE は OPEN 状態でのみ有効であり、送信ソケットに対してのみ送ることができる。NCP は、関連するランデブーテーブルエントリの 'Their Size' フィールドを、ALLOCATE コマンドで指定された大きさだけ増やす。
CLS-WAIT 状態と DATA-WAIT 状態ではこのコマンドは無視され、それ以外の状態ではエラーである。
Data-RFNM
OPEN 状態にある場合は、該当するランデブーテーブルエントリのフロー制御ステータスフィールドを RFNM-RECVD とマークし、必要であればさらにデータを送信する。
DATA-WAIT 状態にある場合は、フロー制御ステータスを維持する。データキューが空であれば CLS を発行して CLS-WAIT 状態に入り、そうでなければ次のメッセージを送信する。
RFNM-WAIT 状態にある場合は、フロー制御ステータスを維持し、CLS を発行する。保留中の呼び出しキューが空であればランデブーテーブルエントリを削除し、そうでなければ CS = PENDING とする。
それ以外のすべての状態では、Data-RFNM はエラーである。