ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 11 章 互联网 阅读笔记 13

《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 11 章 互联网 阅读笔记 13

《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 11 章 互联网 阅读笔记 13

第 11 章 互联网

到目前为止,我们专注于单个设备上发生的计算。本章和第 12 章将介绍分布在多个设备上的计算。
我们将研究计算领域中的两个重大创新:互联网和万维网。
本章重点介绍互联网,首先定义关键术语,然后研究网络层次模型,并深入探讨互联网使用的一些基础协议。

11.1 网络术语

要从整体上讨论互联网和网络,首先需要熟悉一些概念和术语,我们将在这里对它们进行介绍。
计算机网络 (network) 是一个允许计算设备相互通信的系统,如图 11-1 所示。
使用诸如 Wi-Fi 之类的技术,网络可以进行无线连接,Wi-Fi 技术用无线电波传输数据。
网络也可以用电缆(比如铜线或光纤)进行连接。4
网络上的计算设备必须使用通用通信协议,即描述信息如何交换的一组规则。

图 11-1 计算机网络

互联网 (internet) 是全球连接的一组计算机网络,它们都使用一套通用协议。
互联网是网络的网络,连接世界各地各种组织的网络,如图 11-2 所示。

图 11-2 互联网:网络的网络

主机或节点是连接到网络的单个计算设备。
主机可以充当网络上的服务器或客户端,有时两者兼而有之。
网络服务器 是 监听 入站网络连接 并向其他主机 提供服务的主机,例如 Web 服务器和电子邮件服务器。
网络客户端 是 从网络服务器 建立出站连接 并请求服务的主机,例如运行 Web 浏览器或电子邮件应用程序的智能手机和笔记本计算机。
客户端向服务器发出请求,服务器进行响应,如图 11-3 所示。

图 11-3 客户端向服务器发出请求,服务器进行响应

刚才使用的术语 “服务器” 是指 任何接受入站请求 并向客户端 提供服务的设备。
但是,服务器也可以指专门用作网络服务器的一类计算机硬件。
这些专用计算机在物理上设计成安装在数据中心的机架上,通常包含典型 PC 所没有的硬件冗余和管理功能。
不过,任何具有适当软件的设备都可以充当网络的服务器。

11.2 互联网协议套件

物理连接世界网络不足以让这些网络上的设备相互通信。
所有参与的计算机都需要用相同的方式通信。
互联网协议套件规范了互联网上的通信方式,确保网络上的所有设备 “说” 同一种语言。
互联网协议套件中的两个基本协议是传输控制协议 (Transmission Control Protocol,TCP) 和互联网协议 (Internet Protocol,IP),统称为TCP/IP。

网络协议采用层次模型,这种模型的一个实现被称为网络栈(不要与内存中的栈混淆,第 9 章介绍了内存中的栈)​。
底层的协议与底层网络硬件交互,而应用程序与上层的协议交互。
中间层的协议提供服务,比如寻址和数据的可靠传送。
某一层的协议不必关注整个网络栈,只需关注与之交互的层,这样可以简化整体设计。这是封装的另一个例子。

互联网协议套件是围绕 4 层模型设计的,有时也被称为 TCP/IP 模型。TCP/IP 模型的 4 层从下往上分别是:链路层、网络层、传输层和应用层,如图 11-4 所示。

图 11-4 网络的互联网协议套件模型

另一个网络模型

另一个常用的网络协议模型是开放系统互连 (Open Systems Interconnection,OSI) 模型。OSI 模型把协议分为 7 层,而不是 4 层。
这个模型经常在技术文献中被提及,但互联网是以互联网协议套件为基础的,所以本书重点介绍 TCP/IP 模型。

这些网络层代表了一种抽象,一种在讨论互联网操作时使用的模型。
在实践中,每一层都是用特定网络协议实现的。每个网络层都代表一个职责范围,协议必须履行相应层的职责。
表 11-1 提供了对每个层的描述。

表 11-1 互联网协议套件的 4 层描述

每层协议都与其相邻层的协议进行通信。从主机出来的传输向下穿过网络的各层,从应用层协议到传输层协议,再到网络层协议,最后到链路层协议。到主机的传输向上穿过网络的各层,其顺序与刚才的描述相反。

