从纸带到芯片:计算机系统的六层骨架

想象你在 1950 年的某个早晨,第一次按下一台房间大小的机器。这台机器不会「思考」,也不会「猜你的意图」。它只是忠实地把你写在打孔卡上的 0 和 1 翻译成另一串 0 和 1。今天你打开笔记本电脑、手机、智能音箱,做的也是同一件事,只是机器从房间缩小到了口袋。读完这篇专题,你会发现这七十多年里变的是尺寸、速度和外壳,不变的是一台机器「被告知做什么」的底层规则。

本章按六个层次递进:先给「计算」下一个明确契约,再把图灵 1936 年形式化的理论模型落到冯·诺依曼 1945 年的工程实现,然后展开今天的真实硬件、软件、操作系统,最后用网络和一段两千年的工具演进史把整张图收拢。每一层都是下一层的台阶;走完全程,你应当能用一句话说出「为什么我们今天用的计算机是现在这个样子」。


1. 什么是「计算」:从日常直觉到契约定义

「计算」一词在日常语境里几乎什么都装。算一下 17×24 算计算,预测明天下不下雨也是计算。但计算机科学要的是一种更紧的定义:必须先讲清楚输入是什么、规则是什么、输出是什么,过程才算被「定义」过。任何含糊都会产生含糊或错误的结果,因为计算机只遵循字面指令,从不揣测意图。

先把抽象的「输入→计算→输出」落到一张具体图上:

图注:上半部分是输入 → 计算 → 输出的通用模型,三个节点由橙色箭头串联,右侧并列一张黑白算盘实物照作为「机械计算工具」的视觉锚点;下半部分用两个具体例子演示同一契约:左例是算术,把数列 [4, 8, 15, 16, 23, 42] 通过 Sum 规则算出 108;右例是非算术,把同一数列通过 Sort 规则按降序排成 [42, 23, 16, 15, 8, 4]。规则不同,输出就不同;契约结构完全一样。

这个三段式不是新术语,它就是任何任务的事前清单。把数字 6、3、1、4、2、5 排成升序,契约就是:输入是「6 个数字」,规则是「任意两个数比较,按需要交换」,输出是「按从小到大排列的 6 个数字」。漏掉任何一项,任务就说不清楚。本章把这种事前清单称为「契约」(contract,作为本章教学术语,便于后文反复引用),并要求学生用它描述任何计算任务。需要注意的是,Forouzan 教材第 1 章原文使用的是「输入数据 → 计算 → 输出数据」三段式数据流(data processor / programmable data processor),并未使用「契约」一词;「契约」是本章中文叙述引入的术语。后续章节所有更复杂的概念,本质上都是这个三段式的细化版本:图灵机、CPU 指令周期、网络协议,无一例外Forouzan 4e。

更具体地说,计算的规则必须满足三条铁律:有限、有序、无歧义。「有限」意味着一台机器执行规则的过程要在可数步骤内结束,而不是可以无限循环下去;「有序」意味着每一步执行哪条规则由当前状态唯一确定,不允许「看你心情」;「无歧义」意味着任何时刻读到当前符号和状态,对应的下一步动作必须只有一种解释,否则机器内部就会陷入「两个答案都合理」的瘫痪。这三条铁律不是工程师拍脑袋的偏好,而是图灵在 1936 年形式化「可计算」一词时就定死的底线。后文第 2 章会回到这里。

所以这一章最值钱的不是「输入输出」两个词,而是这个三段式可以原封不动地搬到任何后续概念:图灵机的「读写头读一格」对应输入,「规则表查一行」对应规则,「写回纸带」对应输出;CPU 的「取指—译码—执行—存结果」对应一次循环;网络的「请求—应答」对应一次远程契约。把这三个词刻进脑子里,后面所有图都会变成它的具体形状。


2. 图灵机:把「计算」形式化的最干净框架

Alan Turing 在 1936 年回答了「计算到底是什么意思」这个问题。他没有去造一台物理机器,而是给出了一个抽象模型。后世俗称「图灵机」,它是后续所有计算机的理论模板,但本身不是任何一台真实机器Turing 1936。

