从数据包的角度详细解析:网络运转

在本节中,我们将通过一个完整的网络流量示例,逐步演示计算机在通过计算机网络进行通信时将经历哪些步骤。本示例将整合其他章节中的大量信息,是一个全面而完整的示例。

大多数人都会惊讶地发现,计算机发送一个简单的数据包竟然需要这么多步骤,而且其中有很多步骤对于普通用户来说是完全隐藏的,除非你事先知道,否则你永远不会知道。

如果您已经浏览过本网站的大部分内容,那么您可能已经对本教程可能包含的步骤数量有所了解。

下面的示例展示了一个小型家庭网络,其中一台计算机刚刚启动。该计算机已手动配置了 IP 地址,但尚未与网络通信。用户坐在计算机旁,打开 Web 浏览器并尝试访问 www.iis.se。

首先,我们来看一下整体情况。这张图展示了示例中的网络拓扑结构。在接下来的很多步骤中,我们会放大查看网络中最相关的部分,以避免每次都绘制完整的网络拓扑图。

网络拓扑示例

现在让我们从交通示例讲解开始!

步骤 1:计算机想要发送流量

一台连接到家庭网络的计算机刚刚启动。该计算机已手动配置了 IP 地址、子网掩码、DNS 服务器和默认网关。DNS 服务器和默认网关地址都指向家庭路由器的局域网 IP 地址。

计算机用户打开网页浏览器并访问www.iis.se

首先,Web浏览器会指示计算机上的操作系统建立计算机与www.iis.se之间的通信。

网页浏览器指示操作系统建立会话

步骤 2:DNS

这部分又细分为许多子步骤。

步骤 2a:DNS 缓存

计算机操作系统会检查其 DNS 缓存,以确定是否已知道www.iis.se的 IP 地址。由于计算机刚刚启动,之前从未访问过www.iis.se,因此 DNS 缓存为空。

计算机检查其 DNS 缓存

现在计算机必须向其 DNS 服务器查询www.iis.se的 IP 地址。

步骤 2b:组合 DNS 查询

计算机将构建一个 DNS 查询,并将其发送到它配置使用的 DNS 服务器 192.168.1.1。

DNS 查询的目标地址是 192.168.1.1,源 IP 地址是计算机自身的 IP 地址,即 192.168.1.5。

DNS 使用 UDP 作为传输协议。DNS 查询的目标端口是 53/UDP。当 DNS 查询到达 DNS 服务器时,服务器可以通过查看目标端口 53/UDP 来判断该消息是发往 DNS 服务器程序的,并将消息转发给正在运行的 DNS 程序。

计算机操作系统还必须随机化一个源端口,该端口也会写入消息中。

计算机构建 DNS 查询

但是,当计算机将 DNS 查询组合起来时,它注意到必须检查应该将数据包发送到哪个目标 MAC 地址。

所以目前,操作系统会将数据包放入内存中的一个队列中,然后开始确定要使用的目标 MAC 地址。

步骤 2c:检查 ARP 表中是否存在有效的 MAC 地址

计算机现在将检查其 ARP 表,看看它是否知道与路由器 IP 地址 192.168.1.1 关联的 MAC 地址。

但由于计算机刚刚启动,尚未学习任何 ARP 条目,因此其 ARP 表完全为空。

计算机检查其ARP表

步骤 2d:向网络发送 ARP 请求

现在,计算机必须向网络中的其他设备构建一个 ARP 请求。该请求将被发送到目标 MAC 地址 FF:FF:FF:FF:FF:FF,即广播地址。结果是,局域网上的所有其他计算机和设备都将收到该请求并读取其内容。

计算机发送 ARP 查询

家用路由器收到ARP请求并读取消息,因为该请求发送到了广播MAC地址FF:FF:FF:FF:FF:FF。

家用路由器可以从消息中看到计算机正在请求 IP 地址为 192.168.1.1 的设备。由于路由器配置为使用该 IP 地址,因此家用路由器将通过构建 ARP 应答并将其发送回计算机来响应此消息。

步骤 2e:来自路由器的 ARP 回复