尽管网络主机(如客户端或服务器)使用全部 4 层的协议,但其他网络硬件(如交换机和路由器)只使用较低层的协议。
这类设备 不用费心检查 网络传输 所包含的 较高层协议数据 就可以执行其工作。

从客户端发出的 到服务器的 请求 及其与 网络各层的 关系 如图 11-5 所示。

图 11-5 一个网络请求通过不同的网络层

让我们来看看图 11-5 的流程。
一个客户端上的应用程序使用应用层协议形成了一个请求。
这个请求被传递给传输层协议,然后传递给网络层协议,最后传递给链路层协议。
所有这些都发生在客户端设备上。
此时,该请求被传播到本地网络(图中标记为网络 1)上。
这个请求通过互联网,从一个网络传到另一个网络。
本例中,路由器 A 把该请求从网络 1 路由到网络 2,路由器 B 把该请求从网络 2 路由到网络 3。
当请求到达目标服务器后,它将沿着网络协议向上传递,从链路层协议开始,一直到应用层协议结束。
该服务器上的一个进程接收该请求,根据客户端最初使用的应用层协议进行格式化。
服务器进程解释该请求,并以适当的方式进行响应。

现在我们从底层开始,看看其中的每一层。

11.2.1 链路层

互联网协议套件的底层就是链路层。
主机之间的物理和逻辑连接被称为网络链路。
同一个网络上的设备使用链路层协议相互通信。
链路上的每个设备都有一个网络地址能唯一地标识它。
对于许多链路层协议而言,这个地址被称为媒体访问控制 (Media Access Control,MAC) 地址。
链路层数据被划分成小单元,称为 “帧”​,每帧都包含一个描述该帧的帧标题、数据的有效负载,以及最后用于检测错误的帧尾,
如图 11-6 所示。

图 11-6 链路层帧

帧标题包含源 MAC 地址和目的 MAC 地址。帧标题还包含对帧数据部分所携带数据的类型描述。

如果你家里有 Wi-Fi 网络,那么 Wi-Fi 就是你网络上主机之间的链路。由 IEEE 802.11 规范定义的 Wi-Fi 协议不知道、也不关心在无线网络上发送的数据是什么类型;它只负责允许设备之间的通信。
每个连接到 Wi-Fi 网络的设备都有一个 MAC 地址,并接收发送到其地址的帧。
MAC 地址仅在本地网络上可用,远程网络上的计算机不能直接向本地网络上的 MAC 地址发送数据。

另一个值得注意的链路层技术是以太网 (Ethernet),用于有线物理连接。以太网由 IEEE 802.3 标准定义。
以太网一般使用内部有一对铜线的电缆,其末端是通常被称为 RJ45 的接头,如图 11-7 所示。

图 11-7 常用于以太网的电缆

连接到互联网的所有设备都参与到链路层中。
这是必需的,因为链路层提供的是到本地网络的连接(不论是有线还是无线)​。
主机(比如笔记本计算机或智能手机)参与所有的层次,但是某些网络设备只在链路层操作。
最基本的例子就是集线器 (hub)。网络集线器是一种网络设备,它连接本地网络上的多个设备。
简单的集线器可以对连接的设备提供多个以太网端口。它只是把在一个物理端口接收的每个帧传送到其他所有的端口。
更智能一些的链路层设备是网络交换机,它要检查所接收帧中的 MAC 地址,并把这些帧发送到具有目标 MAC 地址的设备所连接的物理端口。

11.2.2 网络层

网络层使得数据在本地网络之外传送。
本层使用的主要协议简称为互联网协议 (IP)。
它支持路由,即为网络间传输的数据决定路径的过程。
互联网上的每个主机都被分配了一个 IP 地址,它是一个唯一标识全球互联网上主机的数字。
主机也可能拥有不直接在互联网上公开的私有 IP 地址。IP 地址一般由本地网络上的服务器分配,当设备连接到新网络时,其 IP 地址通常会改变。稍后,我们将更详细地介绍地址分配和私有 IP 地址。

在网络层上传送的数据被称为包,它被封装在链路层帧中。图 11-8 展示了 “包在帧数据部分中” 的含义。

图 11-8 帧数据部分中的包

IP 包标题含有源 IP 地址和目标 IP 地址。包标题还包含了包的描述信息,比如使用的 IP 版本以及包标题长度。IP 包的数据部分包含 IP 层携带的有效负载。

如今互联网使用了两个版本的互联网协议。互联网协议版本 4 (IPv4) 是主要使用的版本,另一活跃版本是互联网协议版本 6 (IPv6)。
你可能会好奇:没有 IPv5 吗?这样的协议从未存在过,但是一个被称为互联网流协议的实验协议把它的 IP 版本称为 IPv5,所以在开发 IPv4 的继任者时跳过了 IPv5。
IPv4 与 IPv6 的一个显著区别是IP地址的大小。IPv4 地址长 32 位,而 IPv6 地址长 128 位。这个差异使得 IPv6 的地址数量要多得多。
地址大小的变化有助于解决 IPv4 地址相对短缺的问题。本书中,我们关注的是 IPv4 地址(简称 IP 地址)​,因为它们仍然是如今互联网的主要寻址方式。

32 位 IP 地址通常用点分十进制表示法来显示,这意味着 32 位被分成四个 8 位组,每组中的 8 位都用十进制(而不是十六进制或二进制)显示。
四个十进制数用句点 (.) 分隔。例如,一个 IP 地址用点分十进制表示为 192.168.1.23。每个 8 位十进制数可以称为一个 8 位字节(octet)。

对于连接到同一个本地网络的计算机,其 IP 地址具有相同的前导位,称为位于同一子网 (subnet)。
位于同一子网的计算机,相互之间能在链路层上直接通信,因为它们在同一物理网络上运行。
位于不同子网的计算机必须通过路由器发送其流量,路由器是连接子网的设备,它在网络层上运行。

子网把 IP 地址划分为两个部分:网络前缀和主机标识符。
前者由同一子网上的所有设备共享,后者对于子网上的主机来说是唯一的。
网络前缀所包含的位数随网络配置变化。

让我们看个例子。
假设一个子网使用了 24 位的网络前缀,留下 8 位表示主机。
假设该子网上的主机使用之前的示例 IP 地址 192.168.1.23。给定这个 IP 地址和网络前缀,该 IP 地址的划分如图 11-9 所示。

图 11-9 使用 24 位网络前缀的 IP 地址示例

在这个例子中,本地子网上所有主机的 IP 地址都以 192.168.1 开头。
每个主机的最后一个 8 位字节具有不同的值,其中的 23 分配给此例中的特定主机。
这个例子使用 24 位前缀长度,表示前缀与 IP 地址的前 3 个 8 位字节对齐。
这是个很好的例子,但前缀长度并不总是与 8 位字节的边界对齐。
例如,25 位前缀会包含最后一个 8 位字节的第一位,只留下 7 位标识主机。

为网络前缀保留的位数通常有两种表示方式。
无类别域间路由 (Classless Inter-Domain Routing,CIDR) 表示法列出一个 IP 地址,其后跟一个斜杠 (/),然后是网络前缀使用的位数。
在我们的例子中,应表示为 192.168.1.23/24。
另一种表示前缀位数的常用方法是采用子网掩码——一个 32 位的数字,网络前缀部分中的每个位用二进制 1 表示,主机号部分的每个位用 0 表示。子网掩码也写作点分十进制的形式,所以我们的 24 位网络前缀例子的子网掩码为 255.255.255.0,如图 11-10 所示。

图 11-10 表示为子网掩码的 24 位网络前缀

让我们看看这在实践中为什么有用。
假设计算机的 IP 地址是 192.168.0.133,子网掩码是 255.255.255.244,用 CIDR 表示法表示为 192.168.0.133/27。
假设此计算机想连接到另一台 IP 地址为 192.168.0.84 的计算机。
如前所述,如果两台计算机在同一个子网上,则它们可以直接通信;如果不在同一个子网上,它们必须通过路由器来通信。
因此,该计算机必须确定另一台计算机是否在同一个子网上。如何做到这一点呢?

对 IP 地址和它的子网掩码执行按位逻辑 AND 运算,就可以生成子网中的第一个地址。
第一个地址(其中的主机位全为 0)用作子网自身的标识符。这通常被称为网络 ID。共享网络 ID 的两个计算机在同一个子网上。
主机可以对自己的 IP 地址和它想要连接的 IP 地址执行这个 AND 操作,以查看它们是否共享同一个网络 ID,从而判断是否在同一个子网上。
让我们用示例计算机的 IP 地址来试一下,如下所示:

现在,对我们示例中的第二台计算机执行同样的操作:

从本例中可以看到,这个操作产生了两个不同的网络 ID(192.168.0.128 和 192.168.0.64)​。
这表示第二台计算机与第一台计算机不在同一个子网上。
若要通信,这两台计算机需要通过路由器来发送它们的信息,这个路由器连接两个子网。

还有另一种查看方式:网络前缀描述了子网上能使用的地址范围。
该范围中的第一个地址被定义为网络前缀加上全二进制0的主机标识符。
继续使用 IP 地址为 192.168.0.133 的示例计算机,其子网上的第一个地址是 192.168.0.128。
该范围中的最后一个地址是网络前缀加上全二进制1的主机标识符。在我们的例子中,这个地址是 192.168.0.159。
第一个地址和最后一个地址有特殊含义——第一个标识网络,最后一个表示广播地址(用于向子网上的全部主机发送消息)​。
两者之间的所有地址都可以用于子网上的主机。我们的示例 IP 地址 192.168.0.133 显然在这个范围(从 192.168.0.128 到 192.168.0.159)之内,而另一个 IP 地址为 192.168.0.84 的计算机则不在这个范围中。

你还可以用为主机标识符保留的位数来确定子网上有多少 IP 地址可供主机使用。
在我们的例子中,27 位用于网络前缀,剩下 5 位用于主机标识符。这 5 位提供给我们 32 个可用主机地址,因为 25等于 32。
但是,正如前面所说的,第一个和最后一个地址有特殊用途,所以使用这个网络前缀的话,实际上只有 30 台主机能被标识。
这与我们前面的发现是一致的:第一个主机标识符是 128,128+32 等于 160,它是下一个子网的第一个地址,所以 159 是该地址范围内的最后一个主机。

11.2.3 传输层

传输层为应用程序收发数据提供可用的通信通道。
有两种常用的传输层协议:传输控制协议 (TCP) 和用户数据报协议 (User Datagram Protocol,UDP)。
TCP 提供两个主机之间的可靠连接。它确保错误数最小,数据按序到达,重发丢失数据等。用 TCP 发送的数据被称为段 (segment)。
UDP 是一种 “尽力而为” 的协议,意思是说它的交付是不可靠的。当速度比可靠性更重要时,UDP 是首选。用 UDP 发送的数据被称为数据报。这两个协议都有自己的适用条件,但为了简单起见,本章剩余部分只介绍 TCP。
图 11-11 展示了 TCP 段在包的数据部分中的含义,而包又在帧的数据部分。

图 11-11 TCP 段包含在 IP 包的数据部分中

如前所述,链路层在帧标题中包含了目标 MAC 地址,以识别本地网络接口,
网络层在包标题中包含了目标 IP 地址,以识别互联网上的主机。
这些信息足以让一个数据包到达互联网上的特定设备。
数据包到达其目标主机后,传输层段标题中包含了目标网络端口号,该端口号标识了将要接收数据的特定服务或进程。
单个 IP 地址的主机可以有多个活跃端口,每个端口都用于执行不同类型的网络活动。

打个比方,IP 地址就像是办公楼的街道地址,网络端口号就像是该办公楼中工作人员的办公室号码。
IP 地址唯一地标识主机,就像街道地址唯一地标识办公楼一样。
使用互联网协议,数据包可以被传递给某个主机,就像包裹可以被送达办公楼一样。
但是,数据包到达计算机后,操作系统必须决定如何处理它。
数据包不是为 OS 准备的,而是为在计算机上运行的某个进程准备的。
同样,到达办公楼的包裹不是给传达室工作人员的,而是给办公楼里其他人的。
操作系统检查端口号并把入站数据传递给监听指定端口的进程,
就像传达室工作人员检查包裹收件人姓名或办公室号码把包裹送达正确收件人一样。

在 0~1023 范围内的网络端口被称为已知端口,而在 1024~49151 范围内的端口则可以在 IANA(Internet Assigned Numbers Authority)中注册,称为注册端口。编码大于 49151 的端口是动态端口。

场景常用端口所属范围
正式对外 Web 服务80 / 4430~1023
测试/开发/备用 Web8080、8443、80001024~49151
容器/微服务内部端口5000、9000、3000、88881024~49151
客户端临时连接49152~65535动态端口

从技术上来说,任何具有足够权限的进程都可以监听系统上还未使用的任意端口,这可能会忽略该端口号的典型用例。
但是,当客户端应用程序想连接到另一台计算机上的远程服务时,它需要知道使用哪个端口,所以标准化端口号是有意义的。
例如,Web 服务器通常监听端口 80 和端口 443(用于加密连接)​。Web 浏览器假设它应该使用端口 80 和端口 443,除非另有指示。

服务器使用众所周知的端口以方便客户端连接。然而,绝大多数网络通信是双向的(客户端发送请求,服务器响应)​,
所以客户端也需要有一个开放端口,以便接收来自服务器的数据。
客户端只需要暂时打开这样的端口,时间足够它完成与服务器之间的通信即可。
这种端口被称为临时端口,由操作系统中的网络组件分配。
例如,客户端 Web 浏览器通过端口 80 连接 Web 服务器,且客户端上的临时端口也是打开的,假设端口号为 61348。
客户端把其 Web 请求发送到服务器上的端口 80,服务器把响应发送给客户端上的端口 61348。

IP 地址加上端口号形成一个端点 (endpoint),端点的一个实例称为套接字 (socket)。
套接字可以监听新连接,也可以表示已建立的连接。
如果多个客户端连接到同一个端点,那么,每一个都有自己的套接字。

11.2.4 应用层

应用层是互联网协议套件的最后一层,也是最高层。
虽然较低的三层为互联网上的通信提供了通用基础,但应用层协议关注的是完成特定任务。
例如,Web 服务器使用超文本传输协议 (HyperText Transfer Protocol,HTTP) 检索和更新 Web 内容。
邮件服务器使用简单邮件传输协议 (SMTP) 收发邮件消息。
文件传输服务器使用文件传输协议 (File Transfer Protocol,FTP) 来做什么?传输文件!
换句话说,应用层是我们获得描述应用程序行为的协议的地方,
而这个协议栈的较低层是 “管道”​,使应用程序能在互联网上做它们想做的事情。
完整的四层模型示意图如图 11-12 所示。

图 11-12 应用层数据包含在段数据部分

图 11-12 是一个分层视图,它展示了每层是如何包含在下一层的数据负载中的。
图 11-13 把所有的层组合在一起,我们可以看到发送给互联网上某个设备的一帧内容的表示形式。

图 11-13 一个包含 IP 包、TCP 段和应用程序数据的帧

我们从最接近硬件的层开始,自下而上地遍历了网络帧的内容。
当一帧被主机接收时,主机会按相同的顺序(从链路层一直到应用层)来处理它。
相反,当从主机发出一帧时,帧内容会按逆序组装。
进程准备应用程序数据,该数据被包含到段中,再到包中,最后到帧。

11.3 游历互联网

现在你已经熟悉了四层 TCP/IP 网络模型中的每一层,接下来我们通过一个例子来看看数据是如何在互联网上传输的。
我们将看到沿途各种设备是如何与每个网络层交互的。
图 11-14 展示了左上角客户端与左下角服务器之间的通信。

图 11-14 不同设备在网络栈的不同层进行交互

我将建立图 11-14 中的场景。
客户端设备(图中左上角)连接到一个无线 Wi-Fi 网络。
这个网络通过路由器连接到互联网。
在其他地方(图中左下角)有个服务器,它通过交换机和路由器建立了到互联网的有线连接。
客户端设备的用户打开 Web 浏览器,请求在服务器上托管的网页。
为了简单起见,假设客户端已经知道了服务器的 IP 地址。

客户端上的 Web 浏览器用 HTTP “说话”​,它是 Web 的应用层协议,所以它形成了针对目标服务器的 HTTP 请求。
然后,浏览器把 HTTP 请求传递给操作系统的 TCP/IP 软件栈,要求把数据传送到服务器——明确服务器的 IP 地址和端口 80(HTTP 的标准端口)​。
接着,客户端操作系统上的 TCP/IP 软件栈把 HTTP 负载封装到 TCP 段(传输层)中,并在段标题将目标端口设置为 80。
如果有必要,TCP 会把应用层数据分成多段,每段都有自己的段标题。
客户端上的网络层软件再把 TCP 段封装进 IP 数据包中,IP 数据包的包标题中包含了服务器的目标 IP 地址。
同样,如果有必要的话,IP 会把数据包分成较小的片段,为在网络链路中传送做好准备。
在客户端的链路层上,IP 包被封装进帧中,帧标题中有本地路由器的 MAC 地址。这个帧由客户端设备的 Wi-Fi 硬件进行无线传输。

无线接入点接收该帧。这个接入点在链路层工作,它把帧发送给路由器。
路由器检查网络层数据包以确定目标 IP 地址。为了到达服务器,请求需要途径互联网上的多个路由器。
本地路由器把数据包封装到一个新的帧中——该帧带有新的目标 MAC 地址(下一个路由器的地址)​,然后发送这个新的帧。
路由过程通过互联网上的多个路由器持续进行,直到请求到达服务器所连接的子网上的路由器。

最后一个路由器把数据包封装到适合服务器本地网络的帧中。
这个帧的帧标题包含了服务器的 MAC 地址。该服务器子网上的交换机查看帧中的 MAC 地址,并把帧转发到合适的物理端口。交换机不需要查看更高的层。
服务器接收该帧,网络接口驱动程序把 TCP/IP 包传递给 TCP/IP 软件栈,然后 TCP/IP 软件栈再把 HTTP 数据传递给监听 TCP 端口 80 的进程。
Web 服务器软件监听端口 80,处理请求。这包括回复客户端,为此,整个过程会再次发生,只不过顺序相反。

11.4 互联网基础功能

TCP/IP 为数据在互联网上的可靠传输提供了必要的管道,而其他协议则提供了其他的物联网基础功能。这些功能作为应用层协议来实现。
现在我们来看两个这样的协议(DHCP 和 DNS)以及一个转换 IP 地址的系统 (NAT)。

11.4.1 动态主机配置协议

为了与其他主机通信,互联网上的每个主机都需要一个 IP 地址、子网掩码以及其路由器的 IP 地址(也被称为默认网关)​。
IP 地址是如何分配的?可以为设备提供一个静态 IP 地址,这需要有人编辑设备上的配置,并手动设置其 IP 信息。
有时候,这是有用的,但它要求用户确保待分配 IP 地址还未被使用,且对子网是有效的。
绝大多数最终用户不具备手动配置设备 IP 设置的专业知识,同时也不想处理手动配置的麻烦。
幸运的是,大多数 IP 地址是用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP) 动态分配的。
有了 DHCP,当设备连接到网络时,它会收到一个 IP 地址和相关信息,无须用户干预。

要使 DHCP 在网络上可用,必须把网络上的一个设备配置成 DHCP 服务器。
这个服务器有一个 IP 地址池,这些 IP 地址允许被分配给网络上的设备。DHCP 会话如图 11-15 所示。

图 11-15 DHCP 会话

11.4.2 私有 IP 地址和网络地址转换

可用的 IP 地址是有限的,所以大多数家庭互联网服务提供商 (Internet Service Provider,ISP) 只为一个客户分配一个 IP 地址。
这个 IP 地址被分配给直接连接到 ISP 网络的那个设备(通常是一个路由器)​。
但是,很多客户的家庭网络上都有多个设备。让我们来看看如何利用私有 IP 地址和网络地址转换功能来让多个设备共享一个公网 IP 地址。

某些 IP 地址范围被视为私有 IP 地址,这些地址被用于私有网络,比如那些家里或办公室里的网络,其中的设备不直接连接到互联网。
任何能匹配 10.x.x.x、172.16.x.x 或 192.168.x.x 模式的地址都是私有 IP 地址。
任何人不经允许就可以使用这些范围内的 IP 地址。
问题是私有 IP 地址是不可路由的——它们不能在公网上使用。
家庭网络上的 DHCP 服务器可以分配这些地址,而不用担心其他网络是否会使用相同的地址。
和公网 IP 地址必须唯一不同,私有 IP 地址旨在在多个私有网络上同时使用。
多个网络是否使用相同的地址并不重要,因为这些地址无论如何都不会在私有网络之外被看到。
私有 IP 地址解决了 ISP 只能为家庭或企业提供单个公网 IP 地址的问题,
但是,如果私有 IP 地址不能在互联网上路由,那么它们又有什么用呢?

