这篇文章实际上摘自 Wladston Ferreira Filho 的新书 计算机科学揭秘。这本书是关于万维网背后的所有突破性技术。如今,我们甚至可能认为它们是理所当然的,但它们背后却存在着重要的并且 可以学习 的技术,正是它们使万维网得以运作。继续阅读并惊叹于工程上的巧妙构思,它使计算机之间简单的物理连接成为每个人都可以几乎免费使用的一种全球性的、近乎即时的通信媒介。
人类渴望连接,数字革命的到来使我们比以往任何时候都更加紧密地联系在一起。互联网为数十亿人带来了前所未有的经济和政治自由,以及强大的控制和支配手段。然而,我们中的绝大多数人对它的内部运作却一无所知。
能够为计算机编程以使用互联网的熟练人员是数字革命的先锋。本章将教会你互联网的工作原理,这样你就可以加入这个精选的群体。你将学会
- 连接 计算机以形成网络,
- 使用 Internet 协议组合网络,
从其互联网 地址 找到接收方,
- 找到一条通过互联网到达该位置的 路径,
- 在远距离应用程序之间 传输 数据。
在互联网出现之前,两方之间的电信需要直接的物理连接。在 20 世纪 50 年代,每部电话都有一根线直接通向中央交换台。为了接通电话,操作员必须手动连接两部电话的线路。对于长途电话,线路在遥远的交换台之间铺设,不同地点的多个操作员必须手动连接连接两部电话的线路链。
互联网消除了这种方式。线路不再需要进行物理重新配置以创建直接的、独占的连接。相反,信息通过链接设备链逐级转发,直到到达目的地。这消除了对线路操作员和集中协调的需求。此外,线路不再局限于服务于单个连接,多个并发连接可以共享同一条线路。这使全球通信变得即时、廉价且易于访问。
然而,现代网络技术比早期的电话技术要复杂得多。它有许多连续的层,每一层都建立在上一层的之上。让我们来探索一下在这些不同的层次上是如何建立连接的,从最基本的层开始。
1.1 链接
两台计算机之间的直接连接通过 传输介质 实现:信号流动的物理通道。它可以是传输电流的铜线,也可以是传输光的纤光缆,或者承载无线电波的空气。每台连接的计算机都具有一个 网络接口,用于在传输介质中发送和接收信号。例如,手机有一个无线电芯片和天线来处理通过空气传输的无线电信号。

为了进行通信,网络接口必须就发送和接收信号时要遵循的规则达成一致。这套规则称为 链路层。
当一个介质 专用于 连接两台计算机时,我们说它们保持点对点连接,它们的链路层依赖于最基本的规则集:Point-to-Point-Protocol (PPP)。它只确保两台计算机能够识别彼此并准确地交换数据。
然而,连接的计算机并不总是能够享受这种专有的链接。通常,它们必须与其他几台计算机共享传输介质。
共享链接
在办公室中连接计算机的一种方法是将它们中的每一台都用线缆连接到一个集线器上。集线器通过物理方式连接所有到达它的线缆,因此一台计算机发送的信号将被所有其他计算机检测到!这也会发生在你的家庭 WiFi 上,因为所有连接的设备都使用相同的无线电频率。如果它们同时使用该介质进行通信,通信可能会变得混乱。

链路层包含一组规则,用于定义计算机如何共享其通信介质,恰如其分地称为 Medium Access Control (MAC)。这些规则解决了两个主要挑战
冲突 — 如果两台计算机同时通过同一个介质发送信号,由此产生的干扰会导致两次传输都变得混乱。这种事件被称为 冲突。当你的一群朋友或家人互相交谈,而听不清任何人的声音时,也会出现类似的问题。
有几种方法可以避免冲突。首先,只有在没有其他计算机正在传输信号时才开始传输信号。其次,监控你的通信,如果发生冲突,请等待一小段时间(但时间间隔应随机),然后再尝试重新传输。


这些方法有一些局限性。如果通过一个介质的传输尝试过多,就会持续发生冲突。当过度冲突导致通信中断时,我们说链接 饱和 了。你有没有在大型场所遇到过手机无法发送短信或拨打电话的情况?如果太多手机同时试图进行通信,导致蜂窝网络链接饱和,就会出现这种情况。
物理寻址 — Ada 和 Charles 的计算机之间有一条直接的链接。Ada 想与 Charles 交谈,所以她将包含她消息的信号通过该介质传输。但是,该介质是共享的,因此所有连接到该介质的计算机都会收到该消息。其他计算机如何知道它们接收到的信号不是发给它们的?

