01| 回顾经典:TCP/IP和Linux是如何改变世界的?

发布时间:2026/7/3 11:45:06
01| 回顾经典:TCP/IP和Linux是如何改变世界的? 引言今天是网络编程课程的第一章我想你一定满怀热情期望快速进入到技术细节里了解那些你不熟知的编程技能。而今天我却想和你讲讲历史虽然这些事情看着不是“干货”但它可以帮助你理解网络编程中各种技术的来龙去脉。你我都是程序员说句实在话我们正处于一个属于我们的时代里我们也正在第一线享受着这个时代的红利。在我看来人类历史上还从来没有一项技术可以像互联网一样深刻地影响人们生活的方方面面。而具体到互联网技术里有两件事最为重要一个是 TCP/IP 协议它是万物互联的事实标准另一个是 Linux 操作系统它是推动互联网技术走向繁荣的基石。今天我就带你穿越时间的走廊看一看 TCP/IP 事实标准和 Linux 操作系统是如何一步一步发展到今天的。TCP 发展历史一般来说我们认为互联网起源于阿帕网ARPANET。最早的阿帕网还是非常简陋的网络控制协议Network Control Protocol缩写 NCP是阿帕网中连接不同计算机的通信协议。在构建阿帕网ARPANET之后其他数据传输技术的研究又被摆上案头。NCP 诞生两年后NCP 的开发者温特·瑟夫Vinton Cerf和罗伯特·卡恩Robert E. Kahn一起开发了一个阿帕网的下一代协议并在 1974 年发表了以分组、序列化、流量控制、超时和容错等为核心的一种新型的网络互联协议一举奠定了 TCP/IP 协议的基础。OSI TCP/IP在这之后TCP/IP 逐渐发展。咱们话分两头说一头是一个叫 ISO 的组织发现计算机设备的互联互通是一个值得研究的新领域于是这个组织出面和众多厂商游说“我们一起定义出一个网络互联互通的标准吧这样大家都遵守这个标准一起把这件事情做大大家就有钱赚了”。众多厂商觉得可以啊于是 ISO 组织就召集了一帮人认真研究起了网络互联这件事情还真的搞出来一个非常强悍的标准这就是 OSI 参考模型。这里我不详细介绍 OSI 参考模型了。这个标准发布的时候已经是 1984 年了有点尴尬的是OSI 搞得是很好大家也都很满意不过等它发布的时候ISO 组织却惊讶地发现满世界都在用一个叫做 TCP/IP 协议栈的东西而且跟 OSI 标准半毛钱关系都没有。这就涉及到了另一头——TCP/IP 的发展。事实上我在前面提到的那两位牛人卡恩和瑟夫一直都在不遗余力地推广 TCP/IP。当然TCP/IP 的成功也不是偶然的而是综合了几个因素后的结果TCP/IP 是免费或者是少量收费的这样就扩大了使用人群TCP/IP 搭上了 UNIX 这辆时代快车很快推出了基于套接字socket的实际编程接口这是最重要的一点TCP/IP 来源于实际需求大家都在翘首盼望出一个统一标准可是在此之前实际的问题总要解决啊TCP/IP 解决了实际问题并且在实际中不断完善。回过来看OSI 的七层模型定得过于复杂并且没有参考实现在一定程度上阻碍了普及。不过OSI 教科书般的层次模型对后世的影响很深远一般我们说的 4 层、7 层也是遵从了 OSI 模型的定义分别指代传输层和应用层。我们说 TCP/IP 的应用层对应了 OSI 的应用层、表示层和会话层TCP/IP 的网络接口层对应了 OSI 的数据链路层和物理层。UNIX 操作系统发展历史前面我们提到了 TCP/IP 协议的成功离不开 UNIX 操作系统的发展。接下来我们就看下 UNIX 操作系统是如何诞生和演变的。下面这张图摘自维基百科它将 UNIX 操作系统几十年的发展历史表述得非常清楚。UNIX 的各种版本和变体都起源于在 PDP-11 系统上运行的 UNIX 分时系统第 6 版1976 年和第 7 版1979 年它们通常分别被称为 V6 和 V7。这两个版本是在贝尔实验室以外首先得到广泛应用的 UNIX 系统。这张图画得比较概括我们主要从这张图上看 3 个分支图上标示的 Research 橘黄色部分是由 ATT 贝尔实验室不断开发的 UNIX 研究版本从此引出 UNIX 分时系统第 8 版、第 9 版终止于 1990 年的第 10 版10.5。这个版本可以说是操作系统界的少林派。天下武功皆出少林世上 UNIX 皆出自贝尔实验室。图中最上面所标识的操作系统版本是加州大学伯克利分校BSD研究出的分支从此引出 4.xBSD 实现以及后面的各种 BSD 版本。这个可以看做是学院派。在历史上学院派有力地推动了 UNIX 的发展包括我们后面会谈到的 socket 套接字都是出自此派。图中最下面的那一个部分是从 ATT 分支的商业派致力于从 UNIX 系统中谋取商业利润。从此引出了 System III 和 System V被称为 UNIX 的商用版本还有各大公司的 UNIX 商业版。下面这张图也是源自维基百科将 UNIX 的历史表达得更为详细。一个基本事实是网络编程套接字接口最早是在 BSD 4.2 引入的这个时间大概是 1983 年几经演变后成为了事实标准包括 System III/V 分支也吸收了这部分能力在上面这张大图上也可以看出来。其实这张图也说明了一个很有意思的现象BSD 分支、System III/System V 分支、正统的 UNIX 分时系统分支都是互相借鉴的也可以说是互相“抄袭”吧。但如果这样发展下去互相不买对方的账导致上层的应用程序在不同的 UNIX 版本间不能很好地兼容这该怎么办这里先留一个疑问你也可以先想一想稍后我会给你解答。下面我再介绍几个你耳熟能详的重要 UNIX 玩家。SVR 4SVR4UNIX System V Release 4是 ATT 的 UNIX 系统实验室的一个商业产品。它基本上是一个操作系统的大杂烩这个操作系统之所以重要是因为它是 System III/V 分支各家商业化 UNIX 操作系统的“先祖”包括 IBM 的 AIX、HP 的 HP-UX、SGI 的 IRIX、Sun后被 Oracle 收购的 Solaris 等等。SolarisSolaris 是由 Sun Microsystems现为 Oracle开发的 UNIX 系统版本它基于 SVR4并且在商业上获得了不俗的成绩。2005 年Sun Microsystems 开源了 Solaris 操作系统的大部分源代码作为 OpenSolaris 开放源代码操作系统的一部分。相对于 Linux这个开源操作系统的进展比较一般。BSDBSDBerkeley Software Distribution我们上面已经介绍过了是由加州大学伯克利分校的计算机系统研究组CSRG研究开发和分发的。4.2BSD 于 1983 年问世其中就包括了网络编程套接口相关的设计和实现4.3BSD 则于 1986 年发布正是由于 TCP/IP 和 BSD 操作系统的完美拍档才有了 TCP/IP 逐渐成为事实标准的这一历史进程。macOS X用 mac 笔记本的同学都有这样的感觉macOS 提供的环境和 Linux 环境非常像很多代码可以在 macOS 上以接近线上 Linux 真实环境的方式运行。有心的同学应该想过这背后有一定的原因。答案其实很简单macOS 和 Linux 的血缘是相近的它们都是 UNIX 基础上发展起来的或者说它们各自就是一个类 UNIX 的系统。macOS 系统又被称为 Darwin它已被验证过就是一个 UNIX 操作系统。如果打开 Mac 系统的 socket.h 头文件定义你会明显看到 macOS 系统和 BSD 千丝万缕的联系说明这就是从 BSD 系统中移植到 macOS 系统来的。Linux我们把 Linux 操作系统单独拿出来讲是因为它实在太重要了全世界绝大部分数据中心操作系统都是跑在 Linux 上的就连手机操作系统 Android也是一个被“裁剪”过的 Linux 操作系统。Linux 操作系统的发展有几个非常重要的因素这几个因素叠加在一起造就了如今 Linux 非凡的成就。我们一一来看。UNIX 的出现和发展第一个就是 UNIX 操作系统要知道Linux 操作系统刚出世的时候 4.2/4.3 BSD 都已经出现快 10 年了这样就为 Linux 系统的发展提供了一个方向而且 Linux 的开发语言是 C 语言C 语言也是在 UNIX 开发过程中发明的一种语言。POSIX 标准UNIX 操作系统虽然好但是它的源代码是不开源的。那么如何向 UNIX 学习呢这就要讲一下 POSIX 标准了POSIXPortable Operating System Interface for Computing Systems这个标准基于现有的 UNIX 实践和经验描述了操作系统的调用服务接口。有了这么一个标准Linux 完全可以去实现并兼容它这从最早的 Linux 内核头文件的注释可见一斑。这个头文件里定义了一堆 POSIX 宏并有一句注释“嗯也许只是一个玩笑不过我正在完成它。”# ifndef _UNISTD_H # define _UNISTD_H /* ok, this may be a joke, but Im working on it */ # define _POSIX_VERSION 198808L # define _POSIX_CHOWN_RESTRICTED /* only root can do a chown (I think..) */ /* #define _POSIX_NO_TRUNC*/ /* pathname truncation (but see in kernel) */ # define _POSIX_VDISABLE \0 /* character to disable things like ^C */ /*#define _POSIX_SAVED_IDS */ /* well get to this yet */ /*#define _POSIX_JOB_CONTROL */ /* we arent there quite yet. Soon hopefully */POSIX 相当于给大厦画好了图纸给 Linux 的发展提供了非常好的指引。这也是为什么我们的程序在 macOS 和 Linux 可以兼容运行的原因因为大家用的都是一张图纸只不过制造商不同程序当然可以兼容运行了。Minix 操作系统刚才提到了 UNIX 操作系统不开源的问题那么有没有一开始就开源的 UNIX 操作系统呢这里就要提到 Linux 发展的第三个机遇Minix 操作系统它在早期是 Linux 发展的重要指引。这个操作系统是由一个叫做安迪·塔能鲍姆Andy Tanenbaum的教授开发的他的本意是用来做 UNIX 教学的甚至有人说如果 Minix 操作系统也完全走社区开放的道路那么未必有现在的 Linux 操作系统。当然这些话咱们就权当作是马后炮了。Linux 早期从 Minix 中借鉴了一些思路包括最早的文件系统等。GNULinux 操作系统得以发展还有一个非常重要的因素那就是 GNUGNU’s NOT UNIX它的创始人就是鼎鼎大名的理查·斯托曼Richard Stallman。斯托曼的想法是设计一个完全自由的软件系统用户可以自由使用自由修改这些软件系统。GNU 为什么对 Linux 的发展如此重要呢事实上GNU 之于 Linux 是要早很久的GNU 在 1984 年就正式诞生了。最开始斯托曼是想开发一个类似 UNIX 的操作系统的。From CSvax:pur-ee:inuxc!ixn5c!ihnp4!houxm!mhuxi!eagle!mit-vax!mit-eddie!RMS MIT-OZFrom: RMS% MIT-OZ mit-eddieNewsgroups: net.unix-wizards,net.usoftSubj ect: new UNIX implementationDate: Tue, 27-Sep-83 12:35:59 ESTOrganization: MIT AI Lab, Cambridge, MAFree Unix!Starting this Thanksgiving I am going to write a complete Unix-compatible software system called GNU (for Gnu’s Not Unix), and give it away free to everyone who can use it. Contributions of time,money, programs and equipment are greatly needed.To begin with, GNU will be a kernel plus all the utilities needed to write and run C programs: editor, shell, C compiler, linker, assembler, and a few other things. After this we will add a text formatter, a YACC, an Empire game, a spreadsheet, and hundreds of other things. We hope to supply, eventually, everything useful that normally comes with a Unix system, and anything else useful, including on-line and hardcopy documentation.…在这个设想宏大的 GNU 计划里包括了操作系统内核、编辑器、shell、编译器、链接器和汇编器等等每一个都是极其难啃的硬骨头。不过斯托曼可是个牛人单枪匹马地开发出世界上最牛的编辑器 Emacs继而组织和成立了自由软件基金会the Free Software Foundation - FSF。GNU 在自由软件基金会统一组织下相继推出了编译器 GCC、调试器 GDB、Bash Shell 等运行于用户空间的程序。正是这些软件为 Linux 操作系统的开发创造了一个合适的环境比如编译器 GCC、Bash Shell 就是 Linux 能够诞生的基础之一。你有没有发现GNU 独缺操作系统核心实际上1990 年自由软件基金会开始正式发展自己的操作系统 Hurd作为 GNU 项目中的操作系统。不过这个项目再三耽搁1991 年Linux 出现1993 年FreeBSD 发布这样 GNU 的开发者开始转向于 Linux 或 FreeBSD其中Linux 成为更常见的 GNU 软件运行平台。斯托曼主张Linux 操作系统使用了许多 GNU 软件正式名应为 GNU/Linux但没有得到 Linux 社群的一致认同形成著名的 GNU/Linux 命名争议。GNU 是这么解释为什么应该叫 GNU/Linux 的“大多数基于 Linux 内核发布的操作系统基本上都是 GNU 操作系统的修改版。我们从 1984 年就开始编写 GNU 软件要比 Linus 开始编写它的内核早许多年而且我们开发了系统的大部分软件要比其它项目多得多我们应该得到公平对待。”从这段话里我们可以知道 GNU 和 GNU/Linux 互相造就了对方没有 GNU 当然没有 Linux不过没有 LinuxGNU 也不可能大发光彩。在开源的世界里也会发生这种争名夺利的事情我们也不用觉得惊奇。操作系统对 TCP/IP 的支持讲了这么多操作系统的内容我们再来看下面这张图。图中展示了 TCP/IP 在各大操作系统的演变历史。可以看到即使是大名鼎鼎的 Linux 以及 90 年代大发光彩的 Windows 操作系统在 TCP/IP 网络这块也只能算是一个后来者。总结是我们专栏的第一讲我没有直接开始讲网络编程而是对今天互联网技术的基石TCP 和 Linux 进行了简单的回顾。通过这样的回顾熟悉历史可以指导我们今后学习的方向在后面的章节中我们都将围绕 Linux 下的 TCP/IP 程序设计展开。最后你不妨思考一下Linux TCP/IP 网络协议栈最初的实现“借鉴”了多少 BSD 的实现呢Linux 到底是不是应该被称为 GNU/Linux 呢