当计算机收到 ARP 回复时,操作系统会读取该回复。它会将回复添加到 ARP 表中,以便在几分钟内记住与 192.168.1.1 关联的 MAC 地址。

路由器对计算机的 ARP 回复

现在计算机终于收集到了发送 DNS 消息所需的所有信息。

步骤 2f:发送 DNS 查询

现在,计算机将向 DNS 服务器发送 DNS 查询,该服务器作为一项服务运行在家庭路由器 192.168.1.1 上。

家用路由器收到查询后,发现这是一个针对路由器自身 IP 地址和 MAC 地址的 DNS 查询,并意识到它必须处理这个 DNS 查询并发送一个答案。

PC 发送 DNS 查询

步骤 2g:家用路由器检查其 DNS 缓存

家用路由器本身就是一个DNS服务器,但它也依赖于互联网上的其他DNS服务器。家用路由器不可能知道互联网上每一个DNS地址。因此,它会根据需要向负责不同域名(例如example.com)的DNS服务器发出请求。

家用路由器也像电脑一样配备了DNS缓存。每次家用路由器处理来自电脑的DNS查询时,它都会将DNS回复保存在自身的DNS缓存中一段时间。这样做是为了避免重复处理相同的DNS查询,从而加快响应速度。

家用路由器会检查其 DNS 缓存

在这种情况下,家用路由器很久没有收到关于www.iis.se 的查询,因此路由器的 DNS 缓存中不存在该域名。所以,路由器必须向其配置的互联网 DNS 服务器请求解析此 DNS 查询。

步骤 2h:家用路由器准备并发送其 DNS 查询

现在,路由器准备向其 DNS 服务器发送 DNS 查询。路由器在首次启动并从互联网服务提供商 (ISP) 获取公网 IP 地址时,通过 DHCP 从 ISP 获知了可用的 DNS 服务器。

因此,家用路由器会准备一个DNS查询,方法是将查询信息封装在一个UDP消息中,目标端口为53/UDP,源端口为随机UDP端口。然后,它会将该消息封装到一个IP数据包中。该IP数据包会从家用路由器的公网IP地址发送到DNS服务器地址。

家用路由器发送 DNS 查询

当家用路由器准备好数据包并准备发送时,它会查看路由表以确定发送路径。路由表显示,到达内部局域网 192.168.1.0 的最佳路径是通过 LAN 端口,但此数据包需要发送到互联网上的另一个 IP 网络。因此,家用路由器选择 WAN 端口作为最佳目标地址。

在此阶段,家用路由器可能需要执行 ARP 请求来查找下一跳路由器 115.20.97.113 的 MAC 地址,但我们假设家用路由器已经在其 ARP 缓存中获得了此信息。

步骤 2i:DNS 查询通过互联网进行路由

这里的一些步骤已经过简化和缩短。

互联网上每个接收到 DNS 请求的路由器都会执行以下操作:

  • 收到包裹
  • 查看目标 IP 地址,以确定数据包的去向。
  • 它会查看路由表,以确定数据包的最佳路径。
  • 从数据包中移除旧的MAC 地址并添加新的 MAC 地址。它会使用自身出接口上的 MAC 地址作为流量的源 MAC 地址,并将下一跳路由器的 MAC 地址作为目标 MAC 地址。
  • 将数据包发送到下一跳路由器

来自家庭路由器的DNS查询通过互联网进行路由。

步骤 2j:DNS 服务器响应

最终,数据包到达 DNS 服务器,DNS 服务器将处理该数据包并准备响应。

就像普通电脑一样,服务器也有IP地址、子网掩码和默认网关。因此,它的工作方式与普通电脑非常相似。

DNS服务器向家庭路由器做出响应

步骤 2k:家用路由器可以向计算机发送 DNS 应答。

现在,在收到来自 DNS 服务器的 DNS 回复后,家用路由器终于可以创建 DNS 回复并将其发送到计算机,以便让计算机知道www.iis.se的 IP 地址。

家用路由器向计算机发送 DNS 应答

步骤 3:计算机建立与 www.iis.se 的会话

在这个阶段,很多事情同时发生。

