Hacker News 中文摘要

RSS订阅

网络与互联网:从第一性原理出发 -- Networking and the Internet, from First Principles

文章摘要

文章探讨了互联网通信背后的原理:信息通过无线电、电脉冲和光信号在设备间转换传输,跨越不同国家的基础设施,无需中央控制或统一协调,却能实现全球即时、可靠的通信。

文章总结

好的,这是根据您提供的英文文章内容,使用中文进行重新陈述的版本,已保留核心细节并删减了与主题无关的内容。


从基本原理理解网络与互联网

你有没有想过,当你与另一个大洲的朋友进行文字、语音或视频聊天,而对方的回复几乎瞬间到达,仿佛就在同一个房间时,背后发生了什么?实际上,你的声音、视频或信息会经历一系列无形的转换:先被翻译成无线电波传到你的Wi-Fi路由器,然后变成铜线中的电脉冲(或光纤中的光),最后在深埋海底、比头发丝还细的玻璃纤维中化为光信号,在另一端再反向还原。我们仅仅通过制造受控的、有规律的电、光和无线电扰动,就能与世界上任何人即时通信,这令人惊叹。

信息会经过数十家不同国家公司的设备。这些公司之间并没有为此信息传输进行专门协调,也没有任何一家知道你的数据所走的完整路径,它们只是将数据交给下一个最近的路径。没有中央计算机指挥交通,也没有单一公司拥有互联网基础设施。然而,它每秒能可靠地工作数十亿次,以至于我们只有在通话卡顿或视频缓冲时才会注意到它的存在。

在计算机出现之前,我们就在发送比特

网络的历史远早于计算机,甚至早于电力。“网络”一词最初指的就是像网一样的织物。19世纪初,工程师借用这个词来描述相互连接的运输路线,如运河和铁路。当电报在19世纪40年代出现时,这个词自然地被用来描述承载其信号的线路和站点的系统。

网络链路的基本物理原理与最简单的机械连接相同。在两个锡罐之间拉紧一根绳子,对着一个罐子说话,绳子就会将你声音的振动以机械运动的形式传到另一个罐子。这就是此后所有链路背后的原理:在一端改变一个物理量,在另一端测量它。绳子无法将信号传输到任何实际距离而不衰减。电报的真正突破不仅仅是用电线代替绳子,而是克服了距离的物理限制。

1844年,塞缪尔·莫尔斯通过铜线,使用莫尔斯电码(一种短和长的电脉冲系统)从华盛顿向巴尔的摩发送了信息。请注意,电报实际上是一个数字网络。它传输的不是声音,而是来自固定字母表的离散符号。这个选择有一个优势:线路上的机电继电器不需要传递波形本身,它只需要检测是否存在脉冲,然后重新创建一个全新的、干净的脉冲副本,发送到下一段线路。离散符号加上再生意味着信息可以跨越大陆而不会衰减,这是任何模拟信号都无法做到的。

还需要注意的是,在电线能承载任何东西之前,必须存在一个发送方和接收方之间的协议。电报之所以能工作,是因为两端事先持有相同的表格,知道哪些脉冲代表哪些字母,以及操作员如何表示“收到”或“重复”。本文中的每个协议(IP、TCP、DNS、TLS)都是如此:一个关于消息格式和谁在何时说什么的公开协议,允许独立的机器相互通信。

电报网络甚至解决了路由问题,通过人工实现。来自一个小镇的信息会经过中继局,那里的操作员接收它,将其打在纸带上,然后当线路空闲时,将其重新传输到更接近目的地的出站线路。繁忙时,信息会在箱子里排队。记住这个想法,一百年后,我们将用电子设备重建它,并称之为路由器。

比特在两点之间移动的基本原理可以推广到此后所有链路:在一端改变某个物理量,在另一端按约定的时间表测量它。比特是信息的最小可能单位,是两种状态之间的单一选择,通常写作10。八个比特组成一个字节,有256种状态,可以代表一个文本字符或一个小数字。

每个链路都有两个特征:

  • 带宽:链路每秒能承载多少比特。
  • 延迟:一个比特从一端到另一端需要多长时间。

