分析路由表的结构与路由器的查表过程
实验环境
路由器R1
enable
conf t
hostname R1
int lo1
ip add 172.16.1.1 255.255.255.0
int lo2
ip add 172.16.2.1 255.255.255.0
int lo3
ip add 172.17.1.1 255.255.255.0
int lo4
ip add 172.17.2.1 255.255.255.192
int s0/0
clock rate 64000
ip add 12.1.1.1 255.255.255.0
no shut
exit
ip route 0.0.0.0 0.0.0.0 12.1.1.2
路由器R2
enable
conf t
hostname R2
int lo0
ip add 192.168.2.1 255.255.255.0
int s0/1
clock rate 64000
ip add 12.1.1.2 255.255.255.0
no shut
exit
ip route 172.16.0.0 255.254.0.0 12.1.1.1
路由表的结构
在R2路由器上使用show ip route命令查看路由表:
发现只有12.1.1.0这条直连路由被分成两行显示,而192.168.2.0/24和172.16.0.0/15这两条路由分别显示了一行。路由表中每条路由的显示方式是由不同级别的路由所决定的。
路由可以分为两大级别,即级别1 (Level 1)和级别2(Level 2)路由:
级别1路由指的是一条路由条目使用的子网掩码长度小于或等于主类网络默认的子网掩码长度,级别1包括以下4种路由条目:
网络路由: 路由条目使用的子网掩码长度等于主类网络默认的子网掩码长度,例如R2路由表中的192.168.2.0/24 ( 192.168.0.0是C类网络,其默认的子网掩码长度是24)
超网路由:路由条目使用的子网掩码长度小于主类网络默认的子网掩码长度,例如R2路由表中的172.16.0.0/15 ( 172.16.0.0是B类网络,其默认的子网掩码长度是16)
默认路由: 0.0.0.0/0的全零路由条目
父路由 (Parent route):是1级路由中较为特殊的路由,父路由中不包括下一跳的IP地址或者出站接口。R2路由表中第一行12.0.0.0/24 就是一条父路由。父路由相当于一个提示头部,暗示着后面会有级别2的路由条目,级别2的路由也称为子路由 (Child route)。可以理解为子路由条目是父路由中的子集,被父路由所包含。(任何情况下,只要一条子网掩码长度大于其主类网络默认子网掩码长度的路由进入路由表中,父路由就会被自动创建。
路由器R2的路由表中的父路由"12.0.0.0/24 is subnetted, 1 subnets" 的意思是有子网被创建,其子网的掩码长度为24,该主类网络在路由表中只存在一个子网。
查看R1的路由表
"172.17.0.0/16 is variably subnetted,2 subnets, 2 masks"也是一条父路由,有两个子网被创建,但是连个子网的掩码长度不相同,所以父路由中显示的子网掩码是主类网络默认的子网掩码。"Variably subnetted"是可变长的子网,两个不同长度的子网掩码分别在其父路由下的子路由中显示出来。若父路由中的多条子路由的子网掩码长度相同,则子路由的子网掩码长度会直接在其父路由中显示出来,而子路由本身则不再显示子网掩码长度。例如R1路由表中的父路由"172.16.0.0 /24 is subnetted,2 subnets."
级别2路由,也被称为子路由,其特点是包括了下一跳路由器的IP地址或者本地路由器出站接口的路由条目。例如R2路由表中的静态路由 S 172.16.0.0/15 [1/0] via 12.1.1.1"
除父路由以外的所有级别1和级别2的路由条目都被称为最终路由 (Ultimate Route), 即路由条目中包括了下一跳路由器的IP地址或者本地路由器出站接口。
路由的查找过程
当一台路由器收到一个IP报文时,将会检查目的IP地址,查找路由表并进行转发。下面将概述:
路由器如何选择最佳路由条目
子网掩码在路由查找过程中的影响
在路由表中若没有匹配的路由条目,是否选择超网路由或默认路由
路由的查找过程可以分为以下6个步骤
路由器根据数据包中的目的IP地址,查询是否有与其匹配的级别1路由(父路由、超网路由和默认路由)。
根据路由匹配原则,若有子网掩码最长的路由条目匹配且该路由为级别1的最终路由(路由条目中包括了下一跳路由器的IP地址或者本地路由器出站接口),则该路由条目将被用于转发数据包。
如果最佳匹配的是级别1的父路由,则继续查找该父路由下的子路由条目
若父路由中有一条子路由匹配,则该子路由被用于转发数据包
若父路由中没有匹配的子路由条目,则继续进一步查找。此时,路由器会执行有类路由和无类路由行为的判断。注意有类路由行为和无类路由行为与有类路由协议和无类路由协议并非同等的概念。有类和无类路由协议决定路由表的建立 (例如RIPv1是有类路由协议不支持VLSM,路由表中的RIP路由条目只支持主类网络的子网掩码长度),而有类路由行为和无类路由行为决定路由器如何查找路由表项。使用no ip classless和ip classless全局命令可以分别指定路由器为有类行为还是为无类行为。
-若是有类行为,则终止查找路由表,丢弃数据包
-若是无类行为,则继续查找级别1的超网路由和默认路由,若有相关匹配路由条目,则通
过超网路由或默认路由转发数据包。
6. 若没有找到匹配的超网路由,同时路由器也没有配置默认路由,则终止查找,丢弃该数据 包。
以之前配置的R1和R2两台路由器为例
若数据包从路由器R1发往目标地址192.168.2.1,则R1进行以下的查询
查询级别1的路由,没有相匹配的级别1父路由,也没有相匹配的级别1超网路由,但是有有全零的默认路由,且下一跳地址是12.1.1.2,是最终路由,符合路由查找条件,则R1把数据包转发至路由器R2,R2收到来自于R1的数据包以后,转发给直连接口Lo0: 192.168.2.1
从ping测试结果可以得知R1可以成功转发数据包至R2
若数据包从路由器R1发往目标地址12.1.1.2,则R1进行以下的查询
查询级别1的路由,找到了相匹配的级别1的父路由12.0.0.0/24, 但父路由不是最终路由。路由器R1继续查找该父路由下的子路由条目,12.1.1.0子路由匹配数据包中的目标地址12.1.1.2, R1从S0/0接口转发数据包至R2。用ping测试,结果R1可以成功收到R2的应答包:
若数据包从路由器R1发往目标地址172.16.3.1
先在路由器R2上配置一个环回接口Lo1,IP地址为172.16.3.1/24,
注:思科路由器默认使用的是快速交换,快速交换模式下会得出与之前叙述路由查找过程中不一致的结果。因此先在R1上使用全局命令no ip cef切换至进程交换。同时使用全局命令no ip class less命令让路由器执行有类路由行为:
在R1上ping 172.16.3.1, 则路由器R1进行以下的查询
查询级别1的路由,找到了相匹配的级别1的父路由172.16.0.0/24, 由于父路由不是最终路由,路由器R1继续查找该父路由下的子路由条目,但是没有匹配的子路由条目。由于路由器执行的是有类路由行为,则不再继续查找级别1的超网路由和默认路由,数据包被丢弃:
再次在R1上使用全局命令ip classless命令让路由器执行无类路由行为。此时,即使R1没有在级别1父路由中找到匹配的子路由条目,还将继续查找级别1的超网路由和默认路由:
发现有默认路由,则R1使用该默认路由条目转发去往172.16.3.1的数据包,再次ping 172.16.3.1, 结果数据包成功转发: