上一篇文章《二十二、网络层篇-一文搞定IP数据报转发过程》中详细说明了IP数据报的转发过程,包含在同一局域网内转发的情况、跨网络转发等情况,我们可以看到,上面描述过程中有点像“接力赛”,一个个路由器就好像一个个交棒的选手,而传递的消息就像接力棒。
而保证路由器接力的顺利,都得依仗本篇的主角:路由表。
一、路由表概述
曾几何时,我们在《15、数据链路层篇-以太网交换机自学习、帧转发流程》学习到交换机内有一张CAM表来记录了MAC地址和交换机端口号的映射关系,通过这张表我们可以快速知道在局域网内通过交换机的哪个接口把消息发送出去。
实际上,路由器也有一个表,该表指示要向其发送数据报的下一个路由器,以使其到达目的地。
也就是路由表。其中一列记录的是要加入的网络的列表,另一列则记录必须向其发送数据报以加入这些网络的路由器IP列表。
注意,前者说的网络列表不是某个机器的 IP 地址,而是一个网络的地址。因为如果路由表需要记录互联网上每台机器的 IP 地址,则路由表将过于庞大!
后者是路由器地址,这些路由器也被称为网关(Gateway
),因为它们充当两个网络之间的“关口”。
网关就表示“网络的关口”,就好像古代的一个城的城门一样,你要进入一个网络(就像一个城),需要通过城门才能进去。你要出一个城,也得通过城门出去。
比如一个简单的路由表核心内容长这样:
要连接的网络的地址 |
网关的IP地址 |
192.168.1.0/24 | 10.0.0.253 |
192.168.122.0/24 | 10.0.0.47 |
我们先看看Linux
上的路由表。如果你是Macos
的话可以输入netstat -nr
,如果是Linux
的话可以输入route -n
命令,如果是Windows
系统的话,可以输入route print
命令。
我找了一台centos
的机器。要查看本机的路由表,可以用 route -n
命令:
可以看到第一行是默认路由,什么是默认路由?这里先给出结论:下面的Destination
为default
或者0.0.0.0
就是指默认路由,至于什么是默认路由,为什么需要默认路由,不要着急,马上就会说到。
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
我们也可以看下本机的路由表,本机是一个普通的windows
机器:
上图中,可以看到我们的路由表有 5 列,分别是“网络目标”(也就是“目标网络”),“网络掩码”(也就是“子网掩码”),“网关”,“接口”,“跃点数”。
图中有个名词叫做:在链路上。是指网关的 IP 地址和 IF(
Interface
的简称,表示“接口”)那列的接口的 IP 地址是一样的情况。这种情况下,不需要通过路由器转发,可以直接与其通信。
还可以看到的本机所属的网络是192.168.101.0/24
,并且网关用的是我本机IP:192.168.101.2
.
这里路由表的第一行其实就是默认路由,192.168.101.1
就是我们的默认网关地址了,不确认?我们再来看下,输入ipconfig
:
原来Windows
这里的默认网关就是默认路由啊。那默认路由是干啥的啊?
它帮助我们解决了一个头疼的问题:如果我已连接到互联网,那我是否需要为互联网上数以亿记的网络中的每一个网络都记录一个对应的路由呢?
如果我要加入的网络地址不属于路由表中的任何网络,则必须使用默认路由中指示的网关。这可以解决与互联网上众多的网络有关的问题。对我来说,在表中指明一条默认路由就足够了,该默认路由将允许我连接到互联网,然后就可以加入其他的所有网络。
总结下路由器的功能:
-
路由器是一种具有多个网络接口的机器;
-
路由器的每个接口都连接到一个网络,因此路由器将多个网络连接在一起;
-
任何具有多个网络接口的机器都可以扮演路由器的角色,甚至是几十年前的一台电脑;
-
路由器不同于普通的机器,因为它可以分发(起到中继(relay)的作用)不是发给自己的数据包;
-
路由器通过路由表来分发数据包;
-
路由表指明了要使用哪个网关(
Gateway
)来加入一个网络。
二、编写简单的路由表
关于路由表,简单来说,路由表的核心元素是:要连接的网络和网关的 IP 地址。路由器通过路由表来分发数据包。如果我要加入的网络地址不属于路由表中的任何网络,则必须使用默认路由中指示的网关。
好了,关于路由表的理论介绍就到此为止了,下面就是通过一个例子来学习下路由表是如何编写的,注意,这里就是采取静态配置的形式进行路由表的配置,方便学习路由表的由来和含义。
首先说明下,图中1,2,3用了简写,通过网络地址很容易判断出来它们的实际IP是192.168.0.1
等等,路由器两个接口的地址也很容易可以推导出来了。
*2.1 为路由器1写路由表
首先,路由器需要一个路由表,我们为路由器1写路由表,有一个万能的准则:
-
①写出本机要去连接的网络;
-
②写出默认路由;
-
③写出本机无法通过前面的两个步骤加入的所有其他网络。
A、指明本机连接的网络
我们的路由器 1 连接到两个网络 192.168.0.0/24
和 192.168.1.0/24
。路由表可以暂时写为:
要连接的网络的地址 |
网关的IP地址 |
192.168.0.0/24 | ? |
192.168.1.0/24 | ? |
下面先写默认路由,上面的网络图的情况有点特殊,因为我们的路由器 1 已经连接到图中的所有网络了。路由器 1 不需要默认路由即可转到其他网络,因为它已经都知道了!所以默认路由在本例中可省略。
C、写出本机无法通过前面的两个步骤加入的所有其他网络
最后无法加入的其他网络,也没有。
那么就剩下网关IP地址没有写了。有一个规则:连接到我所属的网络的网关的地址,也就是我自己本身的地址。这句话有点拗口,下面结合实际例子说明。
首先,要连接到192.168.0.0/24
需要是通过192.168.0.254
的接口去连接的,因此网关地址自然就是192.168.0.254
,这里的192.168.0.254
其实就是咱路由器自己一个接口的地址。最后完善路由表之后就是:
要连接的网络的地址 |
网关的IP地址 |
192.168.0.0/24 | 192.168.0.254 |
192.168.1.0/24 | 192.168.1.254 |
*2.2 为普通机器写路由表
其次,我们需要为我们的机器编写路由表。
对于我们的机器,可以通过这个路由器去跟其他网络的机器通信了吗?目前还不行,因为网络中的机器也有一个路由表。连接到网络的任何机器都具有路由表。有了路由表,机器在要加入其他网络时才能知道应该向哪个网关发送数据包。因此,我们现在可以为网络中的机器编写路由表,以 IP 地址为 192.168.0.1
的机器为例。那么还是上面的规则:
A、指明本机连接的网络
我的机器( IP 地址为 192.168.0.1
)只连接到了 192.168.0.0/24
这一个网络,因此,路由表暂时是这样的:
要连接的网络的地址 |
网关的IP地址 |
192.168.0.0/24 | ? |
这次,我们可以写出除了自己的网络之外的其他网络(例如 192.168.1.0/24
这个网络)的默认路由:
要连接的网络的地址 |
网关的IP地址 |
192.168.0.0/24 | ? |
default | ? |
我们已经写出了可以加入的两个网络,并没有其他网络了,因此可以忽略这一步。
继续完善网关IP地址,还是按照上面说的规则:连接到我所属的网络的网关的地址,也就是我自己本身的地址。
那么我这台机器要连到192.168.0.0/24
,这个网络也就是我所属的网络,那么网关地址就是我自己的IP地址,即:
要连接的网络的地址 |
网关的IP地址 |
192.168.0.0/24 | 192.168.0.1 |
default | ? |
因为是局域网内,局域网内就没有网关的概念了,局域网任任意机器都可以互相访问。所以,如果硬要在局域网内添加网关的概念, 那么自身就是网关【通过自己,与其他网络建立连接】
还剩一个默认路由的网关IP地址,问题可以转换为:192.168.0.1
这台机器应该向谁发送数据包,以使数据包能到达 192.168.1.0/24
这个网络呢?
显然,我们需要发给路由器1,但是发给哪个接口呢?
我们之前把网关比喻成城门的守卫,那么我要访问另一个城门,那么必然是先从我这个城门出去,也就是说先访问我在的城门的守卫,再有可能去访问另一个城门。
因此啊,我要加入某个网络,机器就必须使用自己所属网络的网关。那么跟192.168.0.1
在一个网络的网关地址显然就是192.168.0.254
:
要连接的网络的地址 |
网关的IP地址 |
192.168.0.0/24 | 192.168.0.1 |
default | 192.168.0.254 |
三、编写稍微复杂点的路由表
*3.1 为路由器1写路由表
A、指明本机连接的网络
很简单,跟上面一个例子没啥区别:
要连接的网络的地址 |
网关的IP地址 |
192.168.0.0/24 | 192.168.0.254 |
192.168.1.0/24 | 192.168.1.254 |
由于需要连接互联网,看到右下角的网络连到了互联网,因此我们的默认路由跟路由器3有关系。经过上面的学习我们很容易知道默认路由如何写:
要连接的网络的地址 | 网关的IP地址 |
192.168.0.0/24 | 192.168.0.254 |
192.168.1.0/24 | 192.168.1.254 |
default | 192.168.1.253 |
10.0.0.0/24 | 192.168.0.253 |
还有一个10.0.0.0/24的网络也是同理,至此,路由器1的路由表就搞定了,是不是很简单。
C、写出本机无法通过前面的两个步骤加入的所有其他网络
纵观整个网络,只剩下右上角的10.0.1.0/24
的网络还未涉及了。但是,如果仔细看一下,我们也知道如何加入 10.0.1.0/24 这个网络,因为它位于我的默认网关(192.168.1.253)之后。
假设路由器 1 想要将数据包发送给 10.0.1.1 这台机器,它将查看自己的路由表。实际上,它将一一遍历路由表的记录(每一条记录对应一个路由),并检查要连接的机器是否属于路由表中定义的网络:
-
10.0.1.1 不属于第一条路由的 192.168.0.0/24 网络,因此不适合;
-
10.0.1.1也不属于第二条路由的 192.168.1.0/24 网络,因此也不适合;
-
第三条路由是默认路由。就像默认路由的定义告诉我们的那样,我们将使用与默认路由关联的网关,数据包将被发送到路由器 3 的地址为 192.168.1.253 的接口。由于路由器 3 已连接到我们要加入的 10.0.1.0/24 网络,因此它将能够向其传输数据包。
*3.2 为192.168.0.1写路由表
通过三步法来做,很容易就可以得出:
要连接的网络的地址 | 网关的IP地址 |
192.168.0.0/24 | 192.168.0.1 |
default | 192.168.0.254 |
10.0.0.0/24 | 192.168.0.253 |
其实,默认路由除了 default 这种表示法,还有另一种可能的表示法,就是 0.0.0.0/0。用 default 还是 0.0.0.0/0 通常取决于操作系统。
关于如何静态配置路由表就先说到这里,由于静态配置只适合小型网络,根本不可能用在大型网络中,试想,让你配置成千上万个路由器,你干吗?就算你干,你敢保证不出问题吗?网络变化的时候谁来维护呢?带着这一系列问题,我们后续将目光转向互联网所使用的动态路由选择协议!本文完。
原文始发于微信公众号(幕后哈土奇):二十三、网络层篇-路由表
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/113980.html