一个图灵机由三部分组成:

  • 一条无限长的纸带,分成一格一格,每格写一个符号(最简情形下是 0 或 1)。它类比今天的内存。
  • 一个读写头,贴在纸带的某一格上。它能读出当前格子的符号,也能擦掉重写一个新的符号,然后向左或向右移动一格。它类比今天的 CPU。
  • 一张规则表,告诉读写头「如果当前状态是 A、当前符号是 1,那就把这一格改成 0、向右移一格、切换到状态 B」。规则表类比今天的程序。

下面这张图给出了「同一台图灵机」的三种等价画法。三种图都在做同一件事:

图注:三种等价图形表示并排呈现。Kleene 1952 的画法把当前状态 q₄ 写在被扫描格的上方,纸带用一串分格小方框表示,可向两端延伸;Minsky 1967 的画法在被扫描格下方画一个五边形头部;Peterson 1988 的画法在磁带下方单独画一张 TABLE 转换表。三种画法指同一个模型,只是把「状态」画在哪个位置不同Wikimedia Commons。

这里有一个必须在第一次出现时就纠正的常见混淆:图灵机不是一台物理机器,也不是某个具体品牌的计算机。它是一个抽象的数学模型,用来回答「什么样的过程能被称作计算」,不回答「这台机器怎么用电」。把它当成物理机器去想象,会让后面所有的工程讨论失去着力点。

每一步操作都遵循同样的四拍:

  1. 读(Read):读写头观察当前格子里的符号。
  2. 决(Decide):根据当前状态 + 当前符号,在规则表里查出该执行的规则。
  3. 写(Write):按规则把当前格改成新符号。
  4. 移(Move):向左或向右移动一格,并切换到下一个状态。

一个函数如果能用某台图灵机算出它的值,就称其为图灵可计算。这是一个非常强的断言。它在说什么呢?如果你的规则表能在有限步骤内停下来给出一个答案,那么这件事原则上可以被一台(想象中的)机器自动完成。反过来,如果连图灵机都做不了,那么任何物理计算机也做不了。今天所有通用计算机能做的事情,不超过一台通用图灵机;这是 Church–Turing 论题(丘奇—图灵论题)的核心内容——它是数学共识,尚未被证明,但在实践中从未被推翻。Turing 1936 论文里证明的,是 Church「effective calculability」与 Turing「computability」的数学形式等价(已被证明),而非论题本身Turing 1936。

再往前走一步:什么样的系统「能模拟一台图灵机」?这样的系统叫图灵完备。判断标准简单粗暴。只要你有足够的时间和足够大的纸带,它能完成任意计算。今天我们身边的图灵完备系统多到意外:Python、Java、C++ 显然是;你的笔记本电脑和智能手机也是;甚至 Minecraft 的红石电路(用红石粉+红石火把搭出 NOR 门即可构造任意逻辑与寄存器)、PowerPoint(Tom Wildenhain 用 AutoShape + 动画 + 超链接实现的 PPTXTM)也算;需要补充一点,Excel 的默认公式环境并非图灵完备——严格意义上的 Excel 图灵完备依赖 2021 年 Microsoft 引入的 LAMBDA 自定义可递归函数(Microsoft Research 官方博客:「With LAMBDA, Excel has become Turing-complete」),在此之前的演示需要占用「一行 = 一个状态」的存储,受行数限制。

把这套理论放到教材化视角看,就是把「程序」从一个抽象概念落到一个具体数据流:

图注:Forouzan 教材 Figure 1.2 给出的「基于图灵模型的计算机」。顶部黄色矩形是「程序」(Program),红色箭头指向中央立体「计算机」(Computer)框;Computer 框左侧接收 Input data,右侧输出 Output data。整张图把第 1 节的三段式契约再次复述一遍,只是这次多了一个明确元素:程序。机器不再是固定的算盘或计算器,而是「只要换程序就换功能」的通用设备Forouzan 4e。