每台计算机的网络接口都有一个标识符,称为其 物理地址 或 硬件地址。在共享介质中进行传输时,必须先包含两个这样的地址:接收方的地址和发送方的地址。接收到传输后,一台计算机就知道应该忽略它还是接收它,以及应该回复哪个地址。
只有当物理地址是唯一的时,这才能正常工作:如果两台计算机使用“my_netinterface”,我们就会回到起点。因此,几乎所有网络接口都遵循在介质访问控制规则中定义的命名方案。这些标准物理地址被称为 MAC 地址。
MAC 寻址
计算机、智能手机、智能手表和智能电视都可能具有 WiFi、蓝牙和以太网网络接口。每个网络接口在生产过程中都有其自己的、唯一的 MAC 地址标记在硬件上。你不必担心为你的计算机分配 MAC 地址:你始终可以使用其网络接口附带的 MAC 地址。
由于 MAC 地址只是大型的随机数字,因此全球各地的网络接口制造商必须协调以避免意外地将同一个数字分配给两个不同的设备。为此,它们依赖于 Institute of Electrical and Electronics Engineers (IEEE),它为他们中的每一家分配不同的 MAC 地址范围。
MAC 地址以六对十六进制数1 表达,它们之间用冒号隔开。地址的前半部分是 IEEE 分配给唯一制造商的标识符。然后,该制造商为每个网络接口选择一个唯一的后半部分。
60:8B:0E:C0:62:DE
这里, 608B0E 是制造商编号。这个特定的编号是由 IEEE 分配给 Apple 的,因此这个 MAC 地址应该属于 Apple 设备。2 设备的 MAC 地址通常写在粘贴在包装或设备本身上的标签上,位于序列号旁边。

有一个特殊的地址专用于向介质中的所有计算机广播传输。它被称为 广播地址,它的值是 FF:FF:FF:FF:FF。当你想连接到一个未知设备时,可以使用它。例如,当你的智能手机的 WiFi 卡未停用时,它会持续地向 FF:FF:FF:FF:FF 广播,表明它正在寻找接入点。可发现的接入点将用自己的 MAC 地址进行响应,以便你能够建立链接。
这种发现广播,就像所有其他传输一样,都包含发送方的 MAC 地址。因此,带着智能手机四处走动就像带着一个扬声器不停地喊着自己的名字,只是用无线电波代替声音,用 MAC 地址代替名字。2013 年,爱德华·斯诺登透露,国家安全局3 通过嗅探大城市的 WiFi 传输来监控人们的行动,并存储每个 MAC 地址出现位置的记录。
你也可以将自己的网络接口设置为 混杂模式,它将接收所有传输,无论它们是发给谁的。这样做可以让你发现隐藏的 WiFi 网络,列出你所在区域的 MAC 地址,有时甚至可以读取其他人传输的内容。因此,通过未加密的 WiFi 网络浏览互联网可能不安全:你的通信是广播的,任何在范围内的用户都可以听到。这就是为什么 WiFi 的链路层需要加密4 。
小心:可以配置网络接口,使其传输在 接收方和发送方 的 MAC 地址都使用任何 MAC 地址开头。没有任何东西可以阻止恶意代理通过在他们的传输中使用你的 MAC 地址来冒充你。这种类型的攻击被称为 MAC 欺骗。在发明链路层时,安全并不是一个问题。协议正在不断发展,以变得更加安全并消除此类攻击,但这是一个持续的过程。
帧
有时,传输需要包含大量数据,发送单个大型消息并不实用。网络接口和计算机的传输速度并不相同。此外,如果在传输过程中发生冲突会发生什么?整个传输将不得不被丢弃,因为发件人和接收者很难确定消息的哪些部分被接收,哪些没有被接收。
为了解决这些问题,长消息总是被分割成小部分,每个部分作为一个独立的传输。传输之间的持续时间可以根据两台计算机的功能而变化:速度较慢的设备需要更长的休息时间。如果发生错误,只需要丢弃并重新发送失败的小型传输。

