VII. 连接状态
描述建立和终止连接所需事件序列的一个极好机制是状态图。我们可以假定每个套接字都可以关联一个状态机, 且该状态机在任意时刻都处于十种可能状态之一。在任一状态下, 某些网络事件会使连接状态进入另一个状态;另一些事件被忽略;还有一些则属于错误。状态转移还可能伴随本地 NCP 执行某些操作。图 7.1 描绘了该状态机。圆圈[编者注: 现为方框]表示状态(见下文描述);箭头表示状态之间的合法转移。箭头上的标签标明引起转移的事件(注意 CLOSE 是系统调用, CLS 是控制命令)。斜杠后的短语表示沿该箭头转移时应执行的操作。标为 '[E]RFC' 的箭头(位于状态 0 和 1 之间)表示这样一个条件: 每当连接进入 CLOSED 状态时, 都会检查该连接的待处理呼叫队列[编者注: 原图中为反写的“E”。]
如果队列中存在任何待处理呼叫, 连接将转入 PENDING 状态。如果处于 CLOSED 状态的套接字收到 RFC, 它也会沿这条路径转入 PENDING 状态。事件及其引起的操作在下文第 VIII 节和第 IX 节中描述。十种状态的描述如下:
(0) CLOSED
本地套接字未附接到任何端口, 也没有用户请求与之建立连接。(表条目不存在。)
(1) PENDING CALL
套接字未附接到任何端口, 但已收到一个或多个连接请求。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-WAIT 状态, 等待确认 CLS。如果在 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: 连接状态图