路由器转发IP报文的依据是路由表,通过匹配路由表里的路由项来实现对IP报文的转发。
如图1所示,当路由器收到一个IP报文的时候,将报文中的目的IP地址提取出来,然后与路由表中路由表项包含的目的地址进行比较。如果与某路由项中的目的地址相同,则认为与此路由项匹配;如果没有路由项能够匹配,则丢弃该IP报文。
图1 路由器多跳转发流程图IP报文中的目的IP地址往往是主机地址,而路由表中的目的地址往往为网络地址,怎么让二者匹配呢?这里面有个底层的操作:首先将IP报文中的目的地址和路由表项中的子网掩码进行"逻辑与"操作,得到一个网络地址,然后拿此网络地址与路由项中的网络地址做比较,如果一致就认为匹配,否则认为不匹配。
如果路由项匹配,则路由器查看所匹配的路由项的下一跳地址是否在直连的链路上。如果在直连的链路上,则根据此下一跳转发;如果不在直连的链路上,则需要在路由表中再次查找此下一跳地址所匹配的路由项。
确定了下一跳地址后,路由器将此报文送往对应的接口,接口进行相应的地址解析,解析出对应的链路层地址后,对IP报文进行数据封装并转发。
1. 路由最长匹配原则
当路由表中存在多个路由项可以同时匹配目的IP地址时,路由查找
进程会选择其中掩码最长的路由项进行转发,掩码越长表明其代表的网络范围越小,匹配的程度就越精确。这就是所谓的最长匹配原则。
如图2所示,路由器接收到目的地址为30.0.0.1的IP报文后,经查找整个路由表,发现与路由项30.0.0.0/24和30.0.0.0/8都能匹配。但根据最长匹配的原则,路由器会选择路由项30.0.0.0/24,根据该路由项转发数据包。
图2 最长匹配原则
由以上的过程可知,路由表中路由项数量越多,所需查找及匹配的次数就越多,所以很多路由器都会有相应的算法来优化查找速度,加快转发。
2. 路由迭代查找
如果所匹配的路由项的下一跳地址不在直连链路上,路由器还需要对路由表进行迭代查找,找出最终的下一跳。路由迭代的过程就是通过路由的下一跳信息来找到直连出接口的过程。
如图3所示,路由器接收到目的地址为50.0.0.2的报文后,经查找路由表,发现与路由表中的路由项50.0.0.0/24匹配,但此路由项的下一跳40.0.0.2并不在此路由器的直连链路上,所以路由器还需要在路由表中以40.0.0.2为目的地址查找下一跳;经查找,到达40.0.0.2的下一跳是20.0.0.2,此地址在该路由器的直连链路上,则路由器将按照该路由项转发数据包。
图3 路由迭代查找在众多协议中:对于BGP路由(直连EBGP路由除外)、静态路由(配置了下一跳)以及多跳RIP路由而言,其所携带的下一跳信息可能并不是直接可达,从指导转发的角度而言,它需要通过路由迭代找到到达下一跳的直连出接口。而对于OSPF和IS-IS等链路状态路由协议而言,其下一跳是直接在路由计算的时候得到,因此不需要进行路由迭代。
3. 缺省路由匹配
如果在路由表中没有路由项能够匹配IP报文的目的IP地址,则丢弃该IP报文。但是如果在路由表中有缺省路由存在,则路由器将按照缺省路由来转发IP报文。缺省路由又称为默认路由,其目的地址和子网掩码均为0.0.0.0。
如图4所示,路由器收到目的地址为30.0.0.2的IP报文后,查找路由表,发现没有子网或主机路由匹配此地址,所以按照缺省路由转发。
图4 缺省路由转发因0.0.0.0与任何IP地址"逻辑与"得到的结果均为0.0.0.0,所以缺省路由能匹配所有的IP地址,但因为它的掩码长度最短(为0),根据路由的最长匹配原则,只有在没有其他任何路由匹配IP报文的情况下,才会按照缺省路由转发。
缺省路由可以通过手工配置得到,也可以通过某些路由协议(如OSPF的STUB区域和NSSA区域)动态生成。缺省路由可以减少路由表的规模,从某种程度上讲可以提高路由查找的速度。在因特网中,大约99%的路由器上都会存在一条缺省路由。