Form Machine 在程序协议中的应用
NWG/RFC #80 中提到的 Protocol Manager 需要若干有趣的特性,而这些特性正是上述 Form Machine 的属性。
在协议对话的某些情形中,可能既可以接受在连接 A 上得到 accept,也可以接受在连接 B 上得到 allocation,也就是说,顺序有时并不重要。 为应用规则而定义的过程允许与顺序无关。
记录器可能向我们发送一个嵌入在常规消息中的套接字号——该套接字号意在作为一组连续套接字中的第一个,我们可以用这组套接字与某个程序建立连接。 我们希望从常规消息中提取套接号字段,或许将其转换为另一种格式,并在其基础上相加以得到其余的套接字名。 作为对常规消息的响应,我们希望输出若干个 INIT 系统调用,其中包含我们已计算出的套接字号。 Form Machine 的值运算符和算术运算符可以做到这一点。
Form Machine 适用于协议的第三个属性,是用于解析上下文相关信息的规则间与规则内绑定。 一般而言,我们希望规则与顺序无关,但在某些情况下我们希望强加一种顺序。 以 NWG/RFC #66 中的记录器为例,记录器发送的 close 可以因上下文不同而有两种不同的含义。 如果 close 在包含套接号的常规消息之前发送,那么它意味着呼叫被拒绝。 如果常规消息先于 close,那么该呼叫被接受。 由于 close 具有上下文含义,我们必须把它绑定到常规消息,以避免把 IF 和 THEN 引入 Form Machine 语言。
暂且假设我们可以用 Form Machine 记法来表达系统调用。 (下面的记法仅供 说明 之用,并非 Form Machine 语言的一部分。) 我们有两种方式把常规消息绑定到 close。 通过规则内绑定,我们坚持要求 close 之前必须有一条常规消息。
Reg. Msg , Close ->
现在暂且假设远端必须在每次传输之后收到一个回显。 由于我们必须在收到常规消息之后、close 发送之前输出一个回显,因此我们必须使用规则间绑定。 这可以用编程变量来实现。 它在收到常规消息时被赋一个值,而在收到 close 时该值被检测。
Reg. Msg -> Echo , ([lambda]+1)
Close, ([lambda]=1) ->
为了说明通过编程变量实现的规则间绑定,NWG/RFC #66 中的连接协议可以通过把下面的形式传给一个协议管理器来表示。 (下面的记法仅供 说明 之用,并非 Form Machine 语言的一部分)。
1. ->INIT(parameters) , ([alpha]<-0)
发送一个 INIT(RTS)。
2. INIT(parameters) -> ALLOCATE(parameters)
响应连接完成(收到一个 STR)而发送一个 allocate。
3. Reg. Msg (parameters) -> ([alpha]<-1)
当收到携带链路号的消息时,设置一个内部指示符。 (链路的提取未作说明。)
4. CLOSE(parameters),([alpha]=1) ->
INIT(parameters),INIT(parameters)
当在常规消息之后收到 close 时,会检查 [2] 以确认在建立双工连接之前已收到常规消息。 如果收到的 close 之前没有常规消息(呼叫被拒绝),则该形式将失败(因为没有规则被满足)。
这个协议可以通过一个包含四条替换规则的单一形式来处理。 我们考察过更复杂协议序列的类似表示。 这类按名称存储的协议序列对用户是一种财富;他可以请求自动执行一个预定义的序列。