【翻译】主机间的路由通信

我们之前研究了主机间直连的通信和通过交换机的通信,接下来该在通信的过程中加入另一个设备路由器了。

这篇文章主要探讨的是路由器作为一个关键角色加入到数据包发送的过程的实际应用。

文章开始会介绍路由器的两个主要作用,并展示它是如何运作的。

在讨论整个环节时,我们会用到下面的图片。我们将关注R1这个路由器是如何将主机A的数据包转发到主机B和主机C的。

packtrav-hhr-initial-1024x212.png

PS:为了简化,我将每个NIC的MAC地址简写成4位16进制数。

路由器的作用

之前我们提到过路由器的作用是在两个网络间传递消息。换句话说,每个路由器都会创建一个网络的边界,它主要的作用就是讲数据包从这个网络转发到下一个网络。

注意上图,R1路由器创造了11.11.11.x和22.22.22.x两个网络的边界,R2创建了22.22.22.x和33.33.33.x两个网络之间的边界,每个路由器都有访问22.22.22.x这个网络的接口。

为了在两个网络间转发,路由器必须执行两个动作:写入和维护路由表以及写入和维护ARP表。

写入路由表

从路由器的角度来看,路由表映射着所有网络的出口。路由表开始是空的,当访问到新的路由网络后会将信息写入到路由表中。

路由器有许多种方法可以探测到其它网络,我们只探讨其中的两个。

最简单的方法就是直连路由。基本上,当路由器配置了一个特殊的IP地址端口时,它就知道了这个IP所在的网络。

比如上图,R1左侧IP地址接口设置成了11.11.11.1。它告诉R1左侧存在11.11.11.x网络的接口。同样的,R1也知道22.22.22.x网络存在在它的右侧。

当然,路由器不能直接连接所有的网络。注意上图,R1路由器没有连接33.33.33.x,但它终有一天会将数据包发送到这个网络中去。因此,这其中必须有另一个方法可以让路由器连接到33.33.33.x网络中去。

另一种方法就是静态路由。静态路由是油管理员手动配置的。就好像你明确的告诉R1,33.33.33.x网络在R2的后面,去找它吧,所以R1不得不把数据包发送到R2的接口。

最终,R1通过直连路由和静态路由,将得到的信息放到路由表中,如下图:

packtrav-hhr-routing-table-300x130.png

路由表有许多路由,每个路由都映射了一个网络接口或者下一跳的地址。

每次路由器收到数据包,它都会查看路由表来安排数据包的转发。

不过,当路由器收到了一个目的地不在路由表的数据包,对路由器来说,那这个路由就是不存在,因此会将数据包丢弃。

其实,还有一个名为动态路由的第三种方法,它涉及到路由的探测以及互相通知已知的路由。不过它有太多的协议和不同的策略要说,我就不放在这篇文章中了。

路由表会告诉路由器数据包将会去到哪个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初始化ARP请求,直到有个数据包需要发送到主机B。

ARP表的样子如下图所示:

packtrav-hhr-arp-table-300x149.png

路由器的运作

当我们了解了路由器的路由表和ARP表后,我们来实际的瞧一瞧路由器是怎么在不同网络间转发消息的。

在上面的R1路由器表,我们可以看到有两种类型的路由:一种是指向一个接口,一种是指向下一跳的IP地址。我们将围绕着路由器这两种进行讨论。

首先,我们先讨论主机A传递数据包到默认的网关(R1)。之后我们观察R1是如何将数据包从主机A发送到主机B,以及发送到主机C。

主机A发送到R1

packtrav-hhr-route-first-hop-300x240.png

无论哪种情况,主机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标头中,L2标头中包括源MAC地址aaaa.aaa.aaaa和目标MAC地址aa11.aa11.aa11——这个mac地址是R1 NIC的标识。L2标头的目的就是实现将数据包传递这一跳。

此时主机A已经被设置成了默认网关的IP地址,主机A也已经可以和外网的主机进行沟通了。按照这种情况,主机A的ARP表很有可能已经有了R1的MAC地址映射。相反的,如果主机A第一次访问外网主机,那么L2标头需要向R1发送ARP请i去来获得R1的MAC地址。

接下来,目标IP的地址只可能是22.22.22.88的主机B或者33.33.33.99的主机C。这两个目标都存在R1的路由器表中,区别是一个路由指向的是接口,一个路由指向的是下一跳的IP地址。

路由指向接口

路由表中的路由指向接口的典型场景就是我们之前说的在同一个网络内访问。如果数据包的目标IP地址在网络内,那么它直接连接到路由器,路由器知道将数据包传递到最终的跳(也就是目标IP地址)。

整个流程和我们之前讨论的一样。路由器使用L3标头信息决定数据包接下来发送到哪儿,之后创建L2标头并发送到目标出。这当前的讨论场景下,下一跳(或者最后一跳)一定回到主机B的NIC。

packtrav-hhr-route-interface-1024x214.png

L3标头并没有改变,现在的标头与主机A创建的L3标头一样。

改变的是L2的标头。源MAC地址现在是bb11.bb11.bb11,即R1右边接口的MAC地址。老的L2标头在R1阶段就被丢弃了。丢弃后又生成的新的标头用来将数据包发到下一跳。

路由器指向下一跳地址

从主机A发送数据包到主机C,目标IP地址是33.33.33.99。当R1查看路由表,它确定下一跳是IP地址22.22.22.2这个R2的路由器。

当跳在R1和R2之间时,L2标头和L3标头如下所示:

packtrav-hhr-route-nexthop1-1024x212.png

L3的标头始终没有改变,一直是主机A初始的源IP和目标IP。但是L2的标头在每一跳都会改变。

R1一开始不会有R2的MAC地址。它会向R2发送ARP请求。这之后,才会使用恰当的L2标头将数据包从R1发送到R2.

我们继续来讲流程,R2收到数据包后,它将面临和R1一样的问题,将数据包发送到最终跳。

整个流程是可以继续延长的,加入主机A要途径十个路由器发送到主机X,每个流程是完全相同的。每次转发都会有一个路由和通向主机X网络的下一个IP地址的映射,直到最终找到主机x所在网络的路由器。最后,路由器会将数据包发送到最后一跳——主机x。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享