带宽是工程问题,工程师们不断取得胜利。延迟是物理问题,光在玻璃中的速度约为每秒20万公里,因此纽约到伦敦的单程延迟硬性下限约为28毫秒。这就是为什么视频流和视频通话感觉如此不同:流媒体需要带宽并能容忍延迟(它会缓冲几秒钟),而通话需要低延迟,只需要适中的带宽。当页面在快速连接上感觉缓慢时,延迟通常是罪魁祸首。

为每次对话建立专用电路

电报在办公室之间传输文本。从1876年开始,电话将实时语音带入家庭,为此,网络采用了一种完全不同的原理,称为电路交换。当你拨打电话时,系统会在你的电话和接收方的电话之间建立一条专用的电路路径。在通话期间,这条铜线链完全属于你的对话。

对于语音来说,这是一个合理的设计,因为电话通话是一个几乎持续流动的信号,所以预留的线路实际上被使用了。因此,当计算机在20世纪50年代和60年代首次需要远距离通信时,它们只能做一件事:通过电话线互相拨号。但是,由于电话线是为承载人类语音(模拟声波)而建造的,而不是直接的数字电脉冲,计算机必须使用调制解调器。调制解调器将计算机的数字二进制比特转换为模拟音频音调(即拨号握手时听到的啁啾声和哔哔声),这些音调可以在语音网络上传输,并在另一端将这些声音转换回数字比特。

更深层次的不匹配从来不是调制解调器的转换,这在宽带出现之前的几十年就已经很清楚了。计算机流量是突发性的:一个终端在几毫秒内发送一个按键或请求,然后线路在人类阅读或处理器计算时保持静默。在会话期间,为计算机对话保留的电路绝大多数时间都是空闲的,但它却阻止了其他人使用该容量。更糟糕的是,路径在呼叫建立时是固定的,因此沿途任何一个断开的链路或交换局都会直接中断连接。

将消息分割成数据包

替代方案是由两个人独立研究出来的:兰德公司的保罗·巴兰(为生存能力而设计)和英国国家物理实验室的唐纳德·戴维斯(为线路共享而设计),后者给了这个想法一个名字:数据包

不是预留一条路径并沿着它传输数据,而是将每条消息分割成小的、自包含的单元。每个数据包携带一个头部(包含源地址和目标地址等控制信息的几个字节),后跟有效载荷(数据块本身)。沿途的每个交换点,即路由器,完整地接收一个数据包,读取其头部中的目标地址,查询自己的表格,找出哪个出站线路更接近该目标,然后将数据包转发出去。这就是存储转发交换,是电报中继局在电子设备中的重建,纸带被内存取代,操作员被查找表取代。

通过这种设计,来自数千个不相关对话的数据包可以在同一条线路上交错传输,因此当任何人要发送数据时,没有线路会闲置。而且,由于每个数据包都是独立路由的,网络可以绕过损坏。如果路由器在对话中途宕机,后续的数据包只需通过其邻居传输。巴兰称此为分布式网络,没有哪个点的丢失会使其一分为二。

请注意模拟器中的另一件事:偶尔,一个数据包会被简单地丢弃。当数据包到达路由器的速度超过出站线路可以排空的速度时,路由器会将其排队在内存中,当队列满时,它会丢弃无法容纳的数据包。这不是设计的失败,它本身就是设计。网络只承诺尽力而为的交付,数据包可能会丢失、重复或乱序到达,网络本身不会纠正这些。保持网络中间部分如此简单,并将所有可靠性责任推到边缘的计算机上,是互联网架构中最具决定性的决定,也是它能够扩展到全球网络的关键。

第一个数据包网络

1969年,美国高级研究计划局资助了第一个真正的数据包交换网络——ARPANET,以连接它已经资助的全国各大学的研究计算机。

当时有一个直接的、平凡的障碍。每个站点的大型机来自不同的制造商,运行不兼容的操作系统,并且没有空闲容量来处理数据包交换的实时工作。工程公司BBN用一台专用机器解决了这个问题:接口消息处理器,一台加固的小型计算机,其唯一的工作是将消息分解成数据包、路由它们并在远端重新组装。每个站点将其大型机连接到本地的IMP,IMP之间通过租用的电话线通信。IMP是第一个路由器,其模式——一个专用盒子,说网络的协议,这样它后面的计算机就不必说了——现在就在你的家里,带着天线。