计算机主要会启动一个名为“TCP 三次握手”的过程,这是 TCP 通信的建立阶段,包含计算机和服务器之间的三条消息。在使用 TCP 时(例如网页浏览),TCP 会尽力确保一切运行正常,包括通过握手建立会话。这样做是为了让服务器做好接收会话的准备,并确定通信应使用的端口。

TCP 三次握手由三条消息组成:

  • 第一个消息由计算机发送,名为“SYN”,代表同步(Synchronise)。它告知对方我们希望同步 TCP 会话的设置。该消息还包含计算机随机选择的 TCP 源端口。
  • 第二条消息是服务器的回复,称为“SYN-ACK”,即同步确认(Synchronise Acknowledgement)的缩写。这表示服务器确认已收到该消息,并已准备好建立通信会话。
  • 第三条消息由计算机发送,通过发送“ACK”(确认)来结束会话。这意味着一切准备就绪。

计算机的ARP缓存中已经存储了家庭路由器IP地址的正确ARP信息。因此,计算机可以通过家庭路由器向互联网发送任何数据包,而无需事先进行ARP查找。

但这也是本例中计算机首次尝试直接与路由器之外的物体通信。TCP 三次握手将在计算机和互联网上的 Web 服务器之间直接进行。

在之前的DNS查找过程中,计算机只是与家用路由器通信。家用路由器再与互联网上的DNS服务器通信。但计算机与互联网上的任何IP地址之间并没有直接通信。

区别在于,现在计算机想要直接与互联网上的某些内容通信,那么家用路由器就必须对流量执行地址转换。

步骤 3a:计算机发送 TCP SYN 消息

接下来,我们将仔细研究计算机通过初始化 TCP 三次握手来建立 TCP 会话时发生的情况。

为此,计算机操作系统会随机生成一个用于通信的 TCP 源端口。然后,它会组装 TCP SYN 消息并将其发送到 Web 服务器。该 TCP 消息不包含任何其他数据,它只是一个空的 TCP 消息。

当 TCP SYN 消息通过路由器时,路由器会对该消息执行 NAT 转换。路由器还会将执行的 NAT 转换信息保存在其 NAT 表中,以便跟踪会话并对任何回复执行反向 NAT 转换。

计算机向Web服务器发送TCP SYN消息

图片显示的是从计算机到Web服务器的TCP SYN数据包。

  • “我想与您同步一个 TCP 会话”

步骤 3b:Web 服务器回复 TCP SYN-ACK 包

这里可以看到 Web 服务器返回给计算机的 TCP SYN-ACK 响应:

  • “好的,我可以安排会话了,我确认已收到您的消息。”

计算机向 Web 服务器发送 TCP SYN-ACK 消息

该数据包与路由器上的 NAT 表条目匹配,以便路由器能够看到应该将数据包转发到哪个 LAN 计算机以及如何对数据包执行 NAT。

步骤 3c:计算机发送 TCP 确认信号

最后,计算机向Web服务器发送TCP ACK确认包。

  • “那么我确认,从现在开始,我们正式成立一个会议!”

计算机向Web服务器发送TCP ACK

只要计算机和服务器持续通信,它们就会一直使用同一个会话进行通信。这包括使用相同的TCP端口,这样沿途的所有设备都能跟踪会话、地址转换等信息。

会话可能只持续足够长的时间以下载网页,或者网络服务器和计算机可以选择保持会话更长时间,以防用户想要继续浏览网页。

步骤 4:网页浏览器与 Web 服务器通信

一旦操作系统建立了 TCP 会话,操作系统就会通知 Web 浏览器现在可以开始与 Web 服务器通信了。

网络浏览器会使用HTTP协议来实现这一点,HTTP协议是互联网上传输网页的标准协议。

计算机和Web服务器之间建立HTTP会话

这也意味着我们已经完成了示例,其中包括建立通信的大部分步骤。从现在开始,计算机和服务器可以相互通信以传输网页,直到传输完成。然后,它们可以选择发送所谓的 TCP RESET 消息来结束会话,该消息会通知所有设备会话已结束。

------------- 本 文 结 束     感 谢 您 的 阅 读 -------------