网络地址转换(Network Address Translation,NAT) 允许私有网络(通常是家庭网络)上的所有设备都使用互联网上相同的公网 IP 地址。
当数据包经过 NAT 路由器时,该路由器修改这些包中的 IP 地址信息。当来自私有家庭网络的数据包到达 NAT 路由器时,其源 IP 地址字段会被修改为公网 IP 地址,如图 11-16 所示。

图 11-16 NAT 路由器把私有 IP 地址替换为它自己的公网 IP 地址

当响应返回路由器时,它把目标 IP 地址设置为发起请求的主机的私有地址。
如此一来,所有来自这个家庭网络的流量似乎都来自同一个公网 IP 地址,即使这个私有网络上实际有多个设备也一样。
NAT 还附带一个安全方面的好处:私有网络上的设备不会直接暴露在公网上,所以互联网上的恶意用户不能直接发起对私有设备的连接。
大多数卖给消费者用于家庭网络的路由器都是 NAT 路由器,一般还有内置无线接入点功能。

私有 IP 地址不仅对家庭网络是有价值的,还对那些不想将其计算机暴露于公网的企业也是有价值的。
许多公司网络使用的是代理服务器,而不是 NAT 路由器。
在允许私有网络上的设备访问互联网这一点上,代理服务器类似于 NAT 路由器,但不同的是,代理服务器一般工作于应用层,而不是网络层。通常,代理还提供其他的功能,比如用户身份验证、流量日志记录以及内容过滤。

11.4.3 域名系统

我们已经看到互联网上的主机是用 IP 地址来识别的。但是,互联网的大多数用户很少(如果有的话)直接面对 IP 地址。
尽管 IP 地址适用于计算机,但它们对用户很不友好。没有人想要去记住一组用句点分割的四个数字。
幸运的是,有域名系统 (DNS)让我们更轻松。
DNS 是一种互联网服务,它把名称映射为 IP 地址。
这使得我们能用类似于 www.example.com(而不是 IP 地址)这样的名称来指代主机。

计算机的完整 DNS 名称为完全限定域名 (Fully Qualified Domain Name,FQDN)。
像 travel.example.com 这样的名称就是一个 FQDN。这个名称由一个简短的本地主机名 (travel) 和一个域后缀 (example.com) 组成。
术语 “主机名” (hostname) 常常可以用于表示计算机的简称或 FQDN。
本节将使用主机名来表示计算机的 FQDN。域(比如 example.com)表示由组织管理的一组网络资源。
example.com 和 travel.example.com都是域名。前者表示网络域,后者表示这个域上的一个特定主机。

软件需要能查询 DNS 以把主机名转换成IP地址——这被称为主机名解析。
要启用这个功能,主机需要配置 DNS 服务器的 IP 地址列表。
这个表一般由 DHCP 提供,通常由互联网服务提供商维护的 DNS 服务器或运行在本地网络的 DNS 服务器组成。
当客户端想要通过名称连接到服务器时,它向 DNS 服务器请求对应该名称的 IP 地址。
如果可以,服务器将用被请求 IP 地址进行响应,如图 11-17 所示。

图 11-17 简化的 DNS 查询。example.com 的 IP 地址不准确

客户端有了服务器的 IP 地址后,它继续用这个 IP 地址与服务器通信,如前所述。
我听说 DNS 被描述成互联网的电话簿,不过这个类比对某些读者来说可能有些不太合适,因为电话簿没有以前那么普遍了!

你可能会设想 IP 地址与名称之间是一对一的关系。实际并非如此。
一个名称可以映射到多个 IP 地址。在这种情况下,不同的客户端向 DNS 查询某个名称,收到的响应可能是不同的 IP 地址。
这对于 给定服务负载 需要被 分布到 多个服务器的情况 非常有用。
它可以在物理上实现,例如,在欧洲的客户端得到的 IP 地址不同于在亚洲的客户端得到的 IP 地址,这能让每个区域的客户端连接到在物理上靠近自己的服务器 IP 地址。