这一节和上一节的区别在于:第 1 节是契约。任意计算任务都能被「输入—规则—输出」三件套描述。这一节是机器。图灵机给出了一个具体的、最小化的机制,让「任意计算任务」都变成「这条纸带上能跑出来的东西」。这两件事合起来就是「可计算」的形式化定义。


3. 冯·诺依曼模型:把抽象落到工程实现

图灵模型回答的是「什么能被计算」(理论),冯·诺依曼模型回答的是「用什么硬件去执行它」(工程)。两者不是替代关系,而是同一枚硬币的两面。它们共享一个核心:「规则作用在存储中的符号上」。冯·诺依曼的贡献是把这一共享核心工程化成了五个互相连接的具体部件。

1945 年 6 月 30 日,John von Neumann 把一份名为《First Draft of a Report on the EDVAC》的报告从宾夕法尼亚大学 Moore School 发出去。报告封面写着合同号 W-670-ORD-4926,收件方是美国陆军军械部。扉页本身就成了工程史的一手锚点:

图注:1945 年 First Draft 报告扉页扫描。顶部红色手写体「Samuel N. Alexander」是报告早期副本主人(他后来基于这份报告开发了 SEAC 计算机);中部黑色印刷体依次为标题「FIRST DRAFT OF A REPORT ON THE EDVAC」、作者「by John von Neumann」、合同号、订约方(美国陆军军械部、宾夕法尼亚大学 Moore School 电气工程系)、日期「June 30, 1945」。扉页本身不含正文,但「1945-06-30」是存储程序思想工程化的关键时间节点Wikipedia: First Draft。

报告里提出的方案由五个互相连接的部件组成,这就是后来俗称的「冯·诺依曼五部件」:

  • 算术逻辑单元(ALU):做加减乘除与逻辑判断。
  • 控制单元(CU):指挥各部件何时做什么。
  • 存储器(Memory):存放数据和指令。
  • 输入(Input):键盘、鼠标等把外界信息送进机器的设备。
  • 输出(Output):显示器、扬声器等把结果送回外界的设备。

这五部件的具体画法,教材和百科各自给出一版:

图注:Wikipedia 的冯·诺依曼架构标准框图。外层青绿色背景框内,上方白色矩形「Central Processing Unit」含两个粉色子框(Control Unit 与 Arithmetic/Logic Unit);下方独立白色矩形「Memory Unit」;CPU 与 Memory 之间有两条方向相反的黑色箭头,表示数据与指令可以双向流动Wikipedia: Von Neumann architecture。

图注:课件原图冯·诺依曼模型示意图。外层浅绿色「U」形框带顶部标注「Input/output」;内部灰色区域包含三个模块:左上橙色 ALU、左下浅蓝灰色 Control Unit、右侧大绿色 Storage。三个模块两两用白色连接条相连课件原图。

两张图说的是同一件事,只是配色和分组习惯不同。要把这两张图对上:青色框的 CPU 对应橙色 ALU + 浅蓝 CU;Memory Unit 对应绿色 Storage;外层 Input/output 框则把键盘鼠标显示器等包成一圈。

但冯·诺依曼模型的真正革命不在五部件,而在中间那条把「程序」和「数据」放进同一块内存的桥。它叫存储程序(stored-program)思想。在 1945 年之前的电子计算机(包括 ENIAC)里,「程序」是要靠人工插线或拨开关实现的,换一个任务就要重新接线或重拨一次。1944–1945 年间,von Neumann 在 First Draft 里提议:既然程序和数据在逻辑上都是一串符号,那它们应该用同一种格式,存放在同一块可寻址内存里。同一种格式就是二进制位图。这样换个任务就只需要往内存里写不同的位图,不用再动硬件。这一思想在 Forouzan 教材里被精确表述为:「数据与程序都用同样的格式,也就是内存中的 0/1 二进制序列」Forouzan 4e。

有一个历史细节必须澄清。这份 First Draft 报告的署名是 von Neumann,但「把程序放进内存」这一思想的真正提出者是 ENIAC 的两位主设计师 John Mauchly 和 J. Presper Eckert,他们在 1944 年 1 月的内部备忘录里就已经提议用 mercury delay-line memory 来存程序。von Neumann 与 Herman Goldstine 只是把这一想法工程化并写成报告分送出去Wikipedia: Von Neumann architecture。这条署名争议不是八卦,而是工程史里反复出现的现象:写文档的人往往比动手设计的人更「有名」。

最后必须明确:「冯·诺依曼模型」不是某个计算机品牌。它是一种架构范式,今天我们用的几乎所有通用计算机(包括你的笔记本电脑、手机、服务器)都遵循这个模型,但具体实现是各家公司分别做出的工程选择。把模型误当成品牌,等于把菜谱当成菜。


4. 硬件骨架:CPU、内存、外设与那条每秒数十亿次的循环

第 3 节把冯·诺依曼的五部件画成一张抽象框图;这一节把它对应到今天真实硬件的分类。

当代计算机硬件按职能分成三个一级类:

图注:硬件三级分类树。根节点「Hardware」分三支:CPU、Memory、Peripheral。CPU 下含三个子件:ALU(橙色标注「Mathematical operations」)、Control Unit(橙色标注「Instruction execution」)、Registers(橙色标注「Temporary storage」)。Memory 下含四子件:Cache SRAM(橙色标注「Store frequently accessed data」)、ROM(橙色标注「Store permanent system software」)、RAM(橙色标注「Temporary storage」)、DRAM(橙色标注「Main memory」)。Peripheral 下分四类但不带橙色标注,包括输入设备(键盘、鼠标、扫描仪、麦克风)、输出设备(显示器、打印机、扬声器)、外部存储(SSD、HDD、U 盘等)、网络设备(网卡、调制解调器)课件原图。

对照第 3 节的冯·诺依曼模型,这棵树让三个一级类对应五部件的映射变得直接:CPU 对应 ALU + CU 两个部件加上一组寄存器(CPU 内部最快的小存储),Memory 对应存储器,Peripheral 则把输入设备和输出设备以及外存、网络接口打包在一起。

CPU 是计算机真正「做事情」的地方,它每秒从内存里取一条指令、判断是什么操作、执行它、然后写下结果。这条循环每秒钟重复数百万到数十亿次:

图注:CPU 指令周期循环。Forouzan 4e §1.2 原文为三拍:「the control unit fetches one instruction from memory, decodes it, then executes it」(Fetch → Decode → Execute)。本图把这一过程扩展为四拍(Fetch → Decode → Execute → Store),其中 Store(结果写回)是工程教学扩展(如 Patterson & Hennessy《Computer Organization and Design》的五步流水线 IF/ID/EX/MEM/WB 中的 MEM/WB 阶段),并非 Forouzan §1.2 原文。每秒钟重复数百万到数十亿次;指令必须顺序执行,但允许跳转,这是冯·诺依曼模型「Sequential execution of instructions」的工程实现Forouzan 4e。

但这条循环只解释了 CPU 内部在做什么。CPU 与内存之间的数据流动,会撞上一个反直觉的工程事实:没有一种内存能同时满足快、大、便宜三个要求。所以真实硬件里内存是分层的:

图注:存储层次金字塔共六层,自上而下为 Register(寄存器)、Cache inside core(L1 cache, SRAM)、Cache outside core(L2 cache, SRAM)、DRAM、Local Disk、Remote Storage。左侧「Small→Large」箭头表示容量越往下越大,右侧「High→Low」箭头表示速度与价格越往下越低课件原图。

为什么不能只用一种内存?因为今天最快的 SRAM 比主流 DRAM 快大约 100 倍,但每 GB 价格也贵几十倍。而磁盘虽然便宜到能装下几个 TB,却比 DRAM 慢 1000 倍以上。分层是为了让「常用数据放在快的层、冷数据放在便宜的层」。程序常常刚用过某个数据又会再用一次(局部性原理),把这种数据暂时放在 L1/L2 cache 里,就能让平均访问时间逼近 SRAM 的速度、总成本逼近磁盘的价格Forouzan 4e。这就是为什么内存「要分层」。不是工程师折腾你,而是物理规律逼出来的取舍。

