Loading...
墨滴

PythonCN

2021/08/19  阅读:41  主题:橙心

【翻译】Packet 的旅行 — 主机间通过路由器通信

我们已经研究了两个直接相连的主机进行通信需要什么。 我们已经研究了主机通过交换机与另一台主机通信需要什么。 现在我们添加另一个网络设备,看看流量通过路由器从主机传递到主机需要什么。 ​

本文将是我们将路由器视为数据包旅行中的关键参与者时所讨论的所有内容的实际应用。 在继续之前,可能值得查看该部分。 ​

我们将首先查看两个主要的路由器功能,然后在查看路由器操作时查看它们的运行情况。 ​

通过这些概念讨论的方式,我们将使用下图。 我们将关注 R1,以及它将数据包从主机 A 转发到主机 B 和主机 C 需要什么。

为简单起见,每个 NIC 的 MAC 地址将缩写为4个十六进制数字。 ​

路由器功能

前面我们提到路由器的主要目的是促进网络之间的通信。 因此,每个路由器都会在两个网络之间创建一个边界,它们的主要作用是将数据包从一个网络转发到另一个网络。 ​

请注意,在上图中,我们让 R1 在 11.11.11.x 网络和 22.22.22.x 网络之间创建了一个边界。 我们让 R2 在 22.22.22.x 和 33.33.33.x 网络之间创建边界。 两个路由器在 22.22.22.x 网络中都有一个接口。 ​

为了在网络之间转发数据包,路由器必须执行两项功能:填充和维护路由表,以及填充和维护 ARP 表。 ​

填充路由表

从每个路由器的角度来看,路由表是存在的所有网络的映射。 路由表开始时为空,并在路由器获知到每个网络的新路由时填充。 ​

路由器可以通过多种方式学习每个网络的路由。 我们将在本节中讨论其中的两个。 ​

最简单的方法是所谓的直连路由。 本质上,当路由器接口配置了特定的 IP 地址时,路由器将知道它直接连接到的网络。 ​

例如,在上图中,R1 的左侧接口配置了 IP 地址 11.11.11.1。 这告诉 R1 11.11.11.x 网络的位置存在于其左侧接口之外。 同样,R1 获知 22.22.22.x 网络位于其右侧接口。 ​

当然,路由器不能直接连接到每个网络。 请注意,在上图中,R1 未连接到 33.33.33.x,但很可能有一天它必须将数据包转发到该网络。 因此,必须存在另一种学习网络的方式,而不仅仅是路由器直连。 ​

另一种方式称为静态路由静态路由是由管理员手动配置的路由。 就好像你明确告诉 R1 33.33.33.x 网络存在于 R2 之后,为了到达它,R1 必须将数据包发送到 R2 的接口(配置了 IP 地址 22.22.22.2)。 ​

最后,在 R1 获悉两条直连路由后,并在 R1 配置了一条静态路由后,R1 将有一个类似于下图的路由表。 ​

路由表中填充了许多路由。 每个路由都包含网络到接口或下一跳地址的映射。 ​

路由器每次收到数据包时,都会查询其路由表以确定如何转发数据包。 ​

同样,路由表是存在的每个网络的映射(从每个路由器的角度来看)。如果路由器接收到发往它,没有路由的网络的数据包,那么就该路由器而言,该网络一定不存在。因此,如果数据包的目的地不在路由表中,则路由器将丢弃该数据包。 ​

最后,还有第三种学习路由的方法,称为动态路由。这涉及路由器自动检测并相互通信,以相互通知它们已知的路由。有多种协议可用于动态路由,每种协议代表不同的策略,但遗憾的是它们的复杂性超出了本系列文章的范围。它们无疑将成为未来文章的主题。 ​

也就是说,路由表将告诉路由器接下来将数据包转发到哪个 IP 地址。但正如我们之前了解到的,数据包传递始终是 L2 的工作。为了让路由器创建 L2 报文头,将数据包送到下一个 L3 地址,路由器必须维护一个 ARP 表。 ​

填充 ARP 映射表

地址解析协议 (ARP) 是 L3 和 L2 之间的桥梁。当提供 IP 地址时,ARP 会解析相关的 MAC 地址。 设备使用 ARP 来填充 ARP 表,有时也称为 ARP 缓存,它是 IP 地址到 MAC 地址的映射。 ​

路由器将使用其路由表来确定应接收数据包的下一个 IP 地址。 如果路由表明目的地存在于直接连接的网络上,那么“下一个 IP 地址”就是数据包的目的地 IP 地址——该数据包的最后一跳。 ​

无论哪种方式,路由器都将使用 L2 报文头作为容器将数据包传送到正确的 NIC。 ​

与路由表不同,ARP 表是按需填充的。 这意味着在上图中,R1 不会向主机 B 的 MAC 地址发起 ARP 请求,直到它有一个必须传送到主机 B 的数据包。 ​

但正如我们之前所讨论的,ARP 表只是 IP 地址到 MAC 地址的映射。 当 R1 的 ARP 表将被完全填充时,它看起来像下图。

再一次,为简单起见,本文中的图片仅使用4个十六进制数字作为 MAC 地址。 实际上,MAC 地址的长度为 12 个十六进制数字。 如果更简单,你可以简单地将四位十六进制 MAC 地址重复三遍,从而为 R2 的左侧接口提供一个“真实”的 MAC 地址 bb22.bb22.bb22。 ​