每个独立的传输称为 帧。标准 WiFi 协议将帧的大小限制为 2,346 字节。MAC 地址和错误检测码需要 34 字节。因此,WiFi 帧最终可以承载高达 2,312 字节的数据,称为有效载荷。5 在有线网络中,最大帧大小通常为 1,526 字节,可以容纳 1,500 字节的有效载荷。
在极少数情况下,介质中的干扰会影响传输,接收方会接收到与发送方意图传输的信息不完全相同的信号。让我们来看看专门为解决这个问题而添加的字段。
FCS — 帧的最后一部分是 FCS (Frame Check Sequence),它确保信息被准确传输。它不会向传输添加新信息:它仅仅是对所有其他字段内容进行计算的结果。在 FCS 之前更改任何内容都应该导致 FCS 编号也发生更改。
在收到帧后,计算机根据接收到的信息计算 预期 FCS 编号,并将其与 接收到的 FCS 进行比较。如果不匹配,则丢弃该帧。如果匹配,我们知道消息没有被乱码,并相信接收到的有效载荷没有错误。
TYPE — 图 1.7 中显示的帧还有一个我们没有谈到的字段:有效载荷 类型。它告诉接收方应该遵循哪些规则来解释帧的有效载荷中的数据。在下一节中,我们将探讨最常见的规则集。
1.2 互联网
我们已经看到链路层使直接连接的计算机能够在帧中交换消息。 互联网层,也称为 网络层,指定了如何 不 直接连接的计算机之间传输这些消息。
诀窍是为一些被称为 路由器的计算机配备多个网络接口。网络中的所有计算机都至少链接到一个路由器,而所有路由器都至少链接到另一个路由器。当路由器在一个网络接口上接收消息时,它可以通过另一个网络接口转发到另一个路由器。
局域网 — 我们可以要求我们链接的路由器将消息转发到我们没有链接的计算机。假设您家里有一个有线网络连接着路由器和台式机。假设路由器还直接连接到另一个无线网络中的智能手机。
即使台式机和智能手机没有直接连接到同一个网络,它们也可以使用路由器作为中继相互发送消息。来自不同网络但彼此靠近的计算机可以通过路由器相互通信,形成一个更大的网络,称为 局域网(LAN)。
在一个家庭或小型办公室中,一个路由器就足以连接该地区的所有计算机网络。当组装一个覆盖大型组织(如大学或医院)的 LAN 时,可能需要许多路由器才能将所有不同的计算机网络链接到一个完全连接的系统中。

广域网 — 但为什么止步于此?如果您的路由器连接到您家外的路由器,该路由器又连接到大学的路由器,那么您可以要求将您的消息转发到大学 LAN 上的计算机。当远程 LAN 相互连接时,它们形成一个 广域网(WAN)。

随着更多 LAN 连接到 WAN,WAN 可以变得更大。不同的 WAN 也可以相互连接以形成一个更大的 WAN。世界上最大的 WAN 是一个包含数千个 互连接 网络的集合,我们称之为 互联网。这是我们每天用来发送电子邮件和浏览网络的网络。2019 年,这个 WAN 包含超过 10 亿台计算机。让我们看看它们是如何连接起来的。
互连
将您的路由器连接到互联网的最直接方法是付费。互联网上的一些组织会将他们其中一个路由器链接到您的路由器,并允许您网络的进出消息通过此链接通过他们的网络。这种付费服务称为 转接,因为您所有消息都将 转接 通过他们的网络,然后再发送到您要的目标路由器。
但是,要连接到互联网的另一个路由器,并不总是需要通过第三方网络转接。例如,如果两所附近的大学之间有大量的通信,它们可以将他们的路由器链接起来,以便消息能够直接在他们的网络之间流动。这可以节省资金,因为这些消息否则必须通过付费连接转接。不同组织的网络之间免费交换消息称为 对等连接。
路由
任何连接到互联网路由器的计算机都可以请求将他们的消息转发到其他路由器。消息可以在很远的距离上路由。例如,有一个海底电缆系统将许多沿海城市的路由器连接起来。

迈阿密和布宜诺斯艾利斯的路由器之间没有直接连接。但是,迈阿密与波多黎各相连,波多黎各与福塔雷萨相连,福塔雷萨与里约热内卢相连,里约热内卢与布宜诺斯艾利斯相连。如果沿途的路由器来回转发消息,迈阿密和布宜诺斯艾利斯可以通过这些电缆交换消息。今天,有海底电缆连接着全球数百个沿海城市路由器。