CPU、内存、外设三大类协同起来的方式在第 6 节会有完整的「双击 .exe」流程展示,那里会把今天硬件这棵分类树与软件那条链对接成一条完整因果链。


5. 从二进制到程序:为什么你需要三层翻译才能跑代码

冯·诺依曼模型把数据和程序都以二进制位图存放在内存里。但二进制本身就是一层抽象。物理上是高低电压、磁极方向、光照有无,逻辑上是 0/1 字符串。我们写 Python 时从来不直接写 0/1,因为机器需要的是「指令」,而人会用的语言叫「自然语言」。这两端之间的鸿沟靠三层翻译来填平。

先看存储单位的尺子:

1 bit   = 1 binary digit
1 byte  = 8 bits
1 KB    = 1024 B
1 MB    = 1024 KB
1 GB    = 1024 MB
1 TB    = 1024 GB
1 PB    = 1024 TB

今天一张照片几 MB,一首歌几十 MB,一部电影几 GB,整个互联网的容量按 PB 算。它们在机器眼里全是 0 和 1 的拼接Forouzan 4e。

那么十进制的 13 怎么变成二进制的 1101?短除法:13 ≥ 8,把 8 这一位记 1,剩 5;5 ≥ 4,把 4 这一位记 1,剩 1;1 < 2,把 2 这一位记 0;1 ≥ 1,把 1 这一位记 1,剩 0。所以 $13_{10} = 1101_2$。这套算法告诉我们:十进制的每位权值(个、十、百、千)变成二进制的每位权值(1、2、4、8)后,就能用「比权值就记 1、不够就记 0」来转换。

再往上一层看,从「问题」到「机器执行的指令」要跨三道抽象:

图注:三层堆叠抽象层次塔。最上层是 Python/C++/Java/C 等高级语言(High-level Language),最下层是机器语言(Machine Language),中间是汇编语言(Assembly Language)。左侧双向箭头一端指 Natural Language(自然语言),另一端指 Machine Language(机器语言)课件原图。

每一层都是一种「翻译」。上层贴近人的表达,下层贴近机器的执行。教材常用的例子是 $2 \times (3 + 4) = ?$:人在数学式里写出来三秒能算;翻译成汇编语言要三行:

add r0, 3, 4    # 把 3+4 的结果存到寄存器 r0
mul r0, r0, 2    # 把 r0×2 的结果存回 r0
return r0        # 把 r0 作为函数返回值

再翻译成机器码,就成了二进制的位图:

图注:从数学表达式 $2 \times (3 + 4) = ?$ 到汇编语言(add r0,3,4; mul r0,r0,2; return r0)再到机器语言二进制(0000000 00100 00011 000... 0110011)的三级具体转换示例课件原图。

那么谁来做这个翻译?两种典型方案:编译器与解释器:

图注:编译流程四层垂直结构:源代码文件(C/C++/Java/Rust/Go 等)→ Compiler → Object File(可执行文件)→ Execution。「执行前一次性翻译」是编译器的关键特征课件原图。

图注:解释器流程三层结构:源代码(Python/JavaScript/Ruby/PHP 等)→ Interpreter → Execution。「运行时逐行翻译」是解释器的关键特征课件原图。

两者最关键的区别在「什么时候翻译」。编译器把整个程序在执行前翻译成机器码并存为可执行文件,下次跑直接执行位图,所以快;解释器每执行一行就翻译一行,改完源码直接跑所以灵活Forouzan 4e。现实里几乎没有纯编译器或纯解释器。Python 实际上是「先把源码编译成字节码、再用解释器执行字节码」的混合方案;Java 是「先编译成字节码、再用 JVM 解释/编译执行」。真正的问题不是「该用哪个」,而是「实现者在何种权衡下做选择」:哪种策略让源码的快速迭代更容易?

这一节和前两节的衔接很自然:图灵机的「规则表」就是今天说的「程序」;冯·诺依曼模型把程序和数据都放在同一块内存里;而这一节告诉你,程序本身要经过三层翻译才能让 CPU 跑得动。


6. 软件、操作系统与网络:让一台机器和让多台机器协作

硬件就绪之后,还需要软件告诉它「做什么」。软件分两类:

