为套接字接口喝彩
摘要
这篇文章回顾了1983年发布的BSD 4.2套接字接口的历史影响,该接口标准化了网络访问,为现代在线服务铺平了道路。
暂无内容
查看缓存全文
缓存时间: 2026/07/29 03:51
# 套接字接口万岁!| APNIC 博客
来源:https://blog.apnic.net/2026/07/28/hooray-for-the-sockets-interface/
由 AI 生成。
1983 年,加州大学伯克利分校 (UCB) 发布了其 UNIX 操作系统 4.2 版本,即伯克利软件发行版 (BSD)。对许多人来说,这是定义在线服务诞生的“划时代事件”,因为正是这个版本将 BSD 的“套接字”网络模型推向了世界。实际上,当时计算系统和其上运行的操作系统恰好处于“天时地利”的时机。这导致了全球范围内网络服务访问量的大幅增长。
这种首个普适网络方法的安装是通过磁带完成的,而磁带则是通过邮寄获得的。
在现代人看来,这可能有些奇怪,因为现代操作系统的安装通常是通过网络驱动的。如果你不从网络下载完整的 ISO 镜像或可启动的 VMDK 磁盘镜像,你往往会下载一个较小的系统,然后通过网络自举启动。这很正常——网络被认为是理所当然的。
回溯到 20 世纪 80 年代,虽然“一个网络”可能存在,但它既过于狭隘——拨号电话的速度低至 1200 或 2400 波特——又缺乏通用的协议来指定如何查找和获取内容。即使你能访问“网络”,也很难可靠地检索到像新操作系统二进制代码这样的东西。几乎在每个地方,情况都各不相同。
套接字是改变这一切的故事中很大的一部分。有了套接字之后,联网的 UNIX 系统开始变得大体一致。我们达到了一种更标准化的网络访问模式。
更早版本的 BSD(用于 PDP-11 小型计算机)可追溯到 1978 年,通过磁带分发给全球的研究界:第 1 版代码有 30 份拷贝,第 2 版有 75 份拷贝。该系统是根据代表“加州大学董事会”颁发的许可证发布的,该许可证严格限制了责任和用户权利。你会通过邮件收到一卷磁带上的代码。
如果你想更新代码,董事会要求签署许可证的人员保持连续性。这导致了问题,因为学术角色常常在部门成员之间变动,而董事会的律师并未预料到这种情况。
当你像这样收到一卷磁带上的操作系统时,它由一系列线性的记录组成。每个记录都由一个“传输结束”(EOT) 标记表示,你可以跳过该标记到达下一个块。实际上,字节流是以固定格式读取的。
开始时,你会获得最小的十六进制代码,需要在交换机控制台上手动输入。这取决于你的计算机体系结构。该代码通过将第一个磁带块读入内存来引导,之后你跳转到内存中以将其作为引导加载程序运行。
输入十六进制意味着在一个 16 位字段上设置开关——向上或向下,开或关——对照打印列表检查它们,然后一次一个地址地将它们提交到内存中。这既慢又容易出错。真正的磁带结束标记是一个银色标签,它触发光电二极管停止磁带电机。
加载引导加载程序后,你可以格式化磁盘并将磁带存档 (TAR) 数据从磁带解压到磁盘上。这将所有操作系统文件编码到本地磁盘上。这个过程需要大半天时间。如果你需要重新编译系统,例如添加设备驱动程序,可能需要两到三天。尽管如此,许多人仍然接受这个成本以获得对 UNIX 系统的访问。
4.2BSD 版本附带了几项重大更改。这些包括错误修复、改进的文件系统配额方法和符号链接——最初这使习惯硬链接的用户感到困惑。与此相伴的是伯克利套接字网络系统,它是根据美国国防高级研究计划局 (DARPA) 的合同开发的。当时,人们并不清楚这有多重要。
## 在套接字之前
在此之前,在 UNIX 上访问网络服务依赖于诸如 cu 或 tip 之类的程序。这些程序充当终端模拟器,通过串行端口向调制解调器发送字符。许多早期的调制解调器是使用魔术贴连接到电话听筒上的声耦合器——一部分是麦克风,另一部分是扬声器。你通过拨打电话来建立连接。
诸如 Unix-to-Unix Copy Program (UUCP) 之类的工具使用调用 cu 或类似工具来建立连接,然后传输数据的脚本。即使使用 cu 也很慢。vi 编辑器(比尔·乔伊的 BSD 创新,他是 Sun Microsystems 的联合创始人)等工具中的终端类型减少了屏幕更新以适应慢速链接。
UUCP 是我们发送邮件、阅读网络新闻和接收(小)文件的方式。对于许多研究界人士来说,它实际上*就是*网络。其他人使用 IBM BITNET 或诸如英国科学与工程研究委员会网络 (SERC)(后来的 JANET,联合学术网络)之类的系统,这些系统运行在 X.25 数据网络上。
## 套接字和 UNIX 文件模型
套接字改变了这一切。它们提供了一种简单、一致的方式来连接到 ARPANET 系统。至关重要的是,它们复用了现有的 UNIX 抽象——文件描述符。简而言之,套接字的行为就像文件一样。
通过采用 UNIX 文件描述符模型,几乎所有写入文件或读取文件的程序都可以被转换为通过网络读写。将 UUCP 反向移植以在 ARPANET 上运行并不特别困难,而像用于文件传输的便捷程序 FTP、用于在线访问的 Telnet,以及用于 SMTP 邮件系统与 UNIX Sendmail 服务(BSD UNIX 系统的另一个特性)通信的后端,都很快随之而来。在非常短的时间内,几乎所有可以与套接字通信的东西都被编写成可以与套接字通信,或者有某种为你与套接字通信的垫片程序。
一切“都能正常工作”。或者,就 4.2BSD 的首次发布而言,实际上它并不能工作。
问题部分在于,大多数 4.2BSD 磁带的接收者都无法访问 ARPANET。当时,ARPANET 仅限于一小部分美国大学和研究机构,仅通过卫星在欧洲和亚洲有少数连接。大多数站点缺乏任何使用 ARPANET 协议的网络。例如,我工作的大学有以太网,但大多数机器是通过串行链路而非直接连接到它的。我们很幸运有两个连接到以太网的虚拟地址扩展 (VAX) 系统,但其中一个运行的是 VAX/VMS,并且当时尚未包含 ARPANET 网络代码。
套接字是通过将它们连接到 UNIX 域套接字来“运行”的,这类似于现有的管道机制。管道的行为类似于特殊文件;它们出现在文件系统中但不包含磁盘数据,并且读取依赖于另一个进程的写入。要测试套接字,你可以编写连接这些本地管道之一的 C 代码。然而,系统仍然存在缺陷——我们的第一次尝试就使 UNIX 崩溃了。发布时,套接字库实际上无法与任何东西通信。
## 从实验到标准
套接字并不是 ARPANET 协议的唯一候选接口。AT&T 贝尔实验室正在开发自己的网络 I/O 模型,称为“流”,后来作为 STREAMS 发布(似乎大写很重要,这与 AT&T 日益倾向于为任何有潜在价值的东西申请专利或版权的倾向有关)。与套接字类似,STREAMS 提供了一个非常类似于文件 I/O 的接口,这使其对于已经熟悉文件操作的 C 程序员来说非常容易上手。
然而,在实践中,STREAMS 远不那么易于使用。它的出现恰逢 AT&T 和 BSD 之间的法律纠纷。结果,大学董事会对分发磁带变得更加谨慎,而 AT&T 本身也对自己向更广阔的世界发布代码变得更加警惕。相比之下,套接字已经到来并且很容易获得。
比尔·乔伊的新公司 Sun Microsystems 很快以挑战 VAX 作为默认计算平台的身份爆炸性地进入市场,这次是基于 Motorola 68000 CPU 构建的。这些机器运行 UNIX,具体来说是 BSD 4.2 及其后续版本,因此出厂时就带有可用的套接字系统。这是一台桌面级计算机——快速、高分辨率的显示器,完整的 UNIX 环境,内置以太网,以及启动时即可工作的套接字代码。有什么理由不爱呢?
DEC 在市场上以发布 ULTRIX 作为回应,ULTRIX 构建在逐渐变小的 VAX 系统上。ULTRIX 大量借鉴了 BSD UNIX,或者至少包含了其重要元素,因此也包含了套接字。一个接一个地,主要制造商放弃了他们的专有操作系统或引入了某种形式的 UNIX 兼容性,并在此过程中获得了套接字代码。
甚至是开发了后来成为商业上无处不在的 UNIX 版本 System V 的 AT&T,也在其网络代码中采用了套接字。思想市场已经做出了决定;尽管流模型有其吸引人的品质,但网络意味着套接字。
从那时起,进展来自多个方向。Sun 的网络文件系统 (NFS),构建在 UDP 套接字上,被广泛采用。与此同时,出现了垫片层来驱动日益便宜的 IBM PC 以太网卡,将套接字抽象暴露给 Windows 环境。实际上,网络协议开发围绕 TCP/IP 和 UDP/IP 协议栈稳定下来,通过套接字进行访问。从那时起,大规模创新大多采取改进的形式——提高性能,或适应 IPv6——直到 QUIC 的出现,它重新构想了基于 UDP 的会话服务,并使 TCP 边缘化。然而,即使 QUIC 最终也需要写入一个 UNIX 套接字。
套接字征服了世界。
---
本博客作者表达的观点是其个人观点,不一定代表 APNIC 的观点。请注意,本博客适用行为准则 (https://blog.apnic.net/?p=395)。
相似文章
我尝试将 NetBSD 作为桌面系统使用,感觉像是以一种美好的方式步入了 90 年代
文章讲述了作者安装和使用 NetBSD 作为桌面操作系统的体验,强调了它的复古感以及作为 BSD Unix 后裔的历史意义。
死而未僵的软件:relayd(8) 与 httpd(8) 的持续演进
一篇博客文章,详细介绍了 OpenBSD 的 relayd(8) 和 httpd(8) 守护进程正在进行的复兴与现代化,包括使 imsg 消息系统现代化以及处理待定补丁的努力,作者称 LLM 是促使自己回归 C 语言编程的动因。
基于 NetBSD 的研究
本 NetBSD 画廊页面重点展示了各类基于该操作系统的学术及工业研究项目,包括 NASA 的卫星 TCP 实验、KAME IPv6/IPsec 项目以及高速网络演示。
F/OSS 漫画 #13:BSD Unix,第三部分——BSD Unix 的起源
F/OSS Comics #13 以漫画形式讲述 BSD Unix 的起源:Bill Joy 和 Chuck Haley 在 Ken Thompson 返回 Bell Labs 后自行探索 Unix 内核,于 1977 年打包 Pascal 系统与 ex 编辑器发布首个 BSD,并在 2BSD 中加入 vi、C shell 等工具,随后与 Özalp Babaoğlu 一起为 VAX 上的 32/V 加入虚拟内存支持。
WebSockets vs. SSE应关注事件顺序与一致性
本文主张,比较WebSockets与Server-Sent Events时应聚焦于事件顺序和一致性问题,以避免产生不一致的用户界面,而非仅仅关注延迟或简洁性。