跳到主要内容

IX. 系统调用解释器的算法

下面逐一讨论各系统调用, 并给出它可能引起的状态变化:

CONNECT​

如果不存在条目, 则创建一个, 发出 RFC, 并进入 RFC-SENT 状态。

如果 CS = PENDING, 则搜索队列并拒绝所有不匹配的请求。如果未找到匹配, 则发出 RFC 并进入 RFC-SENT 状态。如果找到匹配, 则发出 RFC 并进入 OPEN 状态。一旦分配了缓冲区空间, 即可开始传输。

在任何其他状态下, 此命令都是非法的。

LISTEN​

如果条目不存在, 则创建一个, 并进入 LISTENING 状态。

如果 CS = PENDING, 则通知用户并进入 RFC-RCVD 状态。

在任何其他状态下, 此命令都是非法的。

ACCEPT​

如果 CS = RFC-RCVD, 则发出 RFC 并进入 OPEN 状态。一旦分配了缓冲区空间, 即可进行数据传输。

如果 CS = ABORT, 则告知用户连接已被提前终止。如果待处理呼叫队列为空, 则删除该条目;否则进入 PENDING 状态。

在任何其他状态下, 此命令都不能合法执行。

CLOSE​

如果 CS =

  • LISTENING, 则删除该条目。
  • RFC-RCVD, 则发出 CLS 并进入 CLS-WAIT 状态。
  • ABORT, 告知用户连接已被提前终止。如果待处理呼叫队列为空, 则删除该条目;否则进入 PENDING 状态。
  • RFC-SENT, 则发出 CLS 并进入 CLS-WAIT 状态。
  • OPEN, 如果我们处于发送端且数据队列不为空, 或者 Data-RFNM 仍未返回, 则进入 DATA-WAIT 状态;否则发出 CLS 并进入 CLS-WAIT 状态。
  • CLS-WAIT, 在此状态下发出 CLOSE 属于 USER ERROR(用户错误)。
  • DATA-WAIT, 在此状态下发出 CLOSE 同样是非法序列。
  • RFNM-WAIT, 忽略该 CLOSE。

如果条目不存在, 或套接字处于 PENDING 状态, 则不能发出有效的 CLOSE。


注: undefined