前面我们讨论了两个直接相连的主机间的通信和经过交换机的主机间通信,本篇我们来说说经过路由器的主机间通信。

为了方便讨论,我们将使用下图来进行说明。我们会关注路由器 R1,以及它将数据包从主机 A 转发到主机 B 和主机 C 分别需要什么。

经过路由器的主机间通信

为了简便起见,图中我们仅使用四位十六进制数表示 MAC 地址。

路由器的功能

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

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

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

填充路由表

路由表中保存了现有所有的网络。路由表开始时为空,路由器在获知到每个网络的新路由时填充会填充它。

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

直连路由( Directly Connected route)是最简单直接的方法。当路由器接口配置了特定的 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。这时候就需要借助于静态路由的方法。

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

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

路由表

路由表里记录了许多路由。每个路由都包含网络到接口或下一跳地址的映射。

每当路由器收到一个数据包,它就会查询路由表来决定如何转发这个数据包。如果接收到的数据包中,目标地址不在路由表内,那么路由器会认为这个网络不存在,会丢弃这个数据包。

除了上面两种方法以外,还有一种方法,动态路由(Dynamic Routing)。路由器之间会自动检测并相互通信,以告知彼此已知的路由。动态路由有很多种协议实现,考虑到复杂性,本文不做详细的说明。

填充 ARP 表

我们知道,第二层负责传输数据,因此,路由器还需要借助于 ARP 协议来获取 MAC 地址,这些信息被保存在路由器的 ARP 表中。

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

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

ARP 表中记录者 IP 地址到 MAC 地址的映射,如下图所示。

ARP 表

路由器是如何工作的

了解了路由器如何填充路由表和 ARP 表以后,我们现在来看看在网络通信中,路由器是如何工作的。

在上面 R1 的路由表中,我们可以看到有两种类型的路由:一些指向接口,另一些指向下一跳 IP 地址。我们会针对这两种类型的路由分别说明。

不过,首先我们得说明主机 A 是如何将数据包发送给路由器 R1 的。

主机 A 到 R1

主机 B 和主机 C 都处于外部网络中,要与它们通信就必须将数据包先发给主机 A 的默认网关(路由器 R1)。

主机 A 会使用自己的 IP 地址 11.11.11.77 作为原 IP 地址,使用 22.22.22.88(主机 B) 或者 33.33.33.99(主机 C)作为目标地址来构建第三层数据头。要实现数据传输,主机 A 还需要知道下一跳的 MAC 地址来构建第二层数据头。

如果主机 A 已经配置了其默认网关的 IP 地址,或者主机 A 已经与外部主机通信过。那么,主机 A 很可能已经有一个带有 R1 的 MAC 地址的 ARP 表记录。但是如果这是主机 A 与外部主机的第一次通信,则在构建第二层数据头之前,主机 A 会先通过 ARP 请求获取 R1 的 MAC 地址。

当数据包到达路由器 R1 的时候,目标 IP 应该已经在 R1 的路由表中了。

指向接口的路由

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

与前面已经讨论过的相同,路由器使用第三层数据头信息来确定下一步将数据包发送到哪里,然后创建一个第二层数据头以将其发送到那里。在这个的例子中,此数据包必须经过的下一跳(也是最后一个)是到达主机 B 上的 NIC。

指向接口的路由

在传输的过程中,第三层的数据头不变,与主机 A 初始创建的第三层数据头相同。变化的是第二层的数据头。新的第二层数据头原 MAC 地址变成了 bb11,路由器 R1 右边接口的 MAC 地址,目标 MAC 地址变成了 bbbb,主机 B 的 MAC 地址。原始的第二层数据头被丢弃掉了。

指向下一跳 IP 的路由

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

此时,路由器 R1 就会构建一个第二层数据头,将数据包发送到路由器 R2,以便继续沿途转发此数据包。由于当前“跳”在 R1 和 R2 之间,因此它们的 MAC 地址将构成源 MAC 地址和目标 MAC 地址。

指向下一跳的路由1

第三层数据头保持不变,它包括了最初由主机 A 设置的源和目标 IP 地址,这些地址代表通信的两个“端”。第二层数据头在每一跳都完全后重新生成。

如果 R1 没有 R2 的 MAC 地址,它会简单地向路由中的 IP 地址发起 ARP 请求:22.22.22.2。之后,就可以创建正确的第二层数据头,数据包就可以从 R1 发送到 R2 了。

随着传输过程的继续,R2 将最终接收到数据包,然后像 R1 在上例中一样,将数据包传送到其最后一跳。

这个过程可以根据需要不断重复。如果主机 A 尝试与路径中隔有 10 个路由器的主机 X 通信,则主机 A 需要 10 个这样的过程来将数据正确的输出过去。在这个传输路径中,每个中转路由器都有一个路由,将主机 X 所在的网络映射到路径中的下一跳 IP。直到与主机 X 所在网络直接连接的最终路由器。这个最终路由器将负责将数据包传送到它的最后一跳,主机 X 本身。

总结

本文对路由器是如何构建路由表和 ARP 表做了说明。

同时,借助于示例,演示了路由器是如何跨网络传输数据的。

关注微信公众号,获取最新推送~