跳到主要内容

设计概念

参与网络的计算机在两个方面很重要地相似: 每台都支持独立于网络的研究, 并且每台都处于分时系统的管理之下。这些事实促成了以下设计理念。

第一, 由于网络中的计算机各有独立用途, 有必要保留对各台计算机的分散式管理控制。由于所有分时监控程序都具有完善而明确的记账与资源分配机制, 我们做了安排, 使这些机制能够以控制本地产生的负载相同的方式来控制由网络带来的负载。

第二, 由于所有计算机都在分时规则下运行, 似乎有必要便利基本的交互机制。

第三, 由于使用这个网络的是有经验的程序员, 必须在使用网络时提供最大限度的自由。关于字符集、编程语言等方面的限制不会被接受, 因此我们避免了这类限制。

第四, 同样因为使用网络的是有经验的程序员, 我们认为有必要让设计保持开放。我们预期随着经验的积累会不时出现各种约定, 但我们觉得不应武断地强加它们。

第五, 为了使接入网络变得舒适, 或在某些情况下变得可行, 通向网络的软件接口应当要求对主机操作系统做尽可能小的改动。

最后, 我们接受上文所述的假设: 网络使用由长时间的会话构成, 而不是一次性的请求。

这些考量引出了连接、网络控制程序 (NCP)、控制链路、控制命令、socket 以及虚拟网等概念。

连接是链路的延伸。连接把两个进程连接起来, 使一个进程的输出成为另一个进程的输入。连接是单工的, 因此若两个进程要双向交谈, 则需要两条连接。

主机内的进程通过网络控制程序 (NCP) 与网络通信。在大多数主机中, NCP 是执行程序的一部分, 因此进程将通过系统调用与它通信。NCP 的主要功能是建立连接、断开连接、切换连接以及控制流量。

为了完成其任务, 一台主机中的 NCP 必须与另一台主机中的 NCP 通信。为此, 每一对主机之间的某条特定链路被指定为控制链路。经控制链路收到的消息总是被 NCP 解释为一个或多个控制命令的序列。举例来说, 其中一类控制命令用于分配链路并发起连接, 而另一类则携带连接已终止的通知。下一节给出了控制命令语法和语义的部分概要。

一个主要问题是如何引用外部主机中的进程。每台主机都有自己的内部命名方案, 但这些方案往往互不兼容。由于强加一种通用的内部进程命名方案并不现实, 于是创建了一个中间命名空间, 并把命名空间中单独的一部分分配给每台主机。各主机自行负责把内部进程标识映射到自己的命名空间中。

命名空间的元素称为 socket。一个 socket 构成连接的一端, 而一条连接由一对 socket 完全确定。一个 socket 由三个数字拼接而成:

  • (a) 用户编号 (24 位)
  • (b) 主机编号 (8 位)
  • (c) AEN (8 位)

图 3 展示了一个典型的 socket。

每台主机被分配命名空间中所有字段 (b) 等于该主机自身标识的 socket。

一个 socket 要么是接收 socket, 要么是发送 socket, 这一点由 AEN 的低位比特标记 (0 = 接收, 1 = 发送)。AEN 的其余七位只是为每台主机上的每个已用编号提供数量可观的 socket。(AEN 代表 "another eight-bit number")

每个用户被分配一个 24 位的用户编号, 该编号在整个网络中唯一标识他。通常, 这个编号是他的归属主机的 8 位主机编号, 后跟 16 位, 后者唯一标识他在该主机上的身份。也可以做出安排, 让某个用户的用户编号不与特定主机绑定, 这种安排对于可能没有归属主机或拥有不止一台归属主机的移动用户来说是可取的。这个 24 位用户编号随后按以下方式使用。当用户登录到一台主机时, 系统会查找他的用户编号。此后, 该用户创建的每个进程都被打上他的用户编号标记。当用户经由网络登录到一台外部主机时, 也用同一个用户编号为他在这台主机中创建的进程打标记。外部主机获取用户编号的方式有两种: 像归属主机那样在登录时查询一张表, 或者注意呼叫方的标识。传播用户编号的效果是, 每个用户都创建了由自己所创建的进程构成的、属于他自己的虚拟网。这个虚拟网可以跨越任意数量的主机。因此, 用户将很容易以任意方式连接自己的进程, 同时仍允许他把自己的进程与其他虚拟网中的进程连接起来。

现在可以描述 socket 与进程之间的关系了 (见图 4)。对于每台主机上的每个用户编号, 有 128 个发送 socket 和 128 个接收 socket。一个进程可以向本地 NCP 请求使用具有相同用户编号的任意一个 socket; 若该 socket 未被其他方式占用, 请求即被批准。这里的关键观察是: 一个进程所请求的 socket 不可能已被占用, 除非是被同一虚拟网中的某个其他进程占用, 而这样的进程由同一个用户控制。

HOST-HOST 协议的一个不寻常之处在于, 进程可以把它这一端的连接从一个 socket 切换到另一个 socket。新的 socket 可以位于任意虚拟网和任意主机, 进程既可以在建立连接时发起切换, 也可以在此后发起。最一般的切换形式需要相当复杂的实现, 且与本文其余部分无关, 因此只解释一种受限的形式。这种受限的切换形式只允许进程在建立连接时用一个 socket 替换另一个 socket。新的 socket 必须具有相同的用户编号和主机编号, 而且连接仍然建立到同一个进程。因此, 这种切换形式只是给 socket 重新命名的一种方式, 因为消息的路由不发生任何改变。下一节我们记录系统调用和控制命令; 再下一节, 我们考虑登录可能如何实现。