跳到主要内容

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: 连接状态图