更高层协议
当用户与外部主机中某个特定子系统之间需要高度交互时, 网络会带来特殊的问题。这些问题源于控制台的异构性、本地操作系统的开销以及网络传输延迟。除非我们采用特殊的策略, 否则远端用户可能很难甚至无法使用所提供的更精密的子系统。这些困难在图形领域尤其严重, 但即便是电传打字机交互也可能出现问题。例如, 假设某个外部子系统是为通过电话连接的电传打字机控制台设计的, 而后这个子系统对网络用户开放。这个子系统可能具有以下特征。
- 除回显和纠正误打之外, 在键入回车之前不采取任何操作。
- 除 "^"、以及 "<-" 和回车之外, 所有字符在键入时即被回显。
- <- 删除紧邻的前一个字符, 并以该字符的形式回显。
- ^ 使先前键入的所有字符都被忽略。会回显一个回车和换行。
- 回车被回显为一个回车后跟一个换行。
如果键入的每个字符都各自作为一条消息发送, 那么这些字符
H E L L O <- <- P c.r.
会在每个方向上产生九条消息。此外, 每个字符在发送到外部主机之前, 都要由本地主机中的一个用户级程序处理。
现在很清楚, 如果这个特定例子很重要, 我们会很快在本地主机的一个程序中实现规则 1 到 5, 并且只把完整的行发送到外部主机。如果外部主机程序无法修改到不产生回显, 那么本地程序不仅可以正确回显, 还可以丢弃外部主机随后发来的回显。然而, 问题并不在于任何特定的交互方案; 问题在于我们预期会出现许多这类方案。我们尚未找到这些问题的任何通用解决方案, 但一些观察和猜想也许能指明方向。
关于异构控制台, 我们注意到尽管控制台很少彼此兼容, 但许多是等价的。把 37 型电传打字机视为等同于 IBM 2741, 大概是合理的。类似地, 大多数存储示波器会构成一个等价类, 而大多数刷新显示示波器会构成另一个等价类。此外, 可能会出现一种层级关系, 使某一类的成员可以替代另一类的成员, 反之则不行。我们可以想象, 任何示波器也许都能充分替代电传打字机, 但反过来几乎不行。这一观察使我们猜想, 是否可能有一种网络范围的控制台语言。这样的语言将为不同类别的控制台提供区别对待, 并具有适合每一类别的语义。每个站点随后可以为自己的控制台编写接口程序, 使它们看起来像网络标准设备。
另一个观察是, 用户通过把系统响应的速度与自己的预期相比较来评价一个交互式系统。有时用户觉得自己只提出了一个小请求, 因此响应应当立即返回; 另一些时候他觉得自己提出了一个较大的请求, 因而愿意等待响应。有些交互式子系统用起来特别愉快, 因为为了让响应符合用户的预期, 人们投入了大量工作。然而在网络中, 一个本地用户级进程介入本地控制台与外部子系统之间, 我们可以预期小请求的响应时间会变差。现在可能会出现这样的情况: 所有这些对交互的精心调整, 与子系统中负责繁重计算或 I/O 的那一部分相当独立。在这种情况下, 也许可以把一个子系统分成两部分。其中一部分是 "前端", 它把输出格式化给用户, 接受用户的输入, 并控制诸如回显之类计算上简单的响应。在上面的例子中, 用于累积一行并生成回显的程序就是某个子系统的前端。我们现在注意到这样一个事实: 本地主机拥有可观的计算能力, 但我们当前的设计只把本地主机用作数据集中器。这有些讽刺, 因为本地主机作为数据集中器不仅没有得到充分利用, 还因为它引入的延迟而使性能下降。
这些论证使我们考虑一种网络接口语言 (Network Interface Language, NIL) 的可能性, 它将是一种用于编写交互式子系统的前端、面向整个网络的语言。这种语言将具有这样的特点: 子程序通过类网络的连接进行通信。于是策略就是把子系统前端的源代码传送到本地主机, 在那里编译并执行。
在初步讨论中, 我们一致认为 NIL 至少应当具有以下在其他语言中通常见不到的语义特性。
- 并发性。由于消息在不同的连接上异步到达, 并且由于用户输入与子系统输出不同步, NIL 必须包含能够准确建模各种可能并发性的语义。
- 程序拼接。能够把一个程序插入另外两个程序之间是非常有用的。为实现这一点, 程序之间的互连将在运行时指定, 而不隐含在源代码中。
- 设备可替换性。定义语言时通常要求一种设备可以替代另一种设备。这里的要求是, 任何设备都可以由一个 NIL 程序来建模。例如, 如果一个网络标准显示控制器根据发送给它的消息来操作树形结构, 那么这些结构必须能够容易地用 NIL 实现。
NIL 尚未被完整地规定, 对其有用性也有人持保留意见。这些保留意见取决于我们的一个猜想: 可以把一个交互式系统划分为一个可传输的前端 (它以低成本满足用户的预期) 和一个更实质性的留在原地的部分。如果我们的猜想不成立, 那么 NIL 就没有用; 否则它似乎值得继续推进。在低层 HOST-HOST 协议稳定之后, 检验这一猜想以及进一步开发 NIL 将优先进行。