网络与互联网,从基本原理出发
摘要
一篇深入的教育文章,从基本原理出发解释网络与互联网,涵盖分组交换、TCP、DNS、TLS以及数据如何在全球传输。
暂无内容
查看缓存全文
缓存时间: 2026/07/11 13:23
# 网络与互联网:从第一性原理出发 · Faza
来源:https://fazamhd.com/mental-models/networking/
你是否曾好奇过,当我们与另一大洲的朋友或同事发短信、打电话或视频聊天,而他们的回复在不到一秒钟内到达,仿佛就在同一个房间时,幕后到底发生了什么?在看不见的幕后,一系列无形的转换悄然发生:你的声音、视频或信息被转换成无线电波,穿过房间到达你的Wi-Fi路由器,然后变成铜线中的电脉冲(如果你有光纤连接,则是光脉冲),再然后变成比头发丝还细、深埋海底的玻璃纤维中的闪光,最后在另一端,整个序列反向运行。我觉得这简直不可思议:我们只需制造受控的、有规律的电、光和无线电扰动,就能与世界上的任何人即时通信。
这条消息会经过几十家不同国家独立公司拥有的设备。没有一家公司为了这次消息传输而与其他公司进行特别协调,也没有一家公司知道你的数据所走的完整路径,它们只是将数据交给下一个最近的路由。没有中央计算机来指挥流量,也没有一家公司拥有互联网基础设施。然而,它每秒运行数十亿次,如此可靠,以至于我们只有在通话卡顿或视频缓冲时才会注意到它。
通过互联网发送消息
连接:
t = 0 毫秒 1/6 · 发送消息
你点击发送。消息变成了几百个字节。
无线电到你的路由器,铜线和光纤穿过你的城市,海底光缆中的光,远端的数据中心,以及回复所走的一条独立且通常不同的路径。那些模糊的点是其他人的流量;这里的每根电线、电缆和机器都同时被数百万个会话共享。在没有人负责的情况下,这一切是如何做到的?这正是本文的主题。
在[软件文章](https://fazamhd.com/mental-models/software)中,我们跟随一台机器的故事,从硅中的电子一直到你运行的软件。本文则讲述这些机器之间连接的故事。与计算的分层架构一样,互联网并非一蹴而就;它是在几十年间积累而成的,每个协议只有在你看到它被发明出来所要解决的具体限制时才有意义。我们很容易将结果误认为是按照完成的蓝图设计出来的,因为故障足够罕见,以至于让人觉得系统一直如此可靠。实际上,本文中的每个机制——分组交换、TCP、DNS和TLS——都是针对特定问题的补丁,在互联网已经“工作”了几十年后才部署的,而且产生它们的压力从未停止:现在,这种压力来自新的物理链路、新的故障场景以及来自其下层设计时尚不存在的软件的新需求。
我的目标是从第一性原理出发构建这种理解。最终,许多日常使用互联网的谜团将在一个单一、连贯的心智模型下变得直观:地址栏中的挂锁如何保护你的信用卡信息;一个打不开的页面是网站的问题还是你自身端的问题;为什么即使有“千兆”连接,网页也可能感觉迟缓;你的数据如何在半个地球之外的海底电缆出现故障时,动态地重新路由。
## 早在计算机出现之前,我们就在传输比特
网络的历史远比计算机悠久,也比电力久远。**网络**这个词本身最初的意思就是字面意义上的:一种由线或绳索以固定间隔交叉编织而成的网状织物。在19世纪早期,工程师借用这个词来描述相互连接的运输路线,如运河和铁路。当电报在19世纪40年代出现时,这个词自然地被用来描述承载其信号的线路和站点系统。
然而,网络链路的基本物理原理与最简单的机械连接相同。在两个锡罐之间拉紧一根绳子,对着一个罐子说话,绳子就会以机械运动的形式将你声音的振动传递到另一个罐子,无需放大器或中继器,只是一个波在每米的传输中因摩擦和松弛而损失能量。这已经是此后所有链路背后的全部原理:在一端改变一个物理量,在另一端测量它。绳子无法做的是将信号携带任何实际距离而不在线上衰减。电报真正的突破不仅是用电线取代了绳子,更是克服了距离这一物理限制。
1844年,塞缪尔·摩尔斯通过一根铜线,使用摩尔斯电码(一种短电脉冲和长电脉冲的系统),从华盛顿向巴尔的摩发送了“上帝创造了何等奇迹”这条消息。请注意电报实际上是什么:一个**数字**网络。它不传输声音;它传输来自固定字符表的离散符号。这个选择具有一个维多利亚时代的人深知的优势。线路上的机电中继器不需要传递波本身;它只需要检测脉冲是否存在,然后重新创建一个全新的、干净的脉冲副本,将其发送到下一段线路。离散符号加上再生意味着一条消息可以跨越大陆而不会衰减,这是任何模拟信号都无法做到的。
还要注意,在电线能够承载任何东西之前必须存在的东西:发送方和接收方之间的协议。电报之所以能工作,是因为两端事先持有相同的表格:哪些脉冲代表哪些字母,以及操作员如何表示“已收到”或“重复”。这套共享的规则就是一个**协议**。本文中的每个协议(IP, TCP, DNS, TLS)都是一样的:一个关于消息格式以及谁在何时说什么的公开协议,使得独立的机器能够相互通信。
下面的模拟器沿着那条历史性的线路发送摩尔斯电码的消息。观察脉冲如何在每段电线上衰减并引入噪声,以及中继器对此做了什么。然后将中继器切换为纯放大,看看为什么离散字母表(现代计算进一步将其简化为二进制比特)是如此明智的选择。
电报中继器 离散符号,在每个中继器处再生
线路上的机电中继器不需要传递波本身;它只需要检测脉冲是否存在,然后重新创建一个全新的、干净的脉冲副本,将其发送到下一段线路。
中继器
摩尔斯脉冲沿着每一段电线衰减并引入噪声。由于网络传输离散符号,中继器不需要传递波本身;它只需要检测脉冲是否存在,并重新创建一个全新的、干净的脉冲副本。将中继器切换为纯放大,每一段的噪声就会进入下一段,直到巴尔的摩误读这条消息。离散符号加上再生,这就是一条消息能够跨越大陆而不衰减的原因,这是任何模拟信号都无法做到的。
电报网络甚至解决了路由问题,用的是人力。从小镇到另一个小镇的消息会经过中继站,操作员在那里接收消息,将其打在纸条上,然后当空闲时,沿着更靠近目的地的任何出站线路重新发送。在繁忙时段,消息会在箱子里排队。记住这个想法,一百年后,我们将用电子设备重建它,并称之为路由器。
19世纪90年代巴黎中央电报交换局的操作员室。每张桌子都是一条线路的终点;负责接收、排队并将消息重新发往目的地的操作员就是网络的路由器。(来源:《大众科学月刊》,1894年,公共领域)
摩尔斯自己的线路只需要跨越一个州。穿越海洋则需要更长的时间,经历了十年的昂贵挫折和对海底电缆物理学的痛苦学习。赛勒斯·菲尔德的第一个跨大西洋电报电缆于1858年8月投入使用,承载了维多利亚女王和布坎南总统之间的祝贺交流;三周后它就不工作了,其绝缘层在处理中受损,有些人认为,是一名工程师试图通过电缆推送信号时施加过电压而将其彻底毁坏。成功的电缆于1866年铺设,由“大东方号”轮船完成,这艘船当时是建造的最大的船只,也是唯一一艘能够一次性承载约4000公里电缆的船只。从那时起,海底一直承载着通信电缆,这是一个我们将在电报线演变成同轴铜线,并最终演变成玻璃光纤时再回来的故事。
底层技巧概括了迄今为止建造的每一个链路。要在两点之间传输**比特**,你按照约定的时间表,在一端改变某个物理量,在另一端测量它。比特是“二进制数字”的缩写,是信息的最小可能单位,是在恰好两种状态之间的一次选择,通常写为`1`或`0`。本文中测量、发送或存储的一切最终都是这些比特的某种数量(如果你想了解底层原理,[软件文章](https://fazamhd.com/mental-models/software)从晶体管和逻辑门开始构建了这个概念)。将八个比特组合在一起,你就得到了一个**字节**,它拥有足够的(256种)状态,可以代表一个文本字符或一个小数字,这就是为什么本文中的所有大小(数据包头部、帧、文件)都以字节而不是比特来计数。
在电线上施加电压代表`1`,不加电压代表`0`,每秒测量一百万次,那么这条电线每秒就能承载一百万比特。光纤通过在玻璃纤维内以每秒数百万次的频率开关激光来做到这一点:有光代表`1`,无光代表`0`;Wi-Fi通过改变无线电波的形状来做到这一点(具体方式将是即将推出的无线文章的主题)。
两个数字表征了每一个这样的链路,将它们分开可以解决许多日常的困惑。
- **带宽**是链路每秒承载的比特数。
- **延迟**是一个比特从一端到达另一端所需的时间。
带宽是一个工程问题,工程师们一直在攻克它。单根现代光纤通过一次发送多个波长的光,每秒能承载数太比特。延迟是物理学问题,光在玻璃中的传播速度约为每秒20万公里(真空中光速的三分之二),因此纽约到伦敦单程大约有28毫秒的硬性下限(往返路程翻倍),这是任何金钱或工程都无法降低的。这就是为什么视频流和视频通话的感觉如此不同:视频流需要带宽,并能容忍延迟(它会提前缓冲几秒钟),而通话需要低延迟,只需要适中的带宽。当页面在快速连接上感觉缓慢时,延迟通常是罪魁祸首。正如我们稍后将看到的,单次页面加载需要多次往返(用于DNS、TCP和TLS),然后任何内容才会真正开始传输。
这两个数字永远不会相互权衡,因为它们来自不同的地方:带宽来自发送方的调度,延迟来自线路的长度。下面的模拟器通过一个链路发送相同的8个比特。调整带宽,只会改变脉冲之间的间距;调整距离,只会改变第一个脉冲到达之前的延迟。
信号传播中的带宽和延迟 拖动以搜索
Tx(发送方)Rx(接收方)10110010 重放 总传输时间 · 真实比例 30.01 毫秒 传播(延迟):30 毫秒 传输:8 微秒
状态:空闲。
分析:传播延迟占主导地位,延迟远远超过实际发送所需的时间。
带宽 1 Mbps · 早期宽带
距离 6000 公里 · 跨大西洋电缆
带宽仅设置每个脉冲的宽度;距离仅设置波沿电线传播所需的时间。该条以真实比例显示两种延迟,上面的重放被减慢且未按比例显示。
## 每条会话专用的电路
电报在办公室之间传输文本。从1876年开始,电话将实时语音带入家庭,为此,网络采用了一种截然不同的原理,称为**电路交换**。当你拨打电话时,系统会在你的电话和接听者的电话之间组装一条专用的电路路径。最初是由人工操作员将插头插入交换机配线架,后来由机电中继器自动完成相同的工作。在通话期间,这条铜线链路专属于你的对话,端到端。
1943年,贝尔系统国际电话交换机前工作的女性。人工操作员通过将插头插入配线架来手动连接电路交换器,为每次对话建立临时专用电路路径。(来源:美国国家档案馆,公共领域)
对于语音来说,这是一个合理的设计:电话通话是一个几乎一直流动的连续信号,因此预留的线路实际上被利用了。因此,当计算机在20世纪50年代和60年代首次需要通过远距离通信时,它们做了唯一可能的事情:通过电话线互相拨号。但是,由于电话线是为承载人声(模拟声波)而不是直接的数字电脉冲而建造的,计算机必须使用**调制解调器**。调制解调器将计算机的数字二进制比特转换为模拟音频音调(可听到的拨号握手的啁啾声、蜂鸣声和静态噪声),这些音调可以在语音网络上传输,并在另一端将这些声音转换回数字比特。
最早的调制解调器,如300波特的贝尔103,使用**FSK**(频移键控)来实现这一点,其原理与电报的开/关脉冲相同,但使用的是只能承载连续音调(而不是干净的开/关电压)的电线。每个`1`比特在其整个持续时间内播放一个稳定的音调,每个`0`比特播放一个不同的、较低的音调,另一端的调制解调器只需监听存在哪个音调,并读回该比特。观察一个字节(字母'A')被调制为音调,然后再解调为比特的过程:
调制解调器 调制/解调,一个字节
发送 'A' 的比特
01000001
较高频率音调(传号)= 1,较低频率音调(空号)= 0
发送比特 0,调制解调器在此比特的整个持续时间内播放较低的“空号”音调。
在数据通过那条预留线路传输之前,两个调制解调器必须先通过同一条语音级电路,就它们能以多快速度通话以及如何纠正嘈杂铜线对必然引入的错误达成一致。自1981年的Hayes Smartmodem以来,调制解调器保留了连接扬声器,以便人类可以在计算机接管之前听到呼叫连接(从拨号音到振铃),并确认没有遇到忙音或错号;在握手过程中扬声器一直保持开启状态,只有在协商完成后才关闭,这也是握手过程能被听到的原因。如果你在20世纪90年代和21世纪初使用过互联网,你还记得这个音调吗?
拨号握手录音
实线:下行(ISP → 你) · 虚线:上行(你 → ISP),同时,全双工
两个拨号调制解调器之间的真实握手,在不到三十秒内快速完成了六个阶段。按播放键收听它,并观察哪个阶段正在发出那个声音。
听起来像噪声的东西实际上是一个完整运行的协议:能力列表、线路探测和均衡器训练,所有这些都能听到,因为早期的调制解调器默认保持扬声器开启,以便人类可以听到呼叫是否正常进行。录音:“拨号调制解调器噪声”,公共领域,维基共享资源。
那个嘈杂的握手...
相似文章
软件,从基本原理出发
一篇从基本原理出发解释计算和软件基础的文章,旨在为普通读者揭开计算机工作原理的神秘面纱。
@vivekgalatage: 数据包在Linux内核中的路径 https://net.in.tum.de/fileadmin/TUM/NET/NET-2024-04-1/NET-2024-04-1_16.pd…
这份来自TUM的技术报告详细描述了数据包在Linux内核中的路径,涵盖了网络内部机制。
Docker Desktop 网络底层工作原理 (2022)
深入探讨 Docker Desktop 的网络内部机制,解释容器网络在 macOS 和 Windows 上的实现方式。
@iximiuz: 容器网络工作原理:从零开始构建桥接网络。要真正理解Docker和Kubernetes的网络…
本教程说明如何使用标准的Linux工具(如网络命名空间、veth对、桥接器和NAT)从零开始为容器构建桥接网络,以揭示Docker和Kubernetes网络的奥秘。
@addyosmani: https://x.com/addyosmani/status/2068394292796871019
一篇详细的技术文章,解释现代网页浏览器的工作原理,重点介绍Chromium架构,包括网络、解析、渲染和安全特性。