本文介绍路由表(Routing Information Base, RIB)、转发表(Forwarding Information Base, FIB)和快速转发(Fast Forwarding)的相关概念和工作原理。
路由表(Routing Information Base, RIB):路由表是网络设备(如路由器)中存储的一张表格,记录了网络中各个目的地的网络地址、下一跳地址 以及其他相关信息。路由表中的每一条路由记录都包含了目的地址(Destination/Mask)和相应的下一跳(NextHop)信息,用于确定数据的转发路径。例如,发往目的地 10.20.1.10
的数据将会匹配到 10.20.1.0/24
这条路由,其下一跳地址是 10.20.1.11
,数据将从出口接口 GE0/0/0
转发出去。
1 | [RTA]display ip routing-table |
转发表(Forwarding Information Base, FIB):转发表是路由器或交换机中的一个数据结构,用于存储 从路由表中提取的转发信息 。FIB 中的记录是根据路由表中的路由信息进行 提取和优化的,以方便快速转发数据包。FIB 中的每一条记录都包含了目的地址和相应的出口接口。
1 | [RTA]display fib |
快速转发表(Fast Forwarding Table):快速转发表是 在 FIB 的基础上进行进一步优化 的数据结构。它是网络设备中的 一个高速缓存 ,用于存储 最常用 的转发信息。快速转发表中的记录是经过优化和加速的,以提高数据包的转发速度。快速转发表中的每一条记录都包含了目的地地址和相应的出口接口。
转发表和快速转发表都是基于路由表的衍生物,用于加速数据包的转发过程。
路由转发分组:路由转发分组是指网络设备(如路由器)根据接收到的数据包的目的地址,通过查询 路由表 FIB 表,选择合适的出口接口将数据包转发到下一跳 的过程 。 路由表FIB 表是路由转发分组的基础和依据。
在一张路由表中,当存在多个路由项可同时匹配目的地址时,路由查找进程会 选择掩码(Mask)最长的路由项用于转发,即最长匹配原则。因为掩码越长,所处的网段范围就越小,网段的范围越小,就越能快速的定位到 PC 机的具体位置,从而加快转发效率。
例子:在运行了 RIP (Routing Information Protocol,一种用于路由选择的动态路由协议) 的路由器上看到如下路由信息:
1 | <RTA>display ip routing-table 6.6.6.6 |
此时路由器收到一个目的地址为 6.6.6.6
的数据包,那么(A)。
尽管如此,路由表中 路由项数量越多 ,所需查找及匹配的次数就越多,其 转发效率就会降低。为了实现控制平面与转发平面完全分离,就需要系统构建一张专注于数据报文转发的表,即转发表。
FIB 表的生成有 2 种方式,一种是源于路由表项,另外一种是通过 ARP 解析获得。
第一种方式,当开始计算路由信息的时候,因为在一个网络拓扑结构中,可能会运行多个路由协议,而不同路由协议所计算出的路径可能会不同。
当出现这种情况时,路由器会 选择较高路由优先级的路由协议所发现的路由 作为最优路由,即比较路由的优先级将其选出,置为 Active(活跃)状态;而其他路由作为备份路由,置为 Inactive(非活跃)状态。系统会再把 Active 状态的路由表项导入至 FIB 表中,作为系统转发的依据。
第二种方式,通过 ARP 解析,得到 MAC 地址与目的 IP 地址的映射关系。为了将这个映射关系添加到 FIB 表中,主机需要将目标 IP 地址与对应的 MAC 地址加入到本地网段内的主机路由信息中。最后将主机路由信息添加到 FIB 表中。
在 FIB 表生成过程中,需要注意的一点是,FIB 表与路由表是同步更新的 。系统的控制平面会发现 新的 路由信息,根据路由信息更新到自己的路由表中,生成新的 Active 状态的路由表项,再更新至 FIB 表。
路由表属于控制平面,FIB 表属于转发平面,这样便做到了 控制平面与转发平面的分离。如果原路由表中处于 Active 状态的路由表项失效,系统也会删除相关 FIB 表项。
由于 FIB 表 全是 处于 Active 状态的路由,所以 FIB 表项的 数量远远小于 路由表项。基于这种特性,在设计的时候,系统可以将 FIB 表项加载到硬件中,从而加快数据转发速度 。例如,在某些高端交换机启动后,FIB 表被系统加载到接口业务板的硬件中, 数据报文再通过硬件转发,不需要再通过 CPU 转发,可以大大降低转发时延。
控制平面与转发平面的物理(或逻辑)分离,使得主控板上的 CPU 不负责报文转发,专注于系统的控制;而业务板则专注于数据报文转发。如果主控板损坏,业务板仍然能够转发报文。
路由器常规转发报文的流程:
路由器接收到一个报文后,将它从接口存储器拷贝至 CPU 中,CPU 会根据报文的目的地址寻找 FIB 表中与之匹配的转发项,最终确定一条最佳的路径。与此同时,再将报文按照数据链路层上使用的协议进行封装,最后,封装后的链路层帧通过 DMA(Direct Memory Access,直接内存访问)拷贝至输出队列中进行报文转发。这一个过程经过了 2 次系统总线,每一个报文都要重复这个过程。
路由器性能因素:
衡量路由器性能因素之一是报文的转发效率,报文的转发效率越高,性能就越强。所以,需要再用到快速转发表来进行转发,快速转发表采用高速缓存来处理报文,使用基于数据流的技术来处理。
什么是基于数据流?
数据流是指在计算机系统中,数据在各个组件(如程序、模块、子系统等)之间传输和处理的过程。在数据流中,数据经过一系列处理后,输出到下一个组件或者最终输出到终端用户。例如,访问 HTTP 服务的一次操作。
在计算机网络中,一般 用一个五元组来描述一个数据流,源 IP 地址、源端口号、目的 IP 地址、目的端口号、协议号 。当一个数据流的第一个报文通过查找 FIB 表转发后,在高速缓存中生成相应的转发信息,该数据流 后续报文的转发 就可以通过直接查找高速缓存来实现。
例如,当一个主机需要访问服务器时,主机发出的第一个报文到达路由器的接口后,路由器会查找快速转发表实现快速转发。但由于这个报文是第一个报文,快速转发表中并没有这条数据流的转发信息高速缓存,所以系统无法进行快速转发。便会退而求其次,将报文移交至普通的 FIB 表,由 CPU 负责在 FIB 表中查找相关转发项,然后进行封装,再从接口转发出去。与此同时,系统记录报文中的五元组信息,再高速缓存中会生成相应的快速转发信息。
系统会根据五元组信息生成相应的快速转发信息缓存。与此同时,也会记录转发时的 封装信息及接口信息 。在当后续报文来到后,系统会查看报文中的五元组,如果命中了快速转发缓存,则会根据缓存中的封装信息 直接进行 二层数据帧的封装。然后,在中断中直接送到出接口发送。这样,就不需要上报 CPU 进行查表操作,也不需要内存访问操作,更不用占用系统总线资源。
快速转发技术就在很大程度上缩减了 IP 报文的排队流程,也减少了报文的转发时间。
参考资料: