II. プロトコル
NWG/RFC #33 で説明した接続の概念は、本プロトコル全体に行き渡っている。接続とは単方向通信路であり、2つのプロセスの間に設けることを想定している。
本プロトコルの主な機能は、(1) 接続の確立、(2) 接続上のフローの調整、(3) 接続の終了を提供することである。
さらに本プロトコルは、模擬的な割り込みパルスの送信やテストメッセージのエコーといった補助的な機能も提供する。
接続に関する情報をやり取りする経路を用意するため、特定のリンク、すなわち各ホスト対の間のリンク1を制御リンクとして指定する。制御リンク上のトラフィックは、後述する制御コマンドのみで構成される。
接続はソケットの対によって名前が付けられる。ソケットはネットワーク全体で通用する40ビットの名前である。各ホストにはこれらの名前の専用の部分集合が割り当てられ、接続を要求するコマンドは、要求元ホストにローカルなソケット1つと、要求の受信側にローカルなソケット1つを指定する。
ソケットには極性がある。偶数番号のソケットは受信ソケット、奇数番号のソケットは送信ソケットである。接続を張るには、それぞれ1つずつが必要である。
接続上での情報伝送を容易にするため、各接続には一意のリンクが割り当てられる。したがって、接続確立の手順の一つはリンクの割り当てである。制御用以外のリンクのうち、0はネットワーク内部用に予約され、32から255のリンクは実験と拡張のために予約されている。そのため、通常の用途に使えるのはリンク2から31のみである。リンクの割り当ては、常に受信側が行うか、常に送信側が行うかのどちらかでなければならない。我々は(ほぼ)任意に、これを受信側の責任とした。
通常のメッセージはすべて、32ビットのリーダー、マーキング、テキスト、パディングから成る。マーキングは(空の場合もある)0の列に続く1であり、パディングは1に続く(空の場合もある)0の列である。
制御リンク(リンク1)上で送られる通常のメッセージを制御メッセージと呼ぶ。そのテキストは、後述する形式の制御コマンドを整数個(0個の場合もある)並べたものであり、このテキストはコマンドの境界で終わらなければならない。
接続の確立に用いるコマンドは STR と RTS である。STR コマンドは、送信側となる予定のホストから受信側となる予定のホストへ送られる。その <my socket> フィールドには送信予定側にローカルな送信ソケットが入り、<your socket> フィールドには受信予定側にローカルな受信ソケットが入る。RTS コマンドはこれと対をなすものだが、リンク割り当てのための <link> フィールドも含む。これら2つのコマンドを接続要求(RFC)と呼ぶ。STR と RTS は、一方の <my socket> フィールドが他方の <your socket> フィールドと一致し、かつその逆も成り立つとき、対応が取れているとみなされる。対応する RFC の対が交換された時点で、接続が確立される。
ホストは、いずれのローカルソケットに対しても2つ以上の接続を確立することを禁じられている。したがって、あるソケットが以前の RFC で言及されており、その接続がまだ終了していない場合、ホストはそのソケットを RFC の <my socket> フィールドに使用してはならない。
接続の終了に用いるコマンドは CLS である。接続が完全に終了し、ソケットが他の接続に使えるようになるまでに、双方が CLS コマンドを送信し、かつ受信しなければならない。接続を終了する前に両方の RFC が交換されている必要はない。終了についての詳細は後述する。
接続が確立されると、受信ホストはその接続に領域を割り当てる ALL コマンドを送る。送信側は受信ホストで利用可能な領域の量を把握し、前述のとおり、受信ホストが受け入れられる量を超えるテキストは送信しない。また送信側は、ローカルの IMP によって、前のメッセージに対する RFNM を受け取るまでは接続上で次のメッセージを送信できないよう制約されている。
接続が確立された後、受信側と送信側が送る CLS コマンドの効果はわずかに異なる。送信側が送る CLS コマンドは、その接続でこれ以上メッセージを送らないことを示す。接続上で伝送中のメッセージがある場合、このコマンドを送ってはならない。
受信側が送る CLS コマンドは、送信側に伝送の終了を求める要求として働く。ただし、CLS コマンドが送信側に届くまでには遅延があるため、受信側は ALL コマンドで与えた上限までバッファが埋まることを想定しておかなければならない。
接続が確立されている間は、どちらの側も INR コマンドまたは INS コマンドを送ることができる。これらのコマンドの解釈はローカルな問題だが、一般には一種のエスケープ機能を提供することになる。
ALL、INR、INS の各コマンドは、接続が確立された後、かつ CLS コマンドが送られる前にのみ送信できることに注意されたい。
ECO コマンドと ERP コマンドにより、ごく簡単なテスト機能が提供される。ECO コマンドを受信したホストは、先頭の8ビットを ERP に書き換えて返送しなければならない。これらのコマンドは接続とは無関係である。
便宜上、NOP コマンドも用意されている。コマンドメッセージの組み立てを容易にするため、これは0としてコード化される。
最後に、相手ホストが(どうやら)エラーを起こしたことを通知するための ERR コマンドが用意されている。現時点では、具体的なエラーの一覧は定義されておらず、ERR コマンドを受信した際の動作も定義されていない。システムプログラマーが問題を診断できるよう、ホストは ERR コマンドを受信したら記録しておくべきである。ホストはいつでも、どのような理由でも ERR コマンドを生成してよいが、各ホストは自らが送信しうる ERR コマンドとその解釈の網羅的な一覧を公開することが推奨される。
ネットワーク制御コマンド
以下では、各制御コマンドの構造と形式を詳しく説明する。
ソケットの記述を簡便かつ明確にするため、次の約束事を採用する:
コマンドの説明では <my socket> と <your socket> を用いる。
<my socket> はコマンドの発信元にローカルなソケットである。
<your socket> はコマンドの受信側にローカルなソケットである。
制御コマンドの形式
無操作
_______
| |
| NOP |
|_______|
接続要求(受信側から送信側へ)
______________________________________________
| | | | |
| RTS | my socket | your socket | link |
|_______|_____________|_______________|________|
接続要求(送信側から受信側へ)
_____________________________________
| | | |
| STR | my socket | your socket |
|_______|_____________|_______________|
クローズ
_____________________________________
| | | |
| CLS | my socket | your socket |
|_______|_____________|_______________|
割り当て
__________________________
| | | |
| ALL | link | space |
|_______|________|_________|
受信プロセスが送る割り込み
_______________
| | |
| INR | link |
|______|________|
送信プロセスが送る割り込み
_______________
| | |
| INS | link |
|______|________|
エコー要求
____________________________ _________
| | \ \ |
| ECO | length / / text |
|_______|____________________\ \________|
エコー応答
____________________________ _________
| | \ \ |
| ERP | length / / text |
|_______|____________________\ \________|
エラー検出
____________________________ _________
| | \ \ |
| ERR | length / / text |
|_______|____________________\ \________|
ホストはリーダーで指定される。
<link> は8ビットである
<space> は32ビット長の符号なし整数である。
<length> は符号なし16ビット整数である。
<text> の長さは length に等しい。したがって、コマンドは length より24ビット長い。コマンドの復号と操作を容易にするため、最大長は1メッセージとする。
制御コマンドのコードはすべて8ビット長である:
NOP = 0
RTS = 1
STR = 2
CLS = 3
ALL = 4
INR = 5
INS = 6
ECO = 7
ERP = 8
ERR = 9
<my socket> と <your socket> は32ビット長で、
_______________________
| | |
| User number | AEN |
|_______________|_______|
ユーザー番号に24ビット、AEN に8ビットを充てる。