跳到主要内容

VIII. 输入解释器的算法

以下是 NCP 对传入网络命令所作响应的简明描述。CS 始终表示连接状态(Connection State)。注意, CLOSE 是本地用户进程执行的系统调用, 而 CLS 是网络命令。

NOP​

丢弃。

RFC (RTS or STR)​

如果不存在条目, 则创建一个状态为 PENDING CALL 的条目, 并将该消息排队。

如果 CS = LISTENING, 则将该条目排队, 进入 RFC-RCVD 状态, 并将该请求告知用户。

如果 CS = RFC-SENT 但新的 RFC 与请求不匹配, 则拒绝该 RFC。

在所有其他情况下, 检查该 RFC 是否匹配。如果没有匹配, 则将该 RFC 排队。如果 RFC 匹配, 则当:

  • CS = RFC-SENT 时, 我们进入 OPEN 状态。
  • CS = CLS-WAIT 时, 忽略该 RFC。
  • 其他情况下, 在所有表明该请求已被收到的状态中(这些状态为 1,3,4,6,8,9), 该请求都是非法的。

无论哪种情况, 如果处理该 RFC 导致溢出(资源耗尽), 则拒绝该连接(发送 CLS)。

CLS​

搜索待处理呼叫队列。如果该 CLS 与当前请求不匹配, 但与某个其他请求匹配, 则删除那个请求并发出 CLS。如果没有匹配, 则忽略该 CLS。

如果该 CLS 与当前请求匹配, 且 CS =

  • PENDING, 则删除当前请求。如果请求队列为空, 则删除该条目;否则保留该条目不动。
  • RFC-RCVD, 发出 CLS 并进入 ABORT 状态。
  • ABORT, 忽略。
  • RFC-SENT, 发出 CLS。如果待处理呼叫队列为空, 则删除该条目, 否则进入 PENDING 状态。
  • OPEN, 如果我们处于接收端, 响应与对 RFC-SENT 的响应相同。如果我们处于发送端, 则清空数据队列, 并且若 RFNM 仍待返回, 则进入 RFNM-WAIT 状态。否则, 响应与对 RFC-SENT 的响应相同。
  • CLS-WAIT, 发出 CLS, 并且如果待处理呼叫队列为空, 则删除该条目, 否则 CS = PENDING。
  • DATA-WAIT, 清空数据队列并进入 RFNM-WAIT 状态。在 CLOSED 或 LISTENING 状态下不可能出现匹配的 CLS。

ERR​

错误被排入队列, 留待系统程序员日后处理, 并被视为发起该交换的主机中的系统错误。(与任何状态无关。)

ECO​

将操作码改为 ERP 并重新发送(与任何状态无关)。

ERP​

收到 ERP 后, 系统将该命令的文本回传给发出 ECO 的进程。

INR, INS​

这些命令仅在 OPEN 状态下有效。收到 INTERRUPT 后, 系统会向相关进程发送一个事件。在 CLS-WAIT、DATA-WAIT 和 RFNM-WAIT 状态下, INTERRUPT 被忽略。在任何其他状态下它都是错误。

ALL​

ALLOCATE 仅在 OPEN 状态下有效, 且只能发往发送套接字。NCP 按 ALLOCATE 命令中指定的大小, 增加相关会合表条目中的 'Their Size' 字段。

在 CLS-WAIT 和 DATA-WAIT 状态下忽略此命令;在任何其他状态下它都是错误。

Data-RFNM​

如果处于 OPEN 状态, 则将相应会合表条目中的流量控制状态(Flow Control Status)字段标记为 RFNM-RECVD, 并在需要时发送更多数据。

如果处于 DATA-WAIT 状态, 则维护流量控制状态。如果数据队列为空, 则发出 CLS 并进入 CLS-WAIT 状态;否则传输下一条消息。

如果处于 RFNM-WAIT 状态, 则维护流量控制状态并发出 CLS。如果待处理呼叫队列为空, 则删除会合表条目, 否则 CS = PENDING。

在所有其他状态下, Data-RFNM 都是错误。