跳到主要内容

I - 引言

在本文件中, MIT Project MAC 的网络工作组对 Carr、Crocker 和 Cerf 在其 1970 年 SJCC 论文预印本中所规定、并由 Crocker 在 NWG/RFC 36 中加以扩展的协议提出修改和扩充。本文件大致勾勒了我们的提案, 但并不试图成为一份完整的规范。它意在表明我们认为初期应当实现的协议的类型和范围。

我们赞同在具有唯一标识符的 socket 之间进行单工通信这一基本概念。我们提出实现 NWG/RFC36 中所规定的网络命令的一个稍作修改的子集, 再加上 Harslem 和 Heafner 在 NWG/RFC 40 中所规定的 ERR 命令。

考虑到让所有 ARPA 承包商尽早接入网络并彼此通信这一基本目标, 我们认为重要的是实现一套相当简单但又可扩展的初始协议, 同时满足网络的主要初期用途。它应当足够简单, 以便争取尽可能广泛的支持, 并且在各个站点只需增加最少量的软件即可实现。

协议会不断演进, 但一套被所有站点接受并实现的协议, 其基础部分很可能极难更改。因此, 让初始协议保持开放和灵活非常重要。一个简单的基本协议在这方面比一个复杂的协议更有可能成功。这并不排除在若干站点之间增加协议层次, 只要基本协议仍然得到支持。

我们认为初始协议必须提供三种设施:

  1. 两个已知如何彼此连接的既有进程之间的多路通信。

  2. 一种标准方式, 使一个进程能够连接到外部主机的 logger (主机上的登录进程) 并请求创建一个用户进程。(登录仪式可以标准化, 也可以不标准化。)

  3. 一种标准方式, 使一个新创建的进程能够发起与请求创建它的那个外部进程之间的伪打字机通信。

Carr、Crocker 和 Cerf 所提出的协议与本提案之间的主要差别如下:

  1. Crocker 在 NWG/RFC 36 中规定的动态重连策略被留待将来实现。我们认为把它纳入会使协议的初期实现不必要地复杂化。我们勾勒了一种不要求动态重连的外部进程创建策略。本提案中没有任何内容妨碍日后实现动态重连。

  2. 我们提出在 socket 标识符中增加一个 "实例标记", 以便把同一用户在同一主机上共存的多个进程所属的 socket 区分开来。

  3. 增加了以下 NCP 命令:

    1. 纳入了 NWG/RFC 40 中所规定的 ERR 命令。

    2. 提出 BLK 和 RSM 命令, 作为 NWG/RFC 36 中给出的 "cease on link" IMP 命令以及 SPD 和 RSM 命令的可能的替代方案。由于这些命令作用于 socket 连接而不是链路编号, 所以它们不妨碍在单个链路编号上实现 socket 连接复用 —— 假如日后证明这种复用是值得的。

    3. 规定了一条用于中断进程的 INT 命令。我们认为, 能够中断一个可能正陷于无谓计算或输出的进程极为重要。把中断作为普通消息中的一种特殊格式来实现会带来严重困难: 需要中断时连接可能已被阻塞, 而且 NCP 必须扫描每一条到达的消息以查找中断信号。

    4. 纳入了一条用于测试 NCP 之间通信的 ECO 回显命令。

  4. socket 被概念化为具有若干状态, 而这些状态与网络请求可能被排队的条件相关。这不同于无限制排队这一做法, 后者会带来某些实现上的困难。

  5. 关于创建外部进程以及与其通信的协议被移到一个单独的用户控制与通信 (UCC) 协议层次, 并得到了更完整的规定。