1.7 路由表与FIB表
具备路由功能的华为数通产品(例如路由器、三层交换机等,下文以路由器为例进行讲解)都维护着两种非常重要的数据表:一是路由表(Routing table),也被称为路由信息库(Routing Information Base,RIB);二是数据转发表,也被称转发信息库(Forwarding Information Base,FIB)。
首先每台路由器都维护着一张全局路由表,另外路由器所运行的每种路由协议也维护着该协议自己的路由表。对于全局路由表,大家已经非常熟悉了,使用display ip routing-table命令所输出的表格就是全局路由表。路由器可以通过多种途径获取路由信息,例如,它可以运行多种动态路由协议,而通过每一种动态路由协议所获知的路由信息首先存储于该协议自己的路由表中,然后路由器根据路由优先级和度量值等信息来进行路由的优选,并将被优选路由加载到全局路由表中。为了简便起见,本书后文如果不特别说明,路由表指的就是全局路由表。我们将路由表视为位于路由器的控制平面,如图1-29所示,实际上路由表并不直接指导数据转发,换句话说,路由器在执行路由查询时,并不是在路由表中进行报文目的地址的查询,真正指导数据转发的是FIB表,路由器将路由表中的活跃路由下载到FIB表,此后如果路由表中的相关表项发生变化,FIB表也将立即同步。由于两张表的一致性,也因为路由表阅读起来更加直观,因此在绝大多数场合中,我们在阐述路由器数据转发过程时,会用“路由器通过查询路由表来决定数据转发的路径”这一说法,但是需要注意,实际上,路由器查询的是FIB表,位于控制层面的路由表只是提供了路由信息而已。
图1-29 RIB表与FIB表
FIB表是位于路由器数据平面的表格,实际上它在外观上与路由表非常类似。FIB的表项被称为转发表项,每条转发表项都指定要到达某个目的地所需通过的出接口及下一跳IP地址等信息。路由器将优选的路由存储在路由表中,而将路由表中活跃的路由下载到FIB表,并使用FIB表转发数据。路由表通常是存储在设备的动态内存中,例如RAM(Random Access Memory,随机存取存储器),而FIB表中的数据则往往被存储在一个ASIC(Application Specific Integrated Circuit,专用集成电路)中,这使得设备在FIB中进行数据查询时,可以实现相当高的速度。当然,用于存储FIB表的空间是有限的,因此在大型的网络中要关注设备的路由表规模,在保证数据可达的前提下,通过各种机制或手段来减小设备路由表的规模。
在图1-30所示的网络中,R3的路由表如下:
图1-30 在R3上查看路由表及FIB表
从上述输出可以看出,R3配置了两条静态路由,分别用于到达1.1.1.0/24及10.1.12.0/24。另外,R3还运行了RIP及OSPF,并通过RIP学习到了4.4.4.0/24路由,通过OSPF学习到了5.5.5.0/24路由。除此之外,R3还自动发现了直连接口的路由。上述所有的路由表项在Flags列中均有“D”标志,这意味着这些路由都已经下载(Download)到FIB表。留意R3上的两条静态路由,实际是按如下方式配置的:
到达1.1.1.0/24的这条静态路由的下一跳IP地址是R1的接口IP地址,该地址并非R3直连可达,显然,R3不可能将到达该网段的数据包直接转发给R1,因为它与R1没有直连,报文无法“隔空”发送过去,另外该条静态路由也没有明确出接口信息。因此R3需要在路由表中以下一跳地址10.1.12.1为目的地址进行查询,看看是否有与10.1.12.1匹配的路由表项,从而得到路由的出接口。R3的这种行为被称为路由递归查询。由于这两条静态路由均没有指定出接口,因此都要执行递归操作得到出接口,所以在R3的路由表中,这两条路由在Flags列中均有“R”标志,R意为Relay(在此处理解为递归)。
现在再来看看R3的FIB表,使用display fib命令可以进行FIB的查看:
从上述输出可以看出,R3路由表中所有的表项都已经下载到了FIB表中,并且R3针对每一条路由都完成了递归查询操作并得到路由的出接口以及在直连网络中的下一跳IP地址。以1.1.1.0/24这条路由为例,在FIB表中,Nexthop为10.1.23.2,出接口为GE0/0/0,显然已经完成了递归查询,这大大提高了路由执行的效率。现在当R3收到一个去往1.1.1.0/24的数据包时,便在FIB中进行查询,找到匹配项1.1.1.0/24后,即可将数据转发出去,而不用再进行递归操作。