第一次传输发生在1969年10月29日,从加州大学洛杉矶分校到斯坦福研究所。一名学生程序员开始输入LOGIN以登录远程机器。他输入了L,通过电话确认它已到达,输入了O,然后接收系统崩溃了。互联网祖先承载的第一条消息是LO。到12月,网络有四个节点;到1973年,它跨越大西洋到达挪威和伦敦。

为ARPANET构建的数据包交换网络通过租用的点对点线路连接了遥远的站点,形成了一个广域网。数据包传输的相同核心思想也解决了一个更小、更本地化的问题:如何连接一个办公室里的几十台机器,即一个局域网,而无需在每对机器之间都铺设专用线路?

1973年,施乐帕克研究中心的罗伯特·梅特卡夫设计了以太网。其冲突处理直接借鉴了ALOHAnet,一个早期连接夏威夷群岛的无线电网络,其核心思想是:一个站点只要有东西要发送就直接传输,并监听是否与别人的传输发生冲突,而不是先请求许可。梅特卡夫的设计将大楼里的每台计算机都连接到一根共享的同轴电缆上,他称之为“以太”。任何机器都可以在电缆上传输,每台机器都会收到所有内容,只保留发给自己的数据包。

共享介质有一个明显的缺陷:如果两台机器同时传输,它们会互相干扰,即冲突。以太网用几个纯粹的本地规则来处理它:传输前先监听,如果电缆忙则等待;在传输的同时继续监听,一听到冲突就立即停止;然后在随机延迟后重试。通过每次重复冲突时加倍随机延迟的范围(一种称为指数退避的策略),冲突的机器会分散开来,而不是永远堵塞线路。这种方案称为CSMA/CD

共享电缆本身并没有存活下来,办公室转向了交换机。交换机解决了与路由器相同的问题(将数据只传送到其目标),但它在本地硬件地址(MAC地址)上操作,而不是全局网络地址,并且通过完全不同的机制。路由器读取数据包的目标地址并从某人配置的表格中选择一条线路。交换机读取一个MAC地址(设备网络硬件中烧录的标识符),并从它通过观察过往流量自行构建的表格中选择一个端口。

当交换机通电时,其转发表是空的。每当一个帧到达时,在交换机检查它要去哪里之前,它会记下它来自哪里。通过将源MAC地址与它到达的端口配对,交换机记录一个新条目。这个过程称为学习。然后它检查表中帧的目标MAC地址,有两种可能的结果:如果目标未知,交换机将帧泛洪到所有其他端口;如果目标已知,交换机仅将该帧转发到那个特定端口。

连接网络

ARPANET证明了数据包交换是可行的,它的成功创造了下一个问题。在20世纪70年代,其他数据包网络出现在完全不同的物理介质上,每个都有自己的数据包格式、最大数据包大小和寻址方案。一个网络上的机器无法到达另一个网络上的机器。

1973年,文特·瑟夫鲍勃·卡恩设计了将它们全部连接起来而不统一任何网络的架构。他们提出的不是一个网络,而是一个互联网络,即网络的网络,这正是“互联网”的字面意思。称为网关的路由器将位于网络之间的边界上,整个方案依赖于将问题分成两个具有截然不同工作的层。

IP是每个人都必须同意的一件事,而且它故意设计得非常小。它定义了一个通用地址(IP地址)和一个通用数据包格式。至关重要的是,IP几乎不承诺任何东西。它是无状态的(没有路由器会记住关于你对话的任何信息)和不可靠的(如果数据包丢失,IP不会注意到或关心)。因为门槛设置得如此之低,任何网络都可以跨越它。这种架构创造了一个沙漏形状,底部是每种物理介质,顶部是每个应用程序,它们通过中间一个薄而简单的协议进行互操作。

IP地址只是32位,四个字节,用十进制书写并用点分隔。路由器表中的一条路由通过一个前缀来命名一个网络,该前缀声明了这些前导位中有多少是固定的。/24表示前24位是固定的,其余8位是自由的。因此,匹配一条路由就是比较比特:如果一个地址的前导位(直到前缀长度)等于路由的前导位,则该地址匹配该路由。路由器硬件将这种比较作为一个操作来执行。这个单一规则使得一个表可以保持很小:路由器不需要地球上每个地址的一行,只需要它知道有更具体理由的每个网络的一行;其他所有内容都通过默认路由发送。

