摘要

  • Kermit 于 1981 年在 Columbia 诞生,回应学生和教职员工需要在大型主机与新出现的微型计算机之间交换文件。
  • 它以小型确认数据包运行在串行线路上,并通过字符、记录格式和协商选项来处理物理连接无法消除的系统差异。

Kermit 的首次传输演示,是两份 Kermit-20 程序通过空调制解调器电缆,在同一台 DECSYSTEM-20 的两个串行端口之间交换文件。Kermit 项目后来把它称为概念验证:在一台机器上复制文件本来更简单。几周后的跨机传输才是真正的考验。一端是运行 TOPS-20 的 DEC-20,另一端是运行 CP/M-80 的 Intertec Superbrain。处理器、操作系统和文件表示都不相同。真正的问题不只是如何把字节送过去。

Columbia 的计算环境正在发生变化。微型计算机进入实验室、院系、家庭和宿舍,而许多工作文件仍留在中央分时系统。Frank da Cruz 与 Bill Catchings 在 1983 年准备的一篇论文记述,按课程或学期分配的学生帐号并不保证磁盘空间可以长期保留。配有软盘的微型机可以让学生把作业保存在本地,但前提是他们能可靠地在小型计算机和主机之间传送文件。这是该校对自身问题的描述,不是对所有大学的普遍统计。

线路让差异更加难处理。普通异步串行链路很少能防止噪声、字符丢失、缓冲区溢出或载波间歇中断。Kermit 因而把一次传输拆成数据包,并将每个包纳入双向对话。发送端先发 Send-Init 包说明参数,接收端返回自己的参数;文件头给出文件名,数据包承载文件片段,另外的包分别标记文件结束和传输结束。收到确认后发送端继续;收到否定确认或超时后则重发。

这个基本机制刻意保持简单。包序号按模 64 递增,让两端识别刚确认的是哪一个数据单元,并在当前会话中发现缺失或重复的步骤。每个数据包必须带有一个单字符算术校验,帮助发现数据受损。它不是现代密码学校验值,也不证明终端另一端是谁;它的作用是让程序发现一部分传输错误并尝试重传。可靠性来自收发程序协作,而不是串行线突然变得可信。

Kermit 更大的互操作难题在线路之上。两台机器可以交换 ASCII 字符,却仍可能以不同方式理解文件。DEC-20 与 CP/M 的运行环境不同,IBM 大型机又带来额外约束。文件可能由记录组成而非简单字节流;文本字符集可以不同,主机终端还可能回显、自动换行、转换大小写或拦截控制字符。如果程序把连接当作完全透明的管道,文件内容可能在写入接收端磁盘之前就已改变。

Kermit 采用共同的交换表示,并要求两端明确执行转换。基础包语法使用可打印字符,数据中的控制字符可以被编码成可打印序列;每一端的程序再把交换格式转换为本地文件约定。协议手册把共同前提说得很窄:普通异步串行线路上的 ASCII。它没有让所有计算机变成一样,而是给它们一个有限的共同语言,跨过存储、编码和终端行为的差异。

实现能力不一样的程序也必须能够协作。1983 年 11 月的手册指出,Kermit 的开发分散而无序,无法强令实现者遵守一个固定版本。手册定义基本功能和可选功能,初始参数交换则让双方通报能力。它表达的设计目标是:功能简单的实现也能与更高级的实现通信。这是设计意图,不是所有 Kermit 程序组合都互通的证据。

基础协议并没有因此停止演进。后来的版本加入更长的数据包、更强的校验和全双工滑动窗口。手册把滑动窗口扩展归于 The Source Telecomputing 的团队,时间为 1985 至 1986 年。它解决另一个性能问题:在延迟较高的链路上,每个包发出后都等待确认会浪费时间。该功能需要通过参数协商;不支持它的接收端可以继续使用基础交互方式。因此,这属于后来的扩展,不应倒推到 1981 年的首次传输。

Kermit 项目时间线记载,1984 年建立了 FTP 站点和 ARPANET 上的 Info-Kermit 邮件列表。网络让程序更容易传播和讨论,但它最初要解决的问题仍很具体:用户想把文件从一种计算机送到另一种。Kermit 不是互联网标准,也没有取代网络协议。它承担另一层工作:让由串行线路或后来网络服务相连的系统之间可以传文件。

这段历史说明,连通并不等于互操作。载波信号可以连接两个终端,却不能自动使其文件兼容;包校验能发现一部分损坏,却不认证发送者;共同规范可以允许交换,却不能保证每个实现都采用每项扩展。Kermit 把这些接口问题变成了明确且可实现的对话。

资料来源