地球上几乎所有其他城市都直接或间接地连接到这些沿海城市,通常通过地面电缆。通信卫星也拥有路由器,以建立到偏远地区的无线连接。所有路由器都可以转发消息,因此您在互联网上发送的消息可以路由到互联网上的任何其他计算机。也就是说, 如果 可以找到一条通往它的路径。
位置寻址
在链路层中,计算机通过物理地址识别。物理地址唯一地识别计算机,但它们不会给出任何关于计算机 在哪里 连接以及如何到达它的提示。如果计算机移动到世界的另一边,它将保留其物理地址!
假设您通过邮局将一个包裹寄给了路易斯,包裹里放着他的照片,而不是他的地址。这个包裹有一个确定的目的地;但是,国际邮政服务将无法知道应该将包裹发送到哪个方向才能将它送到路易斯手中。
邮局首先必须知道应该将包裹发送到哪个国家。该国第一个邮局然后应该知道应该将它发送到哪个省或州。下一个邮局应该知道城市,最后一个邮局应该知道街道地址。包含所有这些信息的地址称为 分层地址。与邮局一样,路由器需要包裹收件人位置的分层地址。

为了使这种机制在全球范围内发挥作用, 所有 参与的计算机必须遵循相同的规则集来创建和处理包裹转发请求。中国的一台计算机必须了解来自尼日利亚的一台计算机的请求,即使两台计算机可能使用不同的语言、操作系统和硬件。

互联网协议
我们已经了解到,计算机必须遵循介质访问控制规则才能与另一台计算机建立连接。类似地,它必须遵循 **互联网协议**,或 **IP** 6,才能请求路由器将消息转发到您局域网或互联网上的其他计算机。
遵循 IP 规则的消息转发请求称为 **IP 数据包**。IP 数据包本质上是一个大数字,其中特定位置的数字编码关键信息。几乎所有计算机都理解 IP 数据包并能够转发它们。这使得 IP 数据包可以轻松地从一台计算机移动到另一台计算机,直到到达目的地。
IP 数据包包含其发送方和接收方的 *位置* 地址,以及他们想要发送的任何数据。要发送 IP 数据包,我们发送一个帧,其中有效载荷是 IP 数据包,帧类型是 86DD。当路由器收到此类型的帧时,IP 数据包将在另一个帧中重新传输到数据包目的地的下一台计算机。

为了使 IP 数据包能够在全球范围内转发,每个人都必须就位置寻址的标准达成一致。我们已经了解了制造商根据介质访问控制规则如何分配物理地址。现在让我们学习互联网协议如何为位置地址执行此操作。然后我们将了解互联网协议如何根据这些地址定义路由规则。
1.3 IP 寻址
互联网协议规定了位置地址的工作方式 - 这就是它们被称为 **IP 地址** 的原因。计算机只有在获得 IP 地址后才能发送或接收 IP 数据包。使用一组 IP 地址的权限首先授予组织。然后,这些地址将分配给直接或间接与该组织关联的计算机。
为了解释此过程的工作原理,让我们定义 IP 地址是什么以及它们是如何编写的。7 IP 地址是一个 128 位长的数字。8 它们通常用十六进制表示,用冒号分隔八组四位数字。这是 Facebook 服务器的 IP 地址
2a03:2880:f003:0c07:face:b00c:0000:0002
IP 地址可以通过省略任何四位数字块的 leading 零来缩短
2a03:2880:f003:c07:face:b00c::2
与包含国家、城市和街道的邮政地址一样,IP 地址是分层的,以便能够进行路由。邮政地址最宽泛的部分是国家,而 IP 地址最宽泛的部分是 **路由前缀** (**2a03:2880**)。
前缀显示为 IP 地址的第一个数字。一旦组织被授予此类前缀,它就有权将其所有以该前缀开头的 IP 地址分配给其计算机。前缀的长度可变:管理更多计算机的组织被授予更短的前缀。一些组织甚至被授予多个前缀。
例如,我们知道所有以 **2a03:2880** 开头的地址都分配给 Facebook 网络内部的计算机。那些以 **2c0f:fb50:4002** 开头的地址位于肯尼亚的 Google 网络中。对于其在新加坡的数据中心,Google 被授予前缀 **2404:6800**。
出于路由目的,共享相同前缀的局域网和广域网被组织成称为 **子网** 的小型网络。路由前缀之后的数字以及 IP 地址中间的数字指示计算机可以在哪个子网(**f003:c07**)中找到。
2a03:2880:f003:c07:face:b00c::2
这意味着 Facebook 中有一个网络,其中所有计算机的 IP 地址都以 **2a03:2880:**f003:c07 开头。路由前缀和子网共同构成 IP 地址的 **网络 ID** (**2a03:2880:f003:c07**)。网络 ID 始终为 16 位长(包括省略的零)。这意味着具有更长路由前缀的组织在其内部可以拥有更少的子网。
最后,IP 地址的接下来的 16 位数字称为 **接口 ID** (face:b00c::2),因为它们标识子网内的特定网络接口。许多网络管理员只是用设备的 MAC 地址填充 IP 地址的这部分。这些数字可以是任何数字,只要在每个子网中只使用一次即可。
为了使此寻址系统在全球范围内有效,必须有一种机制来确保没有两个组织使用相同的路由前缀。与 MAC 地址一样,工程师通过一些国际协调解决了这个问题。

