2. ホスト間手順
2.1 概説
基本的な考え方は、あるホスト上の複数のユーザーが、その物理的設備をタイムシェアリングすることにより、同時にネットワークを利用できるべきであるというものである。
このことは、各ホストのオペレーティングシステム内に、ユーザーからの発信メッセージをネットワークへ多重化し、受信メッセージを適切なユーザーに分配する特別なプログラムが存在しなければならないことを意味する。この特別なプログラムをネットワークプログラムと呼ぶことにする。
2.2 リンクとコネクション(図 1 参照)
2.2.1 定義
ネットワークをブラックボックス、すなわち振る舞いは知られているがその仕組みは知られていないシステムとして捉え、HOST 計算機の対の間ではなく遠隔のユーザー間でメッセージを通信するものと考えるのが都合がよい。
(a) 論理コネクション
論理コネクションを、遠隔の HOST[s] 上の二人のユーザーを結ぶ通信路であると定義する。
この概念により、HOST 計算機内のユーザー(ユーザープログラム)は、(1) 任意の遠隔 HOST のユーザーに対して複数の論理コネクションを確立し、(2) それらのコネクション上でメッセージを送受信することができる。
コネクションはユーザーからは全二重に見える。
ネットワークプログラムの目的の一つは、これらのコネクションの確立、識別、および維持においてユーザーにサービスを提供することである。
(b) 論理リンク
各論理コネクションは一対の方向性リンクから成る。一方は送信用、他方は受信用である。
これらのリンクは論理リンクと呼ばれ、ネットワークプログラムによって確立され、それらによって使用される。
ここで注意すべきは、ユーザーはコネクションにのみ関心があり、リンクについてはまったく意識しないことである。リンクとコネクションの関係はネットワークプログラムによって処理される。
コネクションを一対の方向性リンクとして定義する利点の一つは、HOST が自身の IMP を介して自分自身にループできる能力を持つことである(自分自身へのコネクションを開く)。この機能はデバッグの目的に有用であり得る。
以降、本稿ではリンクまたはコネクションを指すときに論理という属性をもはや用いない。
2.2.2 コネクションの型
ネットワークの利用において高い柔軟性を得るために、コネクションを分類する利点がある。
三つの型のコネクションが区別される。(a) 制御コネクション、(b) 主コネクション、(c) 補助コネクションである。
(a) 制御コネクション
このコネクションは特別な地位を持ち、一対の HOST[s] の間で一意である。例えば、ネットワークが x 個の HOST[s] を含むなら、一つの HOST から発せられる制御コネクションは最大 x 個である。
このコネクションは、遠隔のネットワークプログラムが制御メッセージをやり取りするために使用される。制御メッセージは標準コネクションの確立/削除の基本である。(2.4.2 参照)
ここで注意すべきは、この制御コネクションが HOST のユーザーによって使用されない唯一のコネクションであることである。
次に、標準コネクションについて述べる。
(b) 主コネクション
これらのコネクションは遠隔のユーザーを接続する。
主コネクションは以下のとおりである。
- 一対のユーザーの間で一意であり、最初に確立される。
- テレタイプ的である。すなわち:
- ASCII 文字が送信される。
- エコーは遠隔の HOST によって生成される。
- 受信側の HOST[s] はブレーク文字を走査する。
- 伝送速度は遅い(毎秒 20 文字未満)。
- 主に制御コマンドの送信に使用される。例えば、遠隔 HOST のオペレーティングシステムへのログインなどである。
(c) 補助コネクション
これらのコネクションもまた遠隔のユーザーを接続する:
補助コネクションは以下のとおりである。
- 主コネクションと並行して開かれ、一意ではない。すなわち、ユーザー間で複数の補助コネクションを確立できる。
- 大量のデータ(ファイル指向)の送信に使用される。
- バイナリ伝送または文字伝送のいずれかに使用される。
[図 1 - リンクとコネクション - PDF ファイル参照]
2.3 メッセージ構造
HOST[s] はメッセージを介して相互に通信する。メッセージの長さは最大 8095 ビットまで変化し得る(構造については後述)。したがって、より大きな伝送は HOST のユーザーによってこのようなメッセージの列に分割されなければならない。
メッセージ構造を図 2 に示す。
それは以下を含む:
(1) リーダ(32 ビット): メッセージ型、送信元/宛先 HOST、リンク番号。(BBN レポート第 1822 号、13、17 ページ参照)
(2) メッセージテキストをワード境界から開始するためのマーキング(Sigma 7 から送信される場合は 32 ビット)。(BBN レポート第 1822 号、17、19 ページ参照)
(3) メッセージテキスト(Sigma 7 では最大 8015 ビット)。主にユーザーのテキストから成る。しかし、ネットワークプログラムが使用する情報を表すこともある。(制御メッセージ、2.4.2 参照)
(4) チェックサム(16 ビット)。その目的は、HOST レベルでメッセージが正しく伝送されたかを検査することである。(ビットパターンの変化またはパケットの転置。パケットは BBN レポート第 1763 号、13 ページで定義されている)チェックサムの計算については後述する。
(5) ワード長の不一致問題を解決するためのパディング。(BBN レポート第 1822 号、17、19 ページ参照)。ソフトウェアに関する限り、パディングはメッセージの終端を区切るためにメッセージ受信時のみ関与する。(送信時にはハードウェアがパディングを処理する。)
注記:
チェックサムの計算:
HOST によって送信されるすべてのメッセージの最後の 16 ビットはチェックサムである。このチェックサムは、任意のマーキングを含むメッセージ全体に対して計算されるが、32 ビットのリーダと任意のパディングは除外される。チェックサムを計算するには:
- メッセージがゼロでパディングされ、長さ 8640 ビットになると考える。
- 8640 ビットを 6 つの 1440 ビットセグメント S0、S1…S5 に分割する。
- 各 1440 ビットセグメント S を 90 個の 16 ビット要素 T0、T1…T89 に分割する。
- 二つの 16 ビット要素を入力とし、16 ビット要素を出力する関数 [(+)] を定義する。この関数は次で定義される。
Tm [(+)] Tn = Tm [(+)] Tn、ただし Tm + Tn < 2[exp 16] の場合
Tm [(+)] Tn = Tm [(+)] Tn - 2[exp 16] + 1、ただし Tm + Tn >= 2[exp 16] の場合
- 各 1440 ビットセグメント Si について Ci = K(Si) を計算する。ここで
K(S) = T0 [(+)] T1 + ..... T89
- 計算 C = C0[(+)]C1[(+)]C1[(+)]C2[(+)]C2[(+)]C2[(+)]C2....[(+)]C5
(C1[(+)]C1 は C1 を左に 1 ビット回転させたものにすぎないことに注意)
数 C がチェックサムである。Ci が i ビット回転されるのは、パケットの転置を検出するためである。
[図 2 - Sigma 7 から送信されるメッセージの形式 - PDF ファイル参照]
2.4 ユーザートランザクション
ここまでの議論から、ネットワークはユーザーには一群のコネクションとして見える。次に、これらのコネクションをどのように利用できるかを説明する。
まず、コネクション機能を利用するためにユーザーがアクセスできるべきトランザクションの集合を記述する。
次に、これらのトランザクションの実行におけるネットワークプログラムの役割を説明する。これは、ネットワークプログラム間で制御メッセージが交換されるホスト間プロトコルを対象とする。
説明の便宜上、これらのトランザクションはユーザーレベルにおいてサブルーチン呼び出しとパラメータの形で表現される。しかし、これは実装がこのパターンに厳密に従うことをまったく意味しない。(ここでは実装面よりも記述に重点を置いている。第 3 章参照。)
2.4.1 トランザクションの一覧
以下に、コネクションの作成/切断およびそれらを介したデータの送受信のためにユーザーが利用できるサブルーチンの記述を挙げる。このサブルーチンの集合は、ユーザーレベルとネットワークプログラムレベルとの間のある種のインターフェースと見なすことができる。
(a) 主コネクションを開く:
OPENPRIM (CONNECTID, HOSTID, BUFFADDR, [OPT]) CONNECTID: コネクション識別番号 # HOSTID: 遠隔 HOST 識別番号 # BUFFADDR: 受信メッセージ用のバッファアドレス。OPT: コネクション確立の成功後に要求されるメッセージ、"full echo"(検査目的で各メッセージが遠隔 HOST によって返送される)などのオプション。
注記: [ ] は省略可能を意味する
(b) 補助コネクションを開く
OPENAUX (CONNECTID, BUFFADDR, N, [OPT]) CONNECTID: コネクション識別番号 #、すなわち対応する主コネクションの識別番号(ユーザーはまず主コネクションを開かなければならない)。BUFFADDR: 上記と同じ意味。N: 開かれるべき補助コネクションの数。OPT: 上記と同じ意味。
(c) コネクション上での送信
TRANSM (CONNECTID, NO, BUFFADDR, N, [OPT]) CONNECTID: コネクション識別番号 # NO: コネクション番号 #。主コネクションは常に NO=0 として参照される。補助コネクション番号は、それが確立された順序に対応する。(最初に開かれた補助コネクションは NO=1、二番目は NO=2 などで参照される。)BUFFADDR: 送信されるメッセージのバッファアドレス。N: メッセージサイズ(バイト数) OPT: データ型(文字かバイナリか)、トレースビットなどのオプション。
(d) コネクションを閉じる
CLOSE (CONNECTID, [N], [NO]) CONNECTID: コネクション識別番号 #。N: 閉じられるべきコネクションの数。省略された場合、ユーザーが使用中のすべてのコネクション(主リンクを含む)が閉じられる。NO: N がゼロと異なる場合、この数は閉じられるべき補助コネクション # を示す。
2.4.2 ホスト間プロトコルと制御メッセージ
ホスト間プロトコルはネットワークプログラムによって実行される。主に(ユーザーによって開始される)前述のトランザクションの実行を伴い、ホスト間の対話を対象とする。
この対話は、コネクションを開くまたは切断するための制御手順を実行し、制御リンク上で制御メッセージを交換することから成る。制御メッセージは通常のメッセージと同一の構造を持つ。ユーザーではなくネットワークプログラムが使用するテキストという点だけが異なる。
強調しておくが、この制御手順は IMP 計算機に実装された伝送制御手順とはまったく無関係である。ここでは HOST レベル(ネットワークプログラム)におり、したがって以下で記述される制御メッセージは、通常のメッセージと同様に IMP[s] を介して伝送される。
次に前述のトランザクションを考察し、それぞれについてどのリンク上でどのメッセージが交換されるかを記述する。各ケースは簡単な例によって説明される。
HOST(x) のユーザーが、URSA と呼ばれる遠隔の HOST(y) のプログラムに接続することを望んでいると仮定する。
(a) 主コネクションを開く: (OPENPRIM)
HOST (x) のネットワークプログラムは、主コネクションを開くためにユーザーによって起こされ(3.3 参照)、HOST (y) のネットワークプログラムとの対話を開始する。
(i) HOST(x) は次の制御メッセージを送信する:
HOST(x) Control link HOST(y)
-------------------->
ENQ PRIM 0 1 2
ENQ: コネクション確立のための問い合わせ(1 つの ASCII 文字) PRIM: コネクション型: 主(1 つの特殊文字) 0 1 2: 発信リンク #。これは 10 進数(3 つの ASCII 文字)であり、例えばリンク #12 である。
このリンク # は HOST(x) のネットワークプログラムによって決定された(実装: 3.3 参照)
(ii) HOST(y) は次の制御メッセージを返送して確認応答する:
HOST(x) Control link HOST(y)
<------------------------
ACK ENQ PRIM 0 1 2 0 1 5
ACK: 肯定応答(1 つの ASCII 文字) ENQ PRIM 0 1 2: 上記と同じ意味。メッセージのこの部分は検査目的で返送される。0 1 5: 着信リンク #。発信リンク # と同じパターンに従う。このリンク # は HOST(y) のネットワークプログラムによって決定された。
これでコネクションが確立される。ユーザーメッセージの交換にはリンク #12 と 15 を使用する。このコネクションはログイン前状態にあると言われ、すなわち遠隔の HOST(y) がその標準のログイン手順を待っている。
(b) 主コネクション上での送信: (TRANSM)
主コネクションを参照する TRANSM サブルーチンによって、HOST(x) のユーザーは HOST(y) のオペレーティングシステムにサインインし、次に URSA プログラム(HOST(y) のユーザープログラム)を呼び出すことができる。
両端のネットワークプログラムは、メッセージを受け渡すためにリンク #12 と #15 を使用する。これらのメッセージは、その内容がログインシーケンスに用いられる標準メッセージである。
簡単な例を挙げれば次のとおりである:
HOST(x) Prim. Link #12 HOST(y)
---------------------------->
! S I G N - I N : X X
HOST(x) Prim. Link #15 HOST(y)
<--------------------------
! ! R E A D Y
HOST(x) Prim. Link #12 HOST(y)
---------------------------->
! U R S A
(c) 補助コネクションを開く: (OPENAUXI)
(a) と非常によく似た方法で、HOST(x) と HOST(y) の間に補助コネクションが確立される。そのために制御リンク上で制御メッセージが交換される。
HOST(x) Control link HOST(y)
------------------------------>
ENQ AUX 0 2 5
HOST(x) Control link HOST(y)
<--------------------------------
ACK ENQ AUX 0 2 5 0 2 1
これで補助コネクションが確立され、標準メッセージの交換にはリンク #25 と 21 を使用する。
(d) 補助コネクション上での送信: (TRANSM)
補助コネクションを参照する TRANSM サブルーチンによって、両端のユーザーはデータを交換できる:
HOST(x) Aux. Link #25 HOST(y)
-------------------------------->
X X ..... X X
HOST(x) Aux. Link #21 HOST(y)
<--------------------------------
X ......... X
など.......
(e) コネクションを閉じる: (CLOSE)
これは (a) と同様の方法で実行される。ユーザーが CLOSE サブルーチンを呼び出すと、両端のネットワークプログラムが制御メッセージを交換する。
HOST(x) Control Link HOST(y)
----------------------------->
EOT 0 0 1 0 1 2
EOT: 伝送終了(1 つの ASCII 文字) 0 0 1 : 閉じられるべきコネクションの数(3 つの 10 進 ASCII 文字) 0 1 2 : 閉じられるべき発信リンク #。
次に HOST(y) は (a) と同様に確認応答を返す。
HOST(x) Control Link HOST(y)
<-----------------------------
ACK EOT 0 0 1 0 1 2 0 1 5
注記 1 - (a)、(c)、(e) において、HOST(y) は ACK の代わりに否定応答文字 NAK を含むメッセージを返答することがある。これは、誤った順序、コネクションがすでに開かれている、など多くの様々な理由による。メッセージは NAK IND であり得る。ここで IND は、先行するブロックがなぜ拒否されたかを符号化された形で示す英数字である。そのような応答を受け取ると、HOST(x) は HOST(y) がそれを受け入れるまでメッセージを繰り返す。連続する "NAK メッセージ" が多すぎる場合には緊急手順が行われる。
注記 2 - 上記の各図(矢印)では、メッセージテキストのみが表現されている。実際には、完全なメッセージ(リーダ、マーキング、パディング…を含む)がこれらのリンク上で交換される。