那个自由长度的前缀并不是最初的设计。当IP寻址在1981年被正式确定时,它使用了一种称为有类寻址的方案。一个A类地址给一个组织1600万个主机地址,B类给65,536个,C类只给256个,中间没有其他选择。大多数组织只需要几千个地址。在这种僵化的系统下,他们必须选择:要么占用整个B类(浪费数万个地址),要么收集多个独立的C类网络。到20世纪90年代初,全球路由表增长的速度超过了路由器内存的跟踪能力,空闲地址空间也在迅速耗尽。1993年的修复方案是CIDR,它允许网络部分可以是任何长度,因此网络可以精确地调整到组织所需的大小,相邻的块可以合并成一个路由表条目。

使数据包交付可靠

TCP是IP拒绝提供的所有可靠性实际存在的地方,它在对话两端的两台计算机上运行。中间的路由器甚至不知道它的存在。TCP对它发送的每个字节进行编号,接收方持续报告它期望接收的下一个字节,即确认。任何未及时确认的内容,发送方都会重新发送。乱序到达的数据包在数据向上传递之前,会根据其编号重新排序。从尽力而为的混乱中,TCP制造出了每个网络程序所依赖的抽象:一个可靠的、有序的字节流。

明确的开始是三次握手,一个三段交换,在任何数据流动之前同步双方的字节编号。每一方为其即将发送的字节选择一个随机的起始序列号,然后它们交换这些号码。

确认和重传回答了“它到了吗?”的问题,但一个数据包可能到达时是不正确的。捕获这一点是一个独立的、更古老且更简单的机制:校验和。发送方对其发送的字节运行一个小型算术函数并附加结果;接收方对其接收的字节运行相同的函数并进行比较。任何不一致都意味着在传输过程中发生了变化,接收方只是默默地丢弃该数据包。

TCP还决定发送多少数据。发送方维护一个滑动窗口,即一次可以有多少未确认的数据包在传输中的上限。当数据包丢失时,TCP将此视为一个信号(路径上某个路由器的队列正在溢出),并缩小其窗口以退避。这种反射,即拥塞控制,是在艰难中增加的。1986年10月,劳伦斯伯克利实验室和加州大学伯克利分校之间的链路(相距400米)从每秒32,000比特暴跌到40比特,因为每个发送方都通过更努力地重传来响应丢失,形成了一个称为拥塞崩溃的反馈螺旋。范·雅各布森的修复方案——在丢失时乘法退避,在成功时温和地探测——至今仍在每个TCP实现中运行。

两个改进完善了传输图景。一个IP地址标识一台机器,但一台机器同时运行许多程序,因此TCP添加了一个端口号。地址和端口的组合将每个字节流传送到正确的程序。对于重传过时数据比丢失数据更糟糕的应用程序(如实时视频通话),有UDP,一个薄的替代方案,它只向IP添加端口,其他什么都不做,让每个应用程序以适合自己的方式处理丢失。

路由的来源以及谁承载你的数据包

在一个组织内部的网络中,路由器运行内部网关协议,交换它们自己直接观察到的拓扑信息。链路状态协议(如OSPF)让每个路由器都持有整个拓扑的相同地图,并独立运行相同的最短路径计算。距离向量协议(如较老的RIP)让每个路由器只告诉其邻居“我可以在N跳内到达这个网络”,从不看到地图本身。

组织之间,事情变得困难得多。互联网在物理上是数万个独立运营的网络(称为自治系统)的拼凑物。它们使用边界网关协议交换路由。每个网络向其邻居宣布“我可以到达这些地址块”,并传递它从其他网络听到的公告。路由传播到互联网的每个角落,每个网络根据商业政策(金钱易手)而不是速度来选择它听到的路径。

一个小型提供商向一个更大的提供商支付传输费用,以到达整个互联网,而规模相似的网络进行对等,免费交换其客户之间的流量。这些合同正是上面路由选择中“商业政策”的含义。在顶部是少数几个一级骨干网,它们相互对等,不向任何人付费。跨洋运行着大约600条海底光纤电缆,承载着几乎所有洲际流量。