IANA
世界各地的工程师一致同意,美国非营利组织 **互联网号码分配机构 (IANA)** 决定谁控制哪些 IP 路由前缀。在实践中,IANA 将其大部分权力委托给五个称为 **区域互联网注册机构 (RIR)** 的非营利组织。为此,它为每个 RIR 分配简短的十六进制组合,它们可以将其用作分配的路由前缀的首位数字。


要为您的组织获取路由前缀,您必须向路由器所在的区域的 RIR 提出请求。然后,该 RIR 将分配一个以 IANA 分配给他们的十六进制数字组合之一开头的前缀。
例如,总部位于爱尔兰的 Facebook 被 RIPE NCC 授予其路由前缀。同样,瑞士信贷银行在拉丁美洲有一个分支机构,该分支机构被 LACNIC 授予路由前缀。

这意味着拉丁美洲瑞士信贷分支机构的计算机可能会被分配以下 IP 地址
2801:80:1380: ■ ■ ■ ■ :____:____:____:____
银行的网络管理员将为每个子网分配一个唯一的十六进制数字组合,以确保它们适合网络部分的剩余空间 。由于每个十六进制数字可以具有 16 个不同的值,因此银行有足够的空间容纳 164 = 65,536 个不同的子网。Facebook 作为一家更大的组织,被授予了一个前缀,该前缀的空间可以容纳超过 40 亿个子网!
我们已经了解到,网络管理员可以选择如何为单个设备填充接口 ID 的 16 个空格。只要其路由器具有连接性,这些设备就可以发送和接收来自互联网的 IP 数据包。
互联网服务提供商
大多数个人和小型组织不直接与 RIR 打交道,也不维护与其他计算机网络的对等连接。相反,他们从称为 **互联网服务提供商 (ISP)** 的专门公司购买互联网连接。ISP 在靠近其客户的地方安装路由器。这样,他们就可以轻松地将他们的路由器连接到客户场所的路由器。他们还为其每个客户分配路由前缀。
让我们看看它在实践中是如何工作的。在英国,一家名为 Sky 的 ISP 被授予路由前缀 **2a02:0c7f**。Sky 在许多英国城市运营,因此该前缀在他们的区域基地之间分配。例如,他们为其米尔顿凯恩斯网络分配 **2a02:c7f**:48 **,为其罗姆福德网络分配 **2a02:c7f**:7e **。9
假设 Ada 住在罗姆福德,并且想在她家建立一个网络。她有一台台式计算机和一台打印机,她想用以太网线连接它们。她还想创建自己的 WiFi 网络以连接她的智能手机、平板电脑和笔记本电脑。
Ada 雇佣了 Sky,他们将 Sky 的罗姆福德路由器连接到她家中的一个路由器。Sky 为 Ada 的路由器分配了一个基于其罗姆福德基地的 14 位路由前缀。Ada 家中的每个网络(有线和无线)都根据 Sky 分配给 Ada 的路由前缀分配一个子网。下一页的图 1.19 显示了从 IANA 到 Ada 的每个设备的完整 IP 地址分配路径。
Ada 的路由器接收来自不同计算机的 IP 数据包,但她路由器可以轻松地决定将收到的每个数据包转发到哪个链路。发送到 Ada 子网中的计算机的的数据包可以被直接传递。它收到的所有其他 IP 数据包都将通过链路转发到 ISP。