路由器操作

了解了路由器如何填充其路由表以及路由器打算如何填充其 ARP 表后,我们现在可以看看这两个表如何实际用于路由器以促进网络之间的通信。 ​

在上面 R1 的路由表中,你可以看到有两种类型的路由:一些指向接口,另一些指向下一跳 IP 地址。 我们将围绕这两种可能性围绕路由器的操作进行讨论。 ​

但首先,我们将讨论主机 A 如何将数据包传送到其默认网关 (R1)。 然后我们将看看从主机 A 发送数据包到主机 B 以及从主机 A 发送另一个数据包到主机 C 时R1 做了什么。 ​

主机 A 将数据包发送到默认网关 R1

在这两种情况下,主机 A 都在与外部网络上的两台主机通信。 因此,主机 A 需要将任一数据包发送到其默认网关 — R1。 ​

主机 A 将创建 L3 报文头,其源 IP 地址为 11.11.11.77,目标 IP 地址为 22.22.22.88(对于主机 B)或 33.33.33.99(对于主机 C)。 此 L3 报文头将用于从“端到端”获取数据。 ​

但是 L3 报文头不足以将数据包传送到 R1。 必须使用其他东西。 ​

然后,主机 A 将 L3 报文头封装在 L2 报文头中,其中包括 aaaa.aaaa.aaaa 的源 MAC 地址和 aa11.aa11.aa11 的目标 MAC 地址——标识 R1 网卡的 MAC 地址。 该 L2 报文头将用于第一跳传送数据包。 ​

主机 A 已经配置了默认网关的 IP 地址,希望主机 A 已经与外部主机通信。 因此,主机 A 很可能已经有一个带有 R1 的 MAC 地址的 ARP 表条目。 相反,如果这是主机 A 与外部主机的第一次通信,则在形成 L2 报文头之前将有一个 ARP 请求来发现 R1 的 MAC 地址。 ​

此时,R1 将有数据包。 数据包的目标 IP 地址要么是发送到主机 B 的通信的 22.22.22.88,要么是发送到主机 C 的通信的 33.33.33.99。这两个目的地都存在于 R1 的路由表中——区别在于一个路由指向 一个接口和另一个路由指向下一跳 IP。 ​

指向接口的路由

因为路由器直接连接到网络,路由表中指向接口的路由通常是学习的。 如果数据包的目标 IP 地址位于直接连接到路由器的网络中,则路由器知道它们负责将数据包传送到其最后一跳。

该过程类似于之前讨论过的过程。 路由器使用 L3 报文头信息来确定下一步将数据包发送到哪里,然后创建一个 L2 报文头以将其送到那里。 在这种情况下,此数据包必须经过的下一个(也是最后一个)跃点是到达主机 B 上的网卡。

L3 报文头将保持不变——它与主机 A 创建的 L3 报文头相同。

不同的是 L2 报文头。 注意源 MAC 地址是 bb11.bb11.bb11——R1 的右接口 MAC 地址。 主机 A 为将数据包发送到 R1 而创建的旧 L2 报文头被剥离,并生成一个新的 L2 报文头(由 R1)以将其传送到下一个网卡

目标 MAC 地址当然是 bbbb.bbbb.bbbb — 主机 B 的 MAC 地址。 ​

指向下一跳地址的路由

对于从主机 A 发送到主机 C 的数据包,目标 IP 地址将为 33.33.33.99。 当 R1 查询其路由表时,它将确定 33.33.33.x 网络的下一跳位于 IP 地址 22.22.22.2 — R2 的左接口 IP 地址。

实际上,这告诉 R1 使用 L2 报文头,它将数据包发送到 R2,以便继续沿途转发此数据包。

由于当前“跳”在 R1 和 R2 之间,因此它们的 MAC 地址将构成源 MAC 地址和目标 MAC 地址:

同样,L3 报文头保持不变,它包括最初由主机 A 设置的相同源和目标 IP 地址——这些地址代表通信的两个“端”。然而,L2 报文头在每一跳都完全重新生成

如果 R1 没有 R2 的 MAC 地址,它会简单地向路由中的 IP 地址发起 ARP 请求:22.22.22.2。从那时起,创建正确的 L2 报文头将没有问题,该 L2 报文头将从 R1 获取数据包到 R2。

随着过程的继续,R2 将最终接收到数据包,然后面临与 R1 在上例中相同的情况——将数据包传送到其最后一跳。

这个过程可以根据需要继续。如果主机 A 试图与路径中具有 10 个路由器的主机 X 通信,则该过程将是相同的。路径中的每个中转路由器都有一个路由,将主机 X 的网络映射到路径中的下一跳 IP。直到直接连接到主机 X 所在网络的最后一个路由器。最后一个路由器将负责将数据包传送到它的最后一跳——主机 X 本身。 ​

翻译
Host to Host through a Router[1]

参考资料

[1]

Host to Host through a Router: https://www.practicalnetworking.net/series/packet-traveling/host-to-host-through-a-router/

PythonCN

2021/08/19  阅读:41  主题:橙心

作者介绍

PythonCN