图注:软件三级分类树。根节点「Software」分两支:System Software(系统软件)和 Application Software(应用软件)。System Software 再分三类:Operating System(操作系统,下含 Windows、Linux、Unix、macOS、Android、iOS 等具体产品)、Compiler(编译器,下含 C、C++、Python、Java 等语言)、System Tools(系统工具,下含 Windows Defender、Firewall、Disk Partition Tools 等)。Application Software 分支在原课件里没有列出具体示例课件原图。

这里有一个必须澄清的混淆。操作系统不是「一个应用」。它不是 Word、Chrome 那种给用户直接使用的程序,而是「硬件与应用之间的中介层」。

图注:用户/应用/操作系统/硬件四层关系图。自上而下:User(橙色)→ Application(绿色)→ Operating System(蓝色)→ Hardware(红色)。每两层之间用双向箭头连接,向上箭头表示请求,向下箭头表示服务课件原图。

OS 的四大职责可以一句话概括:让多个程序在同一台机器上「不打架」。具体来说,它要做四件事。第一,在多个程序间分配 CPU 时间与内存空间,做资源管理。第二,隔离应用以保证安全,又允许程序间通信。第三,把硬件细节藏起来,向应用程序提供一套统一的简化接口,这就是硬件抽象。第四,提供统一方式访问网络和磁盘,做公共服务Forouzan 4e。如果一个程序独占所有资源,其他程序就完全无法运行。这才是 OS 要解决的核心矛盾:「独占 vs 协作」。

把第 3 节的冯·诺依曼五部件和这一节的 OS 四层关系串起来,最直观的例子是「双击 .exe 文件后发生的事」:

图注:双击 .exe 后操作系统执行程序的七步流程。显示器图标(屏幕显示 .exe 被点击)→ 1. Signal 发给操作系统 → 操作系统 → 2. Read this file 询问文件系统 → 文件系统 → 3.(文件读出,返回操作系统)→ 4. Allocate memory space and write the program into memory(操作系统分配内存并把程序写入)→ 内存 → 5. Run the program(启动程序)→ 程序 → 6. Execution Result 返回操作系统 → 7. Change the display(操作系统把显示器画面更新到结果显示)→ 显示器。蓝色箭头是正向操作,绿色箭头是返回响应课件原图。

这张图把今天所有概念钉死在一处。硬件(内存、文件系统、显示器)在底层,OS 在中间层,应用程序在它上面跑,用户在最外层。而一次双击就把这条链完整走了一遍。

把视角从一台机器拉到多台机器:计算机网络解决的是「机器之间如何协作」的问题。按地理跨度分:

跨距大致范围名称
约 10 米房间内/身边PAN(个域网)
10 米–1 公里房间/建筑/校园LAN(局域网)
10 公里城市MAN(城域网)
100–10000 公里国家/大洲/全球WAN(广域网)

LAN 互联「主机」(PC、打印机等终端设备),WAN 互联「连接设备」(路由器、交换机),Internet 是「网络之网络」,把所有 LAN/WAN 串起来的全球基础设施Forouzan 4e。

但「Internet ≠ Web」。Internet 是基础设施(道路),Web 是跑在 Internet 上的一种应用(跑在道路上的快递)。这两件事不能混。Web 是无数应用之一,还有 Email、FTP、视频通话、云存储等等。

为什么不同厂商的设备能在 Internet 上互通?因为大家都遵守同一套协议,也就是事先约定好的消息格式、顺序、错误处理方式。协议让不同厂商的设备可互操作,是 Internet 运转的底层规则。协议族里最重要的两根支柱是 TCP 和 IP:

维度TCPIP
类型面向连接无连接
错误处理有(校验和 + 重传)不处理(依赖上层)
流控有无
拥塞控制有无
头部大小20–60 字节通常 20 字节
可靠性可靠、按序、错误校验不保证送达

简单说,IP 只管「把数据包从一台设备送到另一台」,做的是寻址与路由。TCP 在 IP 之上加一层「让送达变得可靠、按序、有错重传」的协议RFC 793。

