摘要

  • XMODEM 把公共部分压缩为 128 字节数据块、块编号及其反码、简单校验和、接收方驱动的确认与明确的结束信号;它没有把拨号、文件系统或产品界面变成协议义务。
  • 这种克制降低了独立实现与互测的成本,也把缺陷暴露在边界上:校验能力有限、停等机制受时延影响、原始协议没有文件名与精确长度。后继者可以自愿扩展,而不必由一个中心服务重新解释全部端点。

传输从一个 NAK 开始

今天的网络交互往往由发送方主动推送。XMODEM 的开场却很有辨识度:接收程序在超时后发出 NAK,告诉另一端自己已经准备好。发送方随后给出 SOH、块编号、编号的逐位反码、128 字节数据和一个校验和。接收方重新计算,正确就回 ACK,错误就回 NAK。文件结束时,发送方发 EOT,并等待最后一次确认。

这组动作没有调度中心。线路两端只需对少量字节及其顺序达成一致,就能在有噪声的异步连接上推进状态。块编号从一开始递增;反码帮助接收方发现头部损坏;数据校验和把 128 个字节相加并丢弃进位。它并不强大,却足够小,能够在受限的微型计算机上实现。

Christensen 在 1982 年写下的协议说明还处理了一个关键歧义:如果接收方收到的不是下一个块,而是刚刚那个块的重复,它不应立刻判定传输失序。更常见的解释是数据已到达,但 ACK 在回程中受损,于是发送方重传。接收方确认重复块,却不能把同一份数据写两次。

这是一种局部恢复。双方凭块号、上一状态和一个响应字节解决问题,不需要把原始记录交给第三方裁决。如果出现无法解释的块号,连接仍可能中止;协议只是限定并处理了“确认丢失”这一类歧义,而非承诺消除所有故障。

128 字节既是选择也是边界

128 并非抽象数学最优值。它来自 Christensen 当时面对的 CP/M 磁盘扇区与设备条件。固定长度让缓冲、读写和代码都更直接,也让不同机器比较容易复制同一行为。最后一个不足 128 字节的块仍需填充,这又意味着文件的精确长度必须从别处获知。

协议本身不带文件名,不负责拨电话,不定义用户账户、目录、计费、磁盘布局或进度界面。它甚至没有把批量传输纳入最初的共同层。这些遗漏使 XMODEM 不像一项完整服务,却恰好构成它的治理结构:共同层只规定互操作所需的线级事实,端点仍可选择如何连接、保存与呈现。

Christensen 后来把 1977 年的工作称为解决个人需要的匆忙成果,并认为早期完成和立即置于公共领域帮助它成为事实标准。这是发明者的回顾,不是能够分离因果因素的实验。但传播机制并不神秘。程序足够短,可以抄录、检查、移植并与另一个实现实际互测;新实现者不必向某个网络所有者申请许可。

它是事实标准,不是 IETF 标准

1984 年发布的 RFC 916 在附录中讨论 MODEM/XMODEM,是因为它已广泛用于微型计算机;RFC 正文提出的则是另一套可靠异步传输方案。把 XMODEM 称作 IETF 制定的标准,会倒转历史关系。它先由实践形成公共约定,后被技术文献拿来比较。

同一份 RFC 也记录了不能被怀旧滤镜抹去的问题。XMODEM 是单向数据流;固定 128 字节包并不适合所有中间设备;在长往返时延下,一块一确认的停等方式会浪费线路能力。八位加法校验也无法捕捉所有错误模式。

这些缺陷没有让最小协议自动正确,却让改进对象清楚可见。实施者可以观察重试率、吞吐、误检与尾块处理,再判断是否采用更强的校验或更大的块。相比之下,一个大型中心服务若把传输、身份、存储与发现混在内部,外部往往只看见“成功”或“失败”,很难知道应替换哪一层。

扩展靠互操作赢得位置

后来的相关实现加入 CRC-16、可选的 1K 块,以及用第零块携带文件名、时间和大小。Chuck Forsberg 分发的程序推动了这些做法,并形成 YMODEM 等名称。它们不是中心机构下发的强制升级,而是独立端点通过实现、试用与传播逐步采用的扩展。

Christensen 反对直接把全双工、多个未确认块或多个目的地塞回 XMODEM 核心。他不是说这些功能无用,而是认为协议之所以在许多机器和程序中存活,原因之一正是极端简单。若扩展必须让旧端点立刻失效,那么它改变的不只是能力,还改变了谁有权重写公共基线。

自愿采用也不是秩序的同义词。历史协议资料反复提醒,同一个“YMODEM”标签可能被不同产品用于不兼容行为。名称不能证明互操作。真正的采用循环仍是提议、实现、测试文件、受限部署、观察失败、标注能力,再把真实行为写入文档。

BBS 是环境,不是协议字段

1978 年芝加哥暴风雪之后,Christensen 与 Randy Suess 合作建立 CBBS:Suess 负责硬件,Christensen 编写软件。BBS 接听电话、管理留言,逐渐成为人们反复访问的线上场所。XMODEM 则只把文件从一端移到另一端。二者在早期拨号文化中相邻,却不应被写成同一个发明。

正因为传输层没有试图成为唯一的 BBS 服务,许多公告板、终端程序与本地工作流才能各自接入文件交换。公共约定提供的是兼容底面,而不是统一产品。

128 字节数据块今天看来微小,真正值得继承的却不是这个数字。更重要的是划线方法:把严格性集中到每个参与者必须共享的地方,把其余决定留给能够观察本地条件的人。端点并非没有约束;它们只是不用在共同传输不要求一致的地方也变得相同。

资料来源