反之亦然:多个名称也可以映射到同一个 IP 地址。在这种情况下,对不同名称的查询会返回同一个 IP 地址。
当服务器托管同一类型服务的多个实例时,这是很有用的,其中的每个实例都用名称识别。
这在网络托管中很常见,当一个服务器托管多个网站时,每个网站都用自己的 DNS 名称来识别。

DNS 中的每个条目都被称为一条记录 (record)。
记录有不同的类型:
最基础的是 A 记录,它只是把主机名映射到 IP 地址。
其他例子还有 CNAME(canonical name,规范名称)记录,它把一个主机名映射到另一个主机名;
以及用于电子邮件服务的 MX(mail exchanger,邮件交换器)记录。

没有一个组织愿意承担管理现存的大量 DNS 记录的任务。幸而这不是必需的,DNS 的实现方式允许责任分担。
像 www.example.com 这样的 DNS 名实际表示的是一个记录层次结构,不同的 DNS 服务器负责维护这个层次结构中不同级别的记录。
应用于 www.example.com 的 DNS 层次结构如图 11-18 所示。

图 11-18 DNS 层次结构示例,突出显示 www.example.com

这个层次结构树的顶端是根域。
根域不会像 www.example.com 那样得到文本表示的 DNS 名,但它是 DNS 层次结构的重要组成部分。
根域包含了所有 TLD(Top-Level Domain,顶级域)的记录,比如 .com、.org、.edu、.net 等。
截至 2020 年,世界范围内有 13 个根名服务器,每个根名服务器都负责了解所有顶级域服务器的详细信息。
假设你想查找以 .com 结尾的域内的一条记录。根服务器可以指向 TLD 服务器,这个服务器了解 .com 下的域。

顶级 DNS 服务器负责了解其下所有的二级域。
.com 的顶级 DNS 服务器可以指向 example.com 的二级 DNS 服务器。
二级域的 DNS 服务器维护属于二级域的主机与三级域的记录。
这意味着 example.com 的 DNS 服务器要负责维护类似于 www.example.com 和 mail.example.com 之类的主机记录。
这种模式不断重复,并允许嵌套域。一个域在顶级域下注册后,该域的拥有者就可以在这个域的下面创建任意数量的记录。

如前所述,当计算机需要查找 FQDN 的 IP 地址时,它向其配置的 DNS 服务器发送一个请求。DNS 服务器收到请求后要做什么呢?
如果服务器最近查找过被请求的记录,那么它的缓存中可能保存有这个记录的副本,服务器可以立刻把 IP 地址返回给客户端。
如果 DNS 服务器在缓存中没有响应,它可能根据需要查询其他的 DNS 服务器以获得答案。
这涉及从根开始,沿着服务器层次结构向下来查找被请求的记录。
当服务器得到这条记录后,它可以缓存该记录,这样将来在查询该记录时,服务器就可以立即予以响应。
最终,缓存的记录会被删除,以确保服务器总是能提供合理的最新数据。

11.5 网络即计算

让我们花点时间来考虑这样一个问题:互联网是如何适应本书已经介绍过的更广泛的计算图景的。
网络看上去像是一个无关紧要的话题,但实际上它与一般的计算并无太大差别。
互联网由硬件和软件组成,它们协同工作,允许设备之间进行通信。
在互联网上传输的数据可以归结为 0 和 1,它们用各种形式表示,比如导线上的电压。
从计算机的角度来看,网络接口(比如 Wi-Fi 或者以太网适配器)就是另一个 I/O 设备。
操作系统通过设备驱动程序与这样的适配器进行交互,且操作系统中包括了能让应用程序在互联网上轻松通信的软件库。
像路由器和交换机这样的网络设备也是计算机,只不过是高度专业化的设备。
互联网和一般的网络是本地计算机的延伸,允许在单个设备边界之外进行数据传送和处理。

11.6 总结

本章介绍了互联网,一组全球连接的计算机网络,它们都使用一套通用协议。
通过本章,你了解了互联网协议套件的四个协议层——链路层、网络层、传输层和应用层。
你看到了数据如何穿过互联网,设备如何在不同的层进行交互。
你了解了 DHCP 如何提供网络配置数据,
NAT 如何允许私有网络上的设备连接到互联网,
DNS 如何提供能替代IP地址的友好名称。
第 12 章将介绍万维网,由 HTTP 通过互联网提供的一组资源。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进