你的私有家庭网络

你家里的路由器将几个这些想法压缩到一个塑料盒子里。它运行一个小型以太网交换机,加上一个Wi-Fi无线电;当设备加入时,它通过DHCP广播为每个设备分配一个地址。而且,因为32位的IPv4地址变得稀缺,这些是私有地址,在你的家之外毫无意义。几个地址块被约定保留用于此目的,从不公开分配,也从不通过互联网路由。路由器通过NAT,在数据包通过时重写其地址,将其单个公共地址共享给所有设备。

NAT有一个盲点,它悄悄地重塑了互联网。因为路由器只记录从内部开始的对话,它会丢弃所有未经请求的传入流量。这扼杀了对称的服务器角色:你的笔记本电脑可以到达任何服务器,但没有任何东西可以未经邀请地到达你的笔记本电脑。这就是为什么从家里托管需要手动设置“端口转发”,也是为什么点对点应用程序必须使用复杂的变通方法才能直接连接。一个用于解决地址稀缺的临时变通方法最终将互联网分成了两类:那些提供服务的,和那些只请求的。

记住名字而不是数字

路由器将数据包传送到像208.80.154.224这样的数字地址,但这些数字对我们来说几乎不可能记住。在ARPANET时代,整个映射存在于一个文件中,由斯坦福研究所手工维护,网络上的每台计算机都会定期下载一份新副本。到20世纪80年代初,这已经失败了。

1983年,保罗·莫卡佩特里斯设计了它的替代品:域名系统,建立在委派的基础上。命名空间是一个从右向左读取的层次结构。对于en.wikipedia.org,根层次只知道谁运行顶级域(如org);org服务器只知道谁运行wikipedia.org;维基百科自己的名称服务器持有en.wikipedia.org的实际答案。没有人存储整个地图。要查找一个名字,你的设备会询问一个递归解析器,它代表你遍历委派链并返回最终地址。

DNS只做了一件事:将名字变成数字。有了91.198.174.192,你的浏览器终于可以打开一个到该地址的连接。缓存的价格是过时。当一个站点移动到新地址时,旧答案会在世界各地的缓存中持续存在,直到其TTL到期。这就是为什么DNS更改需要时间传播,也是为什么很大一部分神秘故障(在家庭网络和数十亿美元的云中)都可以追溯到DNS。

为互联网创建用户界面

到20世纪80年代末,管道已经完成,但互联网仍然是专家的工具。1989年,欧洲粒子物理实验室的软件工程师蒂姆·伯纳斯-李提出了一个供科学家使用的文档共享系统,到1991年,万维网开始运行。它依赖于三个故意简单的发明:

  1. HTML:一种文档格式,其定义性特征是链接
  2. URL:一个文档的全局地址,命名协议、服务器和文档在其上的路径。
  3. HTTP:一个在TCP之上的最小请求-响应协议。

每个部分都依赖于我们已经构建的层。伯纳斯-李不必请求许可或升级任何路由器;下面的层已经存在,任何人都可以在它们之上自由构建。这种无需许可的特性是网络在几年内从CERN的一台机器走向世界的原因。

在公共线路上交换秘密

商业跟随浏览器而来,商业与从ARPANET时代就根深蒂固的假设发生了冲突:到目前为止,每个协议都以明文、可读的字节发送数据。你的数据包经过你的路由器、你的互联网提供商和十几个由陌生人拥有的网络,沿途的任何机器都可以读取每个字节,或在传输中悄悄地更改它。这对于信用卡号码来说是不可容忍的。

出路是公钥密码学。某些数学运算很容易执行,但在计算上不可行逆转,从这些运算中你可以构建一个密钥对,其中用一把密钥加密的数据只能用另一把密钥解密。公钥你交给世界;私钥永远不会离开你的服务器。现在任何人都可以加密只有你能阅读的消息,而无需事先共享秘密。同样的密钥对也可以反向工作:你可以使用私钥生成一个证明,任何持有公钥的人都可以验证。那就是一个签名,一个只有你才能做出而任何人都可以检查的声明。