对于不依赖于 ISP 的路由器来说,这并不容易:它们从与来自多个计算机网络的多个路由器的链路获得连接。但是它们如何决定应该将 IP 数据包转发到哪个链路呢?它们如何才能确定将 IP 数据包转发到更靠近最终目的地的路由器呢?
1.4 IP 路由
假设 Ada 想从她的笔记本电脑向 Facebook 发送一条消息。她将使用互联网协议,因此她首先创建包含她自己的 IP 地址、Facebook 的 IP 地址以及她的消息作为有效载荷的 IP 数据包。然后,她将数据包通过 WiFi 帧从她的笔记本电脑传输到她的家庭路由器

从 Ada 家的路由器开始,多个路由器会重新传输数据包,直到它到达 Facebook。在此过程中,每个路由器都必须选择数据包应该“跳跃”到哪个方向才能到达下一个路由器。最后一个路由器将把数据包“跳跃”到最终目标计算机。
地址表
路由器根据数据包的目标 IP 地址选择数据包的下一个跳跃点。为了做到这一点,它们配备了一个装满地址的表格。行列出了路由器配置为识别的可能的 IP 地址。对于每个地址,表格指示哪个计算机应该是目标为该地址的数据包的下一个跳跃点。每个路由器都有一个反映路由器连接方式的唯一表格。例如,以下是 Ada 路由器的连接方式


如果路由器接收到的数据包的目标 IP 地址与表格中任何行都不匹配,则数据包将被转发到 默认路由。对于 Ada 的路由器,路由很简单:数据包要么直接交付到她家中的计算机,要么转发到她的 ISP Sky Romford。
对于 ISP 的路由器,路由更为复杂。除了对等和中转链路之外,它还会接收来自许多不同客户的数据包。为简单起见,假设 Sky Romford 的路由器只服务于两个客户,并且有两个对等链路:一个连接到米尔顿凯恩斯的 Sky 路由器,另一个连接到牛津大学。最后,假设它有一个与更大的电信公司建立的中转链路


这就是 IP 地址层次结构派上用场的地方。在图 1.24 的转发表中,IP 地址根据它们的路由前缀进行分组。这是因为所有以 2a0a:207 开头的 IP 地址都来自牛津大学的计算机,而所有以 2a02:c7f:48 开头的 IP 地址都来自 Sky 在米尔顿凯恩斯服务过的计算机。
互联网交换点
为了提高容量和速度,网络管理员经常会尽可能地与其他组织建立对等链路。最便宜的方法是通过称为 Internet Exchange Points,即 IXPs 的地方。组织通过将路由器连接到 IXP 建筑物来加入 IXP。每个参与组织可以随后与连接到建筑物的其他组织建立独立的对等链路。11
在图 1.23 中,为了清晰起见,只显示了两个对等链路。典型的 ISP 实际上每个 IXP 都有数十个对等链路。此外,在大城市,Netflix 和 Google 等互联网公司通常会直接与 ISP 建立对等链路,使它们能够与许多客户建立更短、更快的连接。
互联网骨干网
ISP 和其他电信公司通常通过在任何可能的地方建立对等链路来尽可能地扩展其互连。但是,为了访问无法对等的网络,它们必须从其他运营商那里购买中转。
世界上有少数公司不向任何人支付中转费用。这些公司运营着 庞大 的网络,这些网络相互对等,使区域 ISP 能够在全球范围内互连。这些 庞大 的网络称为 一级网络,它们构成了互联网的骨干。一些一级网络由 AT&T、Verizon 和 Lumen 运营。12
动态路由
大型电信公司必须维护连接,即使它们的一些中转或对等链路出现故障。这意味着它们不能依赖其地址表中的单个链路来处理每个路由前缀。事实上,它们拥有 动态路由器 ,这些路由器会绘制出其他网络的互连方式,以便选择其表格中优先考虑的路由。
动态路由器会定期与其连接的其他动态路由器交换信息。它们会相互告知哪些网络前缀可以通过它们各自的链路访问。这使它们能够确定每个链路到每个路由前缀的跳跃次数以及这些跳跃发生的位置。动态路由器随后可以根据距离和速度等指标确定到每个前缀的最佳路由。13
有了这些信息,动态路由器会构建一个涵盖所有路由前缀的表格。对于每个前缀,表格都会指示哪个下一个跳跃点位于通往最终目的地的最佳路由上。当建立链路或链路断开时,动态路由器会通知其对等体。随着消息传播,所有动态路由器都会更新其表格以继续将数据包转发到最佳路由。
没有中央实体协调此信息交换:路由器会自由自愿地与其对等体共享链路详细信息。因此,经常会出现路由问题。
路由循环
配置错误的路由器会导致错误。最值得注意的是,错误的地址表会导致数据包 返回 几个跳跃,并陷入一个永无止境的循环

