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