路由器连接主机

路由器连接主机

  之前的两篇文章我们介绍了两个主机直接互连的情况,还介绍了两个主机通过交换机互连的情况,这篇文章我们引入路由器,介绍两个主机通过路由器互连的情况。
  我们先介绍路由器的两个主要功能,再介绍两个主机通过路由器互相通信时路由器的工作流程。
  路由器的两个主要功能是:维护路由表Routing Table和维护ARP表ARP Table。

路由器的功能

  路由器主要负责网络间的通信。为此,路由器会在两个网络之间创建边界,并且负责将数据包从一个网络传递到另一个网络。

  如图,router1在网络1和网络2之间创建了边界,router2在网络2和网络3之间创建了边界。两个路由器都有位于网络2的接口。
  为了将一个数据包从一个网络传递到另一个网络,路由器需要维护两个表:Routing Table和ARP Table。

维护Routing Table

  Routing Table记录了所有存在的网络。刚开始Routing Table是空的,路由器可以通过多种方法来获取到已存在网络的信息。
  最简单的获取已存在网络的方法是直接连接到路由器的网络。当给路由器的接口上配置一个IP地址后,路由器就知道了IP地址所表示的网络直接连接到了路由器上。
  例如图中的router1左边的接口配置了IP地址11.11.11.1,这就等于告诉了router1,网络11.11.11.0/24连接到了左边的接口。同样的,网络22.22.22.0/24连接到了右边的接口。
  当然,一个路由器不可能直接连接所有的网络。例如在图中的route1没有直接连接网络33.33.33.0/24,但实际route1是可以通过router2将数据包发送到网络33.33.33.0/24的。所以必须有其它方法获取非直接连接的网络信息。
  另一个获取存在网络的简单方法是静态路由表。也就是管理员通过手工配置路由信息。相当于,管理员告诉route1,网络33.33.33.0/24需要通过IP地址22.22.22.2来传输。
  通过上述两个方法获取的路由表如下:
方法 网络 接口或下一跳
动态 11.11.11.x 左接口
动态 22.22.22.x 右接口
静态 33.33.33.x 22.22.22.2
  路由表的每一条主要包括三项信息:获取的方法、要达到的网络、接口或下一跳。
  当接收到数据包,路由器根据路由表决定该如何处理这个数据包。路由表记录了路由器知道的所有存在的网络,也就是说,如果一个数据包的目标网络在路由表中不存在时,路由器就会将此数据包丢弃。
  路由表能告诉路由器应该将数据包发给哪个IP地址,但是数据包的传递一直都需要在二层传递,所以路由器还需要维护ARP Table。

维护ARP Table

  ARP协议是二层和三层之间的桥梁。对于给定的IP地址,通过ARP协议可以获取对应的MAC地址。ARP Table就是缓存IP地址与MAC地址对应关系的表。
  换句话说,路由表用来指明应该把数据包发给哪个IP地址,即吓一跳的IP地址,而ARP Table用来获取此下一条IP地址对应的MAC地址,使用此MAC地址来填充二层的头,然后数据包才能在二层传输。

hostA => router1

  假设hostA要发送一个数据包给hostB和hostC。由于hostA与hostB、hostA与hostC都不在同一个网里,所以都不能直接发送,而是需要通过网关来间接通信。
  hostA会创建三层的头,里面包含源和目标的IP地址,用来表示端点到端点。hostA发给hostB的三层头包含:源IP:11.11.11.77,目标IP:22.22.22.88;hostA发给hostC的三层头包含:源IP:11.11.11.77,目标IP:33.33.33.99。由于IP地址表示端点,所以在包的传递过程中,包中的源IP地址和目标IP地址都保持不变。
  由于包的传递是工作在二层的,也就是需要源和目标的MAC地址,所以hostA还需要获取目标的MAC地址。hostA实际上需要将数据包发送给网关,所以先获取网关的MAC地址,将网关的目标地址填充到二层头中,最后将数据包发送出去。

router1 => 接口

  如果路由器接收到的数据包中的目标IP地址在路由表中对应的是接口(例如hostA发送给hostB的数据包),说明目标网络是直接连接到路由器的。这种情况下,路由器会将数据包的二层头剥掉,并重建二层头。新建的二层头里,源MAC地址是路由表中目标接口的MAC地址,目标MAC地址是最终接收主机(也就是hostB)的MAC地址。

router1 => 下一跳

  如果路由器接收到的数据包中的目标IP地址在路由表中对应的是下一跳(例如hostA发送给hostC的数据包),说明目标网络是间接连接到路由器的。这种情况下,路由器会将数据包的二层头剥掉,并重建二层头。新建的二层头里,源MAC地址是路由器中发送数据包接口的MAC地址,目标MAC地址是下一跳的MAC地址(也就是router2左边接口的MAC地址)。
  router2接收到数据包后,会按照router1的工作流程,最终将数据包传递到hostC。