如果表格没有得到纠正,更多具有相同目标的數據包将被无休止地绕圈转发。太多的数据包甚至可能使链路饱和并堵塞。这被称为 路由循环问题。幸运的是,互联网协议提供了一种在问题发生时识别问题的方法。
跳跃限制 — 为了中断永久路由循环,所有 IP 数据包都包含一个 跳跃限制 ,介于 0 到 255 之间。它表示数据包可以被路由器转发的次数。通常,数据包创建时跳跃限制为 64。每当路由器转发数据包时,它都会将跳跃限制减少 1

如果数据包在绕圈,它的跳跃限制最终将达到零。如果路由器接收到的 IP 数据包的跳跃限制为零,则可以将其丢弃。然后,最后一个路由器应该将包含错误消息的 IP 数据包发送回发送方,说明数据包无法交付,因为它的跳跃限制已达到。
通过这种错误消息进行的反馈有助于网络管理员修复严重错误,而路由循环并不是唯一出现的错误。事实上,互联网协议涵盖了如何处理各种路由问题。
诊断
路由器会丢弃无法处理的 IP 数据包。发生这种情况时,它们会向数据包的发送方发送有关事件的信息消息。互联网协议定义了路由器必须如何格式化此类消息,以确保它们可以被任何计算机理解。这些规则是互联网协议的一个子集,称为 Internet Control Message Protocol (ICMP)。
ICMP 为最常见的路由问题分配了错误代码。为了报告问题,路由器会发送一个包含错误代码作为消息主体的 IP 数据包,其格式符合 ICMP 规则。让我们看看一些可以使用 ICMP 报告的常见问题,从路由循环问题开始。
时间已到 — 如果路由器接收到的 IP 数据包的跳跃限制为零,则它的旅行时间已到。数据包要么卡在路由循环中,要么发送方为其分配了不足的跳跃限制。
在这种情况下,会发送一个包含 时间已到 错误代码的 ICMP 消息。ICMP 消息包含丢弃的数据包的前几个字节,以便原始发送方可以知道哪个数据包没有到达目的地。

请注意,Charles 在图 1.27 中发回的 IP 数据包包含一个协议字段。它是一个两位十六进制数,用于标识如何解释数据包的有效负载。最新版本的 ICMP 被分配了协议号 0x3A。所有 IP 数据包都必须包含一个协议号。在下一节中,我们将进一步了解它。现在,让我们探索其他常见的路由问题。
目的地不可达 — 有时,路由器无处发送数据包。这可能出于多种原因,例如 IP 地址不在路由器的地址表中,并且表格中没有建议默认的下一个跳跃点。有时,下一个跳跃点恰好处于离线状态。
当路由器不知道将数据包转发到哪里时,它会返回一个包含 目的地不可达 错误代码的 ICMP 消息,以及丢弃的数据包内容的前几个字节。
数据包过大 — 我们已经看到,链路层协议限制了可以在单个帧中发送的数据量。来自不同类型网络链路的帧可以承载不同大小的有效负载。
单个帧中可以承载的最大有效负载字节数称为其 **最大传输单元 (MTU)**。不同的链路层协议具有不同的 MTU 值。对于以太网帧,MTU 为 1,500。对于 WiFi 帧,MTU 为 2,305。
如果路由器收到一个比下一跳可以处理的更大的数据包,它将无法直接转发该数据包。相反,路由器会返回一条带有 **数据包过大** 错误代码的 ICMP 消息,以及问题数据包的前几个字节和下一跳的 MTU。然后,已通知的发送方可以在再次尝试之前修剪或拆分原始消息为更小的数据包。