TCP 头部的 20 字节字段布局非常具体,它告诉你一台机器「可靠传输」具体落实成哪些位:

图注:TCP 头 4 行字段布局。Source Port(16 位)与 Destination Port(16 位)共占首行;Sequence Number(32 位)与 Acknowledgment Number(32 位)各占一行;Data Offset(4 位)+ Reserved(6 位)+ Flags(6 位,含 URG/ACK/PSH/RST/SYN/FIN)+ Window(16 位)共占一行;Checksum(16 位)+ Urgent Pointer(16 位)共占末行;右侧标注 20 Bytes;底部锯齿折线表示变长 Options + Data。TCP 的「可靠传输」就藏在这一行行字段里,哪条数据该被确认、哪条连接要被关闭,全在 Flags 字段的几位里[Wikipedia: TCP header](https://commons.wikimedia.org/wiki/File:TCP_header.png "citation: Layout of a TCP packet || 白底黑线的 TCP 头部 32 位宽方框示意图,4 行布局:Source Port 16 ")。

为了让人类能用名字访问网站,还需要一个把域名翻译成 IP 的系统。它叫 DNS。它的工作流程非常具体:

图注:DNS 解析流程图,左侧是浏览器(电脑图标),右侧是 DNS Server(服务器图标)。流程按编号分两步走:步骤 2「Enquiry」(浏览器向 DNS 服务器发起域名查询请求);步骤 3「return IP address: xxx.xxx.xxx.xxx」(DNS 服务器把对应 IP 返回给浏览器);步骤 4「Access google through IP address」(浏览器通过该 IP 跨图访问目标服务器)。整个流程避免把 DNS 当成「魔法」。它只是把 google.com 这种人话变成 142.250.x.x 这种机器地址课件原图。

最后还有一个常被拿来和 Internet 混的概念:OSI 七层模型。它是一个概念模型,把网络通信分成物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,每一层负责一项特定的通信任务。OSI 是教学概念,TCP/IP 才是 Internet 实际使用的架构。把这两件事分清,就不会被「OSI 到底是不是 Internet 用的」这种问题卡住Forouzan 4e。

走完这六层,你就拥有了一张完整的「今天计算机长这样」的概念地图:从图灵 1936 年的形式化定义,到冯·诺依曼 1945 年的工程提案,到今天真实硬件的分层分类、软件的双层结构、网络的协议协作。下一节我们用两千年的工具演进史,把这张地图的时间维度也补上。


参考文献

本专题引用的核心资料如下,建议深入学习时阅读原文:

  1. Turing, A. M. (1936). On Computable Numbers, with an Application to the Entscheidungsproblem — https://www.cs.virginia.edu/~robins/Turing_Paper_1936.pdf
  2. von Neumann, J. (1945). First Draft of a Report on the EDVAC — https://en.wikipedia.org/wiki/First_Draft_of_a_Report_on_the_EDVAC
  3. Wikipedia: ENIAC — https://en.wikipedia.org/wiki/ENIAC
  4. Moore, G. E. (1965). Cramming more components onto integrated circuits — https://www.eng.auburn.edu/~vagrawal/COURSE/E7770_Spr07/READ/Gordon_Moore_1965_Article.pdf
  5. Wikipedia: Von Neumann architecture — https://en.wikipedia.org/wiki/Von_Neumann_architecture
  6. Forouzan, B. A. Foundations of Computer Science (4e/5e), Chapter 1 Introduction — https://studylib.net/doc/28123501/ch01--1-
  7. Postel, J. (1981). RFC 791: Internet Protocol — https://www.rfc-editor.org/rfc/rfc791
  8. Cerf, V. G. & Kahn, R. E. (1974). A Protocol for Packet Network Intercommunication + RFC 793: Transmission Control Protocol — https://www.rfc-editor.org/rfc/rfc793
  9. Wikipedia: Suanpan / Difference engine / History of computing hardware / CPUs — https://en.wikipedia.org/wiki/History_of_computing_hardware
  10. Computer History Museum Timeline + Harvard CS50 — https://computerhistory.org/timeline/computers/
从纸带到芯片:计算机系统的六层骨架