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 都是错误。