IV. NCP
我々は、NCP が五つの構成プログラム、三つの連想テーブル、いくつかのキューとバッファ、そしてリンク割り当てテーブルを持つものと考える。もちろん各サイトは必要に応じてこの設計を変えるであろうから、我々の設計は例示にすぎない。
構成プログラム
1. 入力ハンドラ
これは割り込み駆動の入力ルーチンである。常駐バッファへの Imp-to-Host 転送を開始し、転送が完了すると入力インタプリタを起こす。
2. 出力ハンドラ
これは割り込み駆動の出力ルーチンである。常駐バッファからの Host-to-Imp 転送を開始し、転送が完了すると出力スケジューラを起こす。
3. 入力インタプリタ
このプログラムは、入力がユーザー宛ての通常メッセージか、制御メッセージか、Imp-to-Host メッセージか、エラーかを判定する。メッセージの種類ごとに、このプログラムは適切な処理を行う。
4. 出力スケジューラ
Imp には三種類のメッセージが送られる。
-
Host-to-Imp メッセージ
-
制御メッセージ
-
通常メッセージ
これらの種類の間には優先順位を設けるべきであると考える。我々が提案する優先順位は上記の順序である。出力スケジューラは最も優先順位の高いメッセージを選び、出力ハンドラに渡す。
5. システムコールインタプリタ
このプログラムはユーザーからの要求を解釈する。
興味深い二つの構成要素は、入力インタプリタとシステムコールインタプリタである。入力インタプリタが外部からの要求を処理し、システムコールインタプリタがローカルな要求を処理するという点で、両者は似ている。
連想テーブル
NCP のデータベースの大部分は三つの連想テーブルにあると想定する。「連想」とは、キーを与えられると、対応するエントリへのポインタを返して成功するか、キーに対応するエントリがなければ失敗する、何らかの検索ルーチンが存在することを意味する。
1. ランデブーテーブル
「接続要求」と接続のその他の属性はこのテーブルに保持される。このテーブルはローカル socket によってアクセスされるが、他のテーブルも既存のエントリへのポインタを持つ。
エントリの構成要素は次のとおりである。
-
ローカル socket (キー)
-
外部 socket
-
リンク
-
呼び出し元のキュー
-
テキストキュー
-
接続状態
-
フロー状態
-
接続されたポートへのポインタ
エントリは、ユーザーが Init または Listen のシステムコールを実行したとき、あるいは <RFC> を受信したときに作成される。接続が確立されるまで使われないフィールドもある。たとえば、ユーザーが Listen を行った場合、外部 socket は <RFC> が到着するまでわからない。
2. 入力リンクテーブル
入力インタプリタは外部ホストとリンクをキーとして使い、到着したリンクを使用している接続について、ランデブーテーブル内のエントリへのポインタを得る。
3. 出力リンクテーブル
RFNM を解釈するために、入力インタプリタは入力リンクテーブルと同じ形式で、送出リンクを用いるテーブルを必要とする。
リンク割り当てテーブル
これは、ホストごとにどのリンクが使用中かを追跡するごく単純な構造である。おそらくホストあたり 1 語で足りる。
次の図は、ネットワーク制御プログラムについての我々の構想である。箱はテーブルとバッファを表し、角が斜めに切られ底が二重になった箱はキューを表し、ぎざぎざの箱は構成プログラムを表し、矢印はデータ経路を表す。
略称の意味は次のとおりである。
-
ILT: 入力リンクテーブル
-
OLT: 出力リンクテーブル
-
LAT: リンク割り当てテーブル
-
RT: ランデブーテーブル
-
HIQ: Host から Imp へのキュー
-
OCCQ: 出力制御コマンドキュー
-
ORMQ: 出力通常メッセージキュー
-
IHBuf: 入力ハンドラが IMP からのデータで満たし、入力インタプリタが空にするバッファ
-
OHBuf: 出力スケジューラがキューから満たし、出力ハンドラが空にする送出メッセージのバッファ。
+---------+
| I M P |
+---------+
v ^
| |
+---------------------------|-----|------------------------------+
| | | |
| /\/\/\/\/\/\/\ | | /\/\/\/\/\/\/\ |
| \ / <--------+ +---< \ / |
| / Input \ / Output \ |
| \ Handler / \ Handler / <----+ |
| / \ >------+ / \ | |
| \/\/\/\/\/\/\/ | \/\/\/\/\/\/\/ ^ |
| v +-----+ |
| +-----+ | OH | |
| | IM | | Buf | |
| | Buf | +-----+ |
| +-----+ /\/\/\/\/\/\/\/\ ^ |
| /\/\/\/\/\/\/\/\ v +----> \ / | |
| \ / | | / Output \ >--+ |
| / \ <------+ ^ \ / |
| \ Input / /-----\ / Scheduler \ |
| / \ >-------->| HIQ | \ / |
| \ Interpreter / |_____| / \ |
| / \ >----+ \_____/ \/\/\/\/\/\/\/\/ |
| \/\/\/\/\/\/\/\/ | ^ v ^ |
| ^ ^ ^ \ | /-----\ | | | /-----\ |
| | \ \ \ | | O | | | | | O | |
| | \ \ \ +--->| C |>----+ | +---<| R | |
| v v v \ | C | | | M | |
| +---+ +---+ +---+ \ | Q | v | Q | |
| | | | | | | \ |_____| +---------+ |_____| |
| |ILT| |LAT| |OLT| \ \_____/ | | \_____/ |
| | | | | | | \ ^ | R T | ^ |
| +---+ +---+ +---+ +------|-------->| | | |
| v | +---------+ | |
| | ^ ^ | |
| | /\/\/\/\/\/\/\/\ | | |
| | \ / | | |
| +----------->/ System \<-------+ | |
| \ Call / | |
| / Interpreter \>--------------------+ |
| \ / |
| +-->/ \>--+ |
| | \/\/\/\/\/\/\/\/ | |
+------------------|----------------------|----------------------+
| |
+---< system calls <---+
注: この RFC は、1999 年に Donald Eastlake と Jill Eastlake によって、オンライン RFC アーカイブに収録するため機械可読形式に変換された。
[編集者注: 手描きの元の図では、キューは円柱で、構成プログラムは「ぐにゃぐにゃしたアメーバのようなもの」で表されていた。]