**参数问题** - IP 数据包除了有效负载之外,还包含许多额外的信息。我们已经看到它包含 IP 地址、跳数限制和协议号。它还包括一个字段指示有效负载的大小,另一个字段指定它遵守的互联网协议版本。还有一些额外的字段来帮助路由器优先处理重要数据包。
所有这些字段必须按照严格的规则进行排序和格式化。当路由器收到一个不符合协议的数据包时,它会返回一条带有 **参数问题** 错误代码的 ICMP 消息,以及数据包中发现冲突的位置。与往常一样,ICMP 消息还包含一些被丢弃数据包的字节用于识别目的。
**信息消息** - 错误报告不是 ICMP 定义的唯一消息,用于检查和诊断故障的计算机网络。最值得注意的是,**回显请求** 和 **回显应答** 信息消息对被广泛使用。当计算机收到 ICMP 回显请求时,它会返回一个包含 ICMP 回显应答的数据包。
这对于测试计算机是否在线非常有用。有一个名为 **ping** 的程序,它会发送 ICMP 回显请求消息,并测量回复到达你所需的时间。14 此外,通过发送具有不同初始跳数限制的 ICMP 回显请求,你可以跟踪数据包到达目标的路由。15
我们已经看到,互联网上的计算机可以交换信息,例如 ICMP 消息,在 IP 数据包的有效负载中。但是,当应用程序而不是计算机开始使用 IP 数据包的有效负载相互发送数据时,互联网的真正力量就释放出来了。这需要在 IP 数据包中包含额外的信息,以便计算机可以处理其运行的不同应用程序的多个数据流。这些额外信息由 **传输层** 描述,其中包括著名的 TCP 和 UDP 协议。
要继续了解这些协议,请查看我们的书籍,Computer Science Unleashed。本书还将教你如何使用电子邮件和网络等著名的互联网应用程序。并且解释了 DNS 和域名在幕后是如何工作的!了解这些技术对于成为一名全面发展的 Web 开发人员至关重要。除了互联网,Computer Science Unleashed 还涵盖了其他三个突破性技术:数据分析、机器学习和密码学。它还包含一个附录,解释如何使用正则表达式!
1 - 在日常生活中,我们几乎总是以十进制形式表示数字,其中每个数字都是十个字符之一:0、1、2、3、4、5、6、7、8、9。另一方面,计算机科学家喜欢以十六进制形式表示数字,其中每个数字可以是十六个字符之一:0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f。有关数字进制的更多信息,请参阅附录 I。
2 - 你可以在 http://code.energy/mac-lookup 上输入设备的前六个 MAC 地址数字来查找制造商。
3 - **国家安全局**,一个美国政府间谍机构。
4 - 加密允许消息对窃听者看起来混乱。
5 - 如果我们每个字符编码一个字节,一个 WiFi 帧可以容纳大约 500 个单词,足以填满一页文本。
6 - 我们指的是它的最新版本,**IPv6**。该协议的旧版本,**IPv4**,尽管在 1981 年发布,但仍在使用。IPv4 只能支持大约 30 亿台计算机。IPv6 于 2012 年推出,可以支持几乎无限数量的计算机。截至 2020 年,互联网上三分之一的计算机使用 IPv6。
7 - 我们将根据最新版本的 IP 定义的 IP 地址进行介绍。遗留的 IPv4 地址仍在使用。它们被写成四个最多三个数字的十进制数字组,用点分隔,例如 192.168.0.1。
8 - 需要 128 个零和一才能写出这个数字。这意味着它是一个介于 0 和 340,282,366,920,938,463,463,374,607,431,768,211,456 之间的数字。
9 - 这些信息是公开的,你可以查找任何路由前缀的网络位置。这种做法被称为 **IP 定位**,网站就是通过这种方式猜测你浏览的国家和城市。
10 - 我们包含了 WiFi 帧中也存在于以太网帧中的字段。WiFi 帧有更多字段,为了简单起见,这些字段被隐藏了。
11 - IXP 对使互联网连接良好且价格低廉至关重要。这段视频解释了原因:http://code.energy/IXP。
12 - 为了了解这些网络的规模,仅 Lumen 就管理和运营着 750,000 英里的光纤电缆。这足以到达月球 *三次*!
13 - 所有五个 RIR 不断公开其委托的所有路由前缀的信息。动态路由器密切跟踪这些公告,以确保其表中存在每个现有路由前缀的行。
14 - 你可以在此处发送 ICMP 数据包:http://code.energy/ping。
15 - 关于如何使用 ICMP 跟踪 IP 数据包经过的路由的解释,可以在 http://code.energy/traceroute 上找到。