目录
一、前言
1.1 静态路由定义
1.2 静态路由可能造成路由环路的原因
1)配置错误
2)聚合了不存在网络
3)网络故障
二、案例说明
2.1 案例1(静态路由配置)
案例小结
2.2 案例2(默认路由配置)
案例小结
三、路由环路问题的解决方案
3.1 配置错误
解决方案
3.2 聚合了不存在网络
解决方案
3.3 网络故障
解决方案
四、总结
静态路由(static routing) 是指用户或网络管理员手动将路由添加到路由器中,静态路由配置简单,开销小,很难适应网络状态的变化。一般应用于规模较小的网络中。
我们以一个最简单的网络拓扑说明静态路由配置,如下图所示。
图中,路由器R1和R2通过接口0和接口1所配置的IP地址和子网掩码,可自动得到每个接口所在的网络。同时,接口与网络直连,属于直接交付。R1,R2最基本的路由表如下表所示。
R1的路由表 | ||
目的网络 | 下一跳 | 类型 |
192.168.1.0/24 | 接口0 | 直连 |
10.0.0.0/30 | 接口1 | 直连 |
R2的路由表 | ||
目的网络 | 下一跳 | 类型 |
10.0.0.0/30 | 接口0 | 直连 |
192.168.2.0/24 | 接口1 | 直连 |
假设网络子网1中的主机A向子网3中的主机B发送数据报,从图中可以看出,数据报的转发顺序为:主机AR1接口0
R1接口1
R2接口0
R2接口1
主机B。
可是R1 现有的路由表中并没有关于子网3的路由条目,即R1并不知道目的网络的存在。因此,我们可以给路由器R1添加一条到达子网3的路由条目,如下表所示。
R1的路由表 | ||
目的网络 | 下一跳 | 类型 |
192.168.1.0/24 | 接口0 | 直连 |
10.0.0.0/30 | 接口1 | 直连 |
192.168.2.0/24 | 10.0.0.2 | 静态 |
这样,子网1中的主机就可以将数据报发送至子网3的主机。
同理,若想子网3中的主机能向子网1中的主机发送数据报,则路由器R2的路由表应配置为如下所示。
R2的路由表 | ||
目的网络 | 下一跳 | 类型 |
10.0.0.0/30 | 接口0 | 直连 |
192.168.2.254/24 | 接口1 | 直连 |
192.168.1.0/24 | 10.0.0.1 | 静态 |
本案例简单讲解了静态路由的基本使用,但在实际的使用环境中,网络错综复杂,如果仅仅依靠人工给路由器添加针对这些网络的每一条路由条目,一方面不符合实际需求,另一方面会使得路由器的路由表非常庞大,降低查表转发速度,因此我们引入了默认路由的概念。
我们在案例1的基础上,让路由器R2接入因特网,如下图所示。
假设子网1中的主机A向因特网发送数据报,从图中可以看出,数据报的转发顺序为:主机AR1接口0
R1接口1
R2接口0
R2接口3
因特网的某个主机。
正如案例1中总结,如果我们在路由器R1中逐个添加通往因特网的路由条目,一方面不符合实际需求,另一方面会使得路由器的路由表非常庞大,降低查表转发速度,因此我们可以通过添加默认路由解决这一问题。
默认路由条目用于替代具有相同下一跳的不同目的网络的路由条目,默认路由条目的目的网络为0.0.0.0,地址掩码为0.0.0.0,因此R1的路由表可配置为如下所示。
R1的路由表 | ||
目的网络 | 下一跳 | 类型 |
192.168.1.0/24 | 接口0 | 直连 |
10.0.0.0/30 | 接口1 | 直连 |
192.168.2.0/24 | 10.0.0.2 | 静态 |
0.0.0.0/0 | 10.0.0.2 | 静态 |
我们可以发现如果我们从子网1发送数据报到子网3,数据报既可以走目的网络为192.168.2.0/24的路由条目,也可以走目的网络为0.0.0.0/0的默认路由条目,那数据报到底会走哪一条路由条目呢?
由于192.168.2.0/24的网络前缀更长,所以路由也就更具体。而默认路由的网络前缀较短,路由也就更模糊, 因此当路由器查表转发IP数据报时,若有多条路由条目可选,通常会采用最长前缀匹配原则,选择目的网络前缀最长的那条路由条目进行转发 。所以如果子网1的主机向子网3的主机发送数据报,会走192.168.2.0/24这一路由条目。
所谓路由环路,就是数据包不断在这个网络传输,始终到达不了目的地,导致掉线或者网络瘫痪。我们在先前的博客Linux bridge table(brctl)的文章中使用“brctl show”命令查看网桥信息时遇到过“STP enabled”参数,该参数便是用于解决路由环路问题的,路由环路问题产生原因通常如下所示。
本案例的实验拓扑如下图所示。
下图为正确配置路由表时的场景。
若路由器R2想要转发数据报给R1,通过R2路由条目的第三条是能正确发送的。当我们故意将静态路由配置错误(红色部分),如下图所示。
此时,当R2再向路由器R1转发数据报(目的网络为192.168.1.0/24),其传输过程如下所示:
1)路由器R2通过第三行的路由条目将数据报转发给路由器R3的接口0(10.0.1.2);
2)路由器R3收到数据报后,通过查表转发将数据报发送至R2的接口1(10.0.1.1);
3)路由器R2收到数据报后,通过查表转发将数据报发送至R3的接口0(10.0.1.2);
4) ......(出现路由环路);
流程图如下所示:
为了防止IP数据报在路由环路中永久兜圈,在 IP数据报首部中设置了生存时间TTL字段,数据报每进入一个路由器,TTL字段的值便会减1,若TTL的值不为0,则路由器继续转发该IP数据报,否则便丢弃这个IP数据报。
所谓聚合网络,就是将若干个网络的共同前缀保持不变,其余位取0,同时将相同前缀的个数写在斜线后面,如下图所示。
我们可以在路由表中用192.168.0.0/22表示192.168.0.0/24,192.168.1.0/24,192.168.2.0/24以及192.168.3.0/24四个网络。
对于如下网络拓扑:
若路由器R2想向子网4(192.168.2.0/24)中发送数据报,则流程如下所示。
1)路由器R2查表,根据路由表中的聚合路由(192.168.0.0/22)将数据报转发至路由器R1的接口1(10.0.0.1);
2)路由器R1查表, 从接口2将数据报发送至子网4;
若路由器R2想向一个不存在的子网(192.168.3.0/24)发送数据报,则流程如下所示:
1)路由器R2查表,根据路由表中的聚合路由(192.168.0.0/22)将数据报转发至路由器R1的接口1(10.0.0.1);
2)路由器R1查表,发现并没有关于192.168.3.0/24的路由条目,则根据默认路由(0.0.0.0/0)将数据报转发至R2的接口0(10.0.0.2);
3)路由器R2再次收到自己的数据报,此时路由环路形成。
我们可以在路由表中针对不存在的网络添加黑洞路由来解决上述问题,黑洞路由的下一跳为null0,这是路由器内部的虚拟接口,IP数据报进入后便会被自动丢弃。 我们可以将路由器R2的路由表设置为如下所示:
R2的路由表 | ||
目的网络 | 下一跳 | 类型 |
10.0.0.0/30 | 接口0 | 直连 |
172.16.0.0/24 | 接口1 | 直连 |
192.168.0.0/22 | 10.0.0.1 | 静态 |
192.168.3.0/24 | null0 | 静态 |
192.168.0.0/24 | null0 | 静态 |
若按上表配置,当路由器R2向一个不存在的子网(192.168.3.0/24)发送数据报,路由器会根据最长前缀匹配原则选择目的网络为192.168.3.0/24的路由条目,该条目的下一跳为虚拟接口null0,这样,该IP数据报便会被快速丢弃。
当网络发生故障或网络拓扑发生改变时,路由器会自动更新相关的路由条目,当路由器R1的接口0所连接的子网1发生故障,路由器R1便会自动删除相关路由条目,如下图所示。
此时,当路由器R2向子网1(192.168.1.0/24)中的主机发送数据报时,流程如下:
1)路由器R2查询路由表,根据目的网络192.168.1.0/24的路由条目将数据报发送至路由器R1的接口1(10.0.0.1);
2)路由器R1收到数据报后,发现没有192.168.1.0/24相关的路由条目后,通过默认路由(0.0.0.0/0)将数据报转发至路由器R2的接口0(10.0.0.2);
3)此时,路由器R2再次收到自己的数据报(路由环路形成);
我们可以针对故障的网络(192.168.1.0/24)添加黑洞路由。经过一段时间后,路由器R1的0号接口网络恢复正常,R1又自动得到了192.168.1.0/24的直连路由条目, 则我们先前设置的黑洞路由会自动失效。
静态路由是一种需要管理员手工配置的特殊路由。它与动态路由的区别如下表所示。
静态路由 | 动态路由 |
手动配置路由条目 | 自动配置路由条目 |
不主动通告其他路由器自己的链路信息 | 会主动通告其他路由器自己的链路信息 |
在大型网络环境下,配置容易出错 | 在大型网络环境下配置不容易出错 |