还有一个差距。当你的浏览器收到一个声称属于你银行的公钥时,谁来为这个声明担保?一个坐在中间的攻击者可以出示他们自己的密钥并解密一切。这由证书来弥补。一小部分称为证书颁发机构的组织,其自己的公钥随每个浏览器一起提供,验证服务器的身份,并加密签署一个将该身份与其公钥绑定的声明;这个签署的声明就是证书。

网景公司在1994年将这些部分组装成SSL,后来标准化为TLS。它整齐地插在TCP和HTTP之间:在连接开始时,浏览器和服务器执行一个握手。其核心的密钥协商是Diffie-Hellman。双方从两个公共常数开始。浏览器发送一个ClientHello,提议密码套件,并附带一个密钥份额。服务器选择自己的私有数字,并用其证书和密钥份额回复。然后每一方将收到的份额提升到自己的私有数字次幂,它们得到相同的值。这个值就是会话密钥,在两端独立计算,从未在只传输了份额的电线上发送过。公钥数学太慢,无法在对话的每个字节上运行,因此它只用于这一次交换;会话密钥是一个普通的对称密钥,足够便宜,可以在整个请求和响应上运行。

通过这个通道说出的HTTP是HTTPS,你地址栏中的挂锁确切地意味着这一点,仅此而已:你和服务器之间的机器仍然可以看到你与哪个服务器通话、何时以及有多少数据在移动,但看不到说了什么

当你点击一个链接时实际发生了什么

所有这些协议在你每次加载页面时都会运行,基本不变。追踪一次点击从头到尾:

  1. 你点击一个指向https://en.wikipedia.org的链接。你的浏览器提取主机名并询问DNS其IP地址。
  2. 你的浏览器打开一个到该地址的TCP连接,端口443。
  3. TLS握手在该连接上运行,检查证书,商定会话密钥。
  4. 浏览器发送其加密请求GET /wiki/Internet
  5. 响应以数十个IP数据包的形式返回,由TCP重新组装成精确的字节流,由TLS解密,并由浏览器解析和渲染。

这个链也是引言中承诺的诊断工具:一个死页面是网站的问题还是本地的问题,因为每一步都以自己可识别的方式失败。如果任何站点都无法加载,故障在步骤1之前。如果其他站点工作但这个名字无法解析,问题是DNS。如果名字解析但连接超时,服务器或通往它的网络宕机了。一个全页面的证书警告是步骤3失败。如果所有这些都成功并且回复返回500,那么故障最终、可证明地,在服务器内部。

请注意,步骤1到3是纯粹的往返,在页面的一个字节移动之前就付出了延迟,这就是为什么即使是快速连接在开始时也会感觉缓慢。这种分层也是互联网可以在运行时发展的原因。因为每一层只依赖于其下一层的接口,任何一层都可以在不影响其他层的情况下被替换。物理链路可以从铜线升级到光纤,或从电线升级到Wi-Fi,而无需对顶部的应用程序进行任何更改。网络的最新协议HTTP/3甚至取代了TCP本身,在一个称为QUIC的协议中,在UDP之上重建了可靠性和加密。

评论总结

根据评论内容,主要观点和论据如下:

负面观点(认可度较低): - 对“从第一原理”表述和AI生成内容反感。评论1:“I hate everything that uses '.. from first principles' with a passion.” 评论2:“Looks like the widgets are mostly AI slop? Why is this #1?” - 批评设计问题,如深灰文字配黑背景。评论3:“I'd hate to think that tiny dark-gray text on a black background was a conscious choice.” - 质疑评论真实性,怀疑有机器人。评论5:“There's 2 [dead] fairly anodyne comments here. Are they bots?”

正面观点(认可度较高): - 认为内容优质、动画美观、历史背景有趣。评论6:“I found the animations pleasant, the text readable, and the content clearly not slop.” 评论9:“I actually like this post. It looks good, the explanations are clear.” - 赞赏写作清晰、结构好,类似优秀作品。评论11:“Very well written and presented, thank you! Reminds me of Bartosz Ciechanowski's works.” 评论13:“That was a great read. Very informative, well structured.” - 即使使用AI,只要内容好就值得肯定。评论13:“if it is I don’t care. It’s good.”

平衡性总结: 评论呈现两极分化:部分用户批评AI生成内容、设计不佳和疑似机器人评论;另一部分用户则高度评价文章质量、可读性和教育价值,认为AI辅助不影响内容价值。