VII. 接続状態
接続の確立と終了に必要な事象の順序を記述する優れた手段として、状態図がある。各ソケットには状態機械を対応付けることができ、この状態機械はどの時点でも 10 個の可能な状態のいずれか 1 つにあると仮定してよい。どの状態においても、あるネットワーク事象は接続状態を別の状態に遷移させ、別の事象は無視され、さらに別の事象はエラーとなる。遷移には、ローカルの NCP が何らかの動作を行うことが伴う場合もある。図 7.1 はこの状態機械を示す。円[編者注:現在は枠]は状態(後述)を表し、矢印は状態間の正当な遷移を示す。矢印上のラベルは遷移を引き起こした事象を示す(CLOSE はシステムコール、CLS は制御コマンドであることに注意)。スラッシュの後の語句は、その矢印をたどる際に行うべき動作を表す。'[E]RFC' とラベル付けされた矢印(状態 0 と 1 の間にある)は、接続が CLOSED 状態に入るたびに、その接続の保留中の呼び出しキューが検査されるという条件を表す[編者注:原本では「E」が左右反転していた。]
キューに保留中の呼び出しが存在する場合、接続は PENDING 状態に移る。CLOSED 状態にあるソケットに対して RFC を受信した場合も、同じ経路で PENDING 状態に移される。事象とそれが引き起こす動作については、後述の VIII 節と IX 節で説明する。10 個の状態の説明を以下に示す。
(0) CLOSED
ローカルソケットはどのポートにも接続されておらず、どのユーザもそのソケットとの接続を要求していない。(テーブルエントリは存在しない。)
(1) PENDING CALL
ソケットはどのポートにも接続されていないが、1 つ以上の接続要求を受信している。LISTEN システムコールは、一致する要求に対する保留中の呼び出しキューの先頭エントリによって直ちに満たされ、他の保留中の呼び出しはすべて削除される。
(2) LISTENING
ソケットはポートに接続されている。ユーザがこのソケットとの接続を要求するのを待っている状態である。
(3) RFC-RCVD
待ち受け中に RFC を受信した。ローカルユーザには保留中の呼び出しについて通知済みである。ユーザは CLOSE または ACCEPT のいずれかで応答しなければならない。
(4) ABORT
ユーザに LISTEN が満たされたことを通知したが、ユーザはまだ応答していない。この間に外部ユーザが CLS を送って接続を中止した場合、我々はその中止を確認応答するために CLS を送り、その事実をこの状態で記録する。ユーザが呼び出しを受け入れるか拒否したときに、接続が途中で終了したことをユーザに通知できる。
(5) RFC-SENT
この状態には次の場合に入る。
- a) ローカルユーザが CONNECT を発行して、このソケットをポートに接続した。
- b) RFC が送信され、かつ
- c) まだ応答を受信していない。
ユーザが CONNECT を発行すると、保留中の呼び出しキューが検索される。
一致する RFC が見つからなければ、キューは削除され、この状態に入る。新たな RFC が到着するたびに、ユーザの要求と比較される。一致しなければ、その RFC は直ちに拒否される。RFC が一致すれば、初期化処理が完了し、接続は OPEN 状態に入る。
(6) OPEN
RFC が交換され、接続が確実に確立されている。受信側から ALL コマンドを受け取った後に送信を開始でき、以後はフロー制御に従って進行する。
(7) CLS-WAIT
ローカルユーザが CLOSE を実行し、我々が CLS を発行した後、接続を完全に切断するには確認応答の CLS を待たなければならない。該当する CLS をまだ受信していない場合、この状態に入る。
(8) DATA-WAIT
我々が送信側にあり、ローカルユーザが CLOSE システムコールを実行した場合、データバッファが空でないか、最後のデータメッセージに対する RFNM が未着であれば、CLS を発行できない。接続はこれらの条件が満たされるのを待つためにこの状態に入る。出力が完了して確認応答されると CLS を発行でき、接続は確認応答の CLS を待つ CLS-WAIT 状態に入る。DATA-WAIT 状態にある間に CLS が到着した場合は、バッファをクリアし(その CLS は受信ソケットから来たものであり、もはや我々のデータを必要としていないことを示す)、ネットワークが空になるのを待つために RFNM-WAIT 状態に入る。
(9) RFNM-WAIT
我々が送信側にあり CLS コマンドが到着した場合、最後のデータメッセージに対する RFNM を受信していなければ、確認応答の CLS を発行できない。我々は RFNM を待つためにこの状態に入り、以後のデータ送信をすべて停止する。RFNM が到着すると CLS を発行でき、接続は切断される。
______________
| | CLOSE
CONN/ | CLOSED |<---------------------------+
send RFC | (0) | LISTEN |
+----------------| |-----------------------+ |
| |______________| | |
| | ^ | |
| [E]RFC | | CLS/send CLS | |
| ___V____|____ ___V____|____
| non-matching | | | |
| CONN/send RFC | PENDING | LISTEN RFC | LISTENING |
| +-------------| (1) |----------+ +----| (2) |
| | |_____________| | | |_____________|
| | matching | | |
___V___V_____ CONN/send RFC| __V___V______
| | | ACCEPT/ | | CLS/
| RFC-SENT | RFC | send RFC | RFC-RECD | send CLS
| (5) |----------+ | +----------| (3) |---------+
|_____________| | | | |_____________| |
| | | | | | |
| | ___V___V___V___ SND&CLOSE | ____________ |
| | RCV&CLS/ | |-----------)->| | |
| | send CLS | OPEN | SND&CLS | | DATA-WAIT | |
| | +---------| (6) |--------+ | | (8) | |
| | | |_______________| | | |____________| |
| | | RCV&CLOSE/ | | | | |
| | | send CLS | | | | |
| | | | | | | CLS |
| | | ______V______ | | | |
| | | CLOSE/ | |CLOSE/ | | | |
| | | send CLS| CLS-WAIT |send CLS | | | |
| +---)--------->| (8) |<--------)--+ | |
| | |_____________| | | |
| | | ___V______V_ ______V___
| | | | | | |
| | | | RFNM-WAIT | | ABORT |
| | CLS | | (9) | | (4) |
| | | |____________| |__________|
| | | | |
| | ______V_______ RFNM/ | |
| | | | send CLS | |
| CLS/ +--------->| CLOSED |<----------+ |
| send CLS | (0) | ACCEPT|CLOSE |
+----------------->| |<----------------------------+
|______________|
図 7.1:接続状態図