蓝图 · 244 字 · 1 分钟阅读

@ 符号:电子邮件是怎么被偷偷带进 ARPANET 的

Ray Tomlinson 把两个已经存在的程序粘到一起,作为一个未经授权的副业;挑了一个没人会出现在名字里的标点,意外造出了这个网络的第一个杀手级应用。

#TL;DR

1971 年,BBN 的 Ray Tomlinson 把一个叫 SNDMSG 的本地消息程序和一个叫 CPYNET 的文件传输工具粘到一起,加上了一种指明某个用户在哪台机器上的写法。他需要一个不可能出现在任何合理用户名中的分隔符,于是他低头看着他的 Teletype Model 33,选了 @。他告诉同事别告诉任何人,因为这不是他被指派做的项目。两年之内,邮件就占了 ARPANET 总流量的 75%。本来为远程计算而资助的网络,意外成了给人类交流的网络——而每当一个新平台偶然发现自己的真正用途时,这个模式都会重演。

#副业

1971 年,Tomlinson 是 Bolt Beranek and Newman 的一名工程师。BBN 就是给 ARPANET 造 IMP 的那家剑桥公司。他被分派的工作是 PDP-10 上的 TENEX 操作系统,TENEX 当时在越来越多的 ARPANET 站点上运行。

TENEX 已经有一个叫 SNDMSG 的程序。它把一条消息投到同一台机器上另一位用户的邮箱文件里——本质上,就是往一个共享文件里写东西。那个时代每一个分时操作系统都有类似的东西。单机上的用户间通信已经存在了将近十年。

Tomlinson 还在写一个叫 CPYNET 的新网络程序,用于在 ARPANET 主机之间传文件。没什么花哨——一个 FTP 前身的拷文件工具。CPYNET 能工作。SNDMSG 也能工作。在这中间,Tomlinson 冒出了一个不在他任务清单上的想法。

“我决定看看能不能把文件传输程序放进消息程序里,这样不是写到本地邮箱文件,而是写到远程邮箱文件。”

用他自己的话说,这根本不是他应该做的事。

#为什么是 @

技术问题微不足道:改 SNDMSG 使它能接受一个可能包含远程主机的目标,然后不调用本地文件写入,改调用 CPYNET。设计问题在地址。SNDMSG 已经接受用户名,现在它需要区分用户和机器。

Tomlinson 需要一个分隔符。它必须:

  • 是单个字符。
  • 永远不会合法地出现在用户名里。
  • 在当时系统的 shell 里不是元字符。
  • 在人们使用的终端键盘上真的存在。

他面前的终端是 Teletype Model 33——ARPANET 时代的工作主力,也是把 7 位 ASCII 钉死的那个东西。它的键盘上恰好 64 个可打印字符。大多数标点都已经在承重:. 在文件名里、, 是常见的列表分隔符、:; 被操作系统的命令解析器占用、/\ 是路径分隔符、_- 常用在用户名里。

@ 符号,基本没被用过。在 TENEX 上它没有保留语义。在 Tomlinson 见过的每一个用户账户上,也没人敢把 @ 放进名字里。而且它在英语里有一个漂亮的读法:user at host

他选了它。

  tomlinson @ bbn-tenexa
  ───────────  ──────────
     user        host

整件事就是一个傍晚的 hack。Tomlinson 后来演示给他的同办公室同事 Jerry Burchfiel 看。在多次转述中他那句原话是:

“别告诉任何人。这不是我们该做的事。“

#第一封电子邮件

Tomlinson 在 BBN 机房里并排放着的两台 PDP-10 之间发出了第一封网络邮件,通过 ARPANET 相连。两台机器物理上只隔大约十英尺远。数据包还是要跑到 BBN 的 IMP 再回来。

他不记得那条消息里写了什么。他后来告诉采访者:“可能是类似 QWERTYUIOP 的东西。” 没有仪式,没有照片,没有日志,因为这根本不是一个被立项的项目。第一个全网邮件系统里发出的第一条消息,实际上已经丢了。

第二年,Tomlinson 改过的 SNDMSG 就对其他 BBN 用户开放了。几个月之内,ARPA 那边跑 ARPANET 项目的 Larry Roberts 就写了一个叫 RD 的收邮件程序,因为他的邮件多到没法手工处理了。那个程序本身就是一个信号。当整个项目的负责人都需要工具来应付自己的收件箱时,你就有一个真正的产品了。

#它多快吃掉了 ARPANET?

大家引用的数字来自 1973 年的一份 ARPA 研究,试图搞清楚这个网络到底被用来做什么。规划者们——按资助初衷来看也合理——假设 ARPANET 将主要承载研究人员使用远方超级计算机的远程登录会话文件传输

研究发现邮件已经占了总流量的约四分之三

那是 Tomlinson 搞完 hack 两年之后的事。没有营销,ARPA 也没有备忘录推广它。这个增长完全是自然的,把经营网络的那些人打了个措手不及。

1973 年那份报告建议 ARPA 认真对待邮件。不管 ARPA 背不背书,社区反正要用。

#Tomlinson 真正发明了什么

技术上的产出很小。Tomlinson 并没有发明:

  • 电子消息这个概念——本地的 SNDMSG 类工具比他早了好多年。
  • 文件传输——CPYNET 已经存在。
  • 把邮件标准化为协议——那要到 RFC 561(1973)之后,最终是 RFC 821(1982),SMTP 正式规定了邮件服务器该做什么。

真正发明的,是五十年里所有邮件系统都沿用下来的地址约定:

user@host

用户名在左边,主机在右边。投递靠看 @ 之后的部分决定。整个全球邮件体系——从早期的 UUCP 叹号写法(host!user!user),到现代的用 DNS MX 记录的 SMTP——最终都统一到了 Tomlinson 这个语法上。即使拒绝了早期 ARPANET 邮件其他一切的系统,也都保留了 @

整整一些欧洲语言必须为这个字符借造新词——意大利语 “chiocciola”(蜗牛)、荷兰语 “apenstaart”(猴尾巴)、波兰语 “małpa”(猴子)、德语 “Klammeraffe”(蜘蛛猴)。在 Tomlinson 让它变得普世之前,这个字符在多数欧洲打字机键盘上都没有。今天它们都有了,就因为他。

#未经授权的副业模式

ARPANET 那篇文章把这称为”意外的杀手级应用”。那种表述低估了一个在计算机史里反复出现的模式:

  • ARPANET 上的邮件是未经授权的副业。
  • CERN 的 World Wide Web 是未经授权的副业——Tim Berners-Lee 换着名字提了三次,管理层才让他做。
  • Google 内部的 Gmail 是 Paul Buchheit 的 20% 项目。
  • Slack 最早只是一家即将倒闭的游戏公司里的内部工具。

模式是一致的:为目的 A 造出的平台,经常发现真正的用途是目的 B,而目的 B 几乎总是比造它的人预期的更人性、更不技术。ARPA 建了一个为分享稀缺 CPU 周期的网络,人们却把它变成了一个尽可能快地给朋友发信的网络。

Tomlinson 的改动很小,但教训不小。如果你建了一个通用平台,又给了用户足够的绳子,杀手级应用一定会从你立项备忘录没预料到的方向冒出来——多半是某个人的副业,多半带着一个听起来很合理、用来解释为什么它不在正式排期里的借口。

而要是那个应用需要一个分隔符:@ 已经被占用了。