控制平面与转发平面可以是物理分离,也可以是逻辑分离。高端的网络设备(如核心交换机、核心路由器)一般采用物理分离。其主控板上的CPU不负责报文转发,专注于系统的控制;而业务板则专注于数据报文转发。如果主控板损坏,业务板仍然能够转发报文。
路由器转发分组的关键是FIB表,在系统中报文转发时查找的是FIB表而非路由表。这是因为路由表表示所有的有效路由所形成的表项,并不指导转发。FIB表是网络层用来控制数据报发送的。FIB中包含了路由器在转发报文时所必需的一组最小信息。
当路由表中存在多个路由项可以匹配目的IP地址时,路由查找进程会选择其中掩码最长的路由项用于转发。那么路由表中路由项数量越多,所需查找及匹配的次数也就越多,其转发效率也就越低。为了做到控制平面和转发平面的分离,系统构建了另一张FIB表,也称为转发表,专注于数据报文的转发,其中FIB的表项来源于路由表项。
在计算路由信息的时候,不同路由协议所计算出来的路径可能会不同。在这种情况下,路由器会选择优先级较高的路由协议发现的路由作为最优路由,并置为Active状态;而其他路由作为备份路由,置为Inactive状态。此时Active状态的路由表项会由系统导入FIB表中,作为系统转发的依据。另外,在某些系统中,FIB表项也可能来源于ARP解析,即系统将通过ARP解析而得到的本地网段内的主机路由也添加到FIB表中。由于FIB表中没有处于Inactive状态的冗余路由,通常FIB表项数量小于路由表项,所以可以设计将FIB表项加载到硬件中,以大大加快数据转发速度。
FIB表记录的主要是记录路由信息,在FIB表获取到下一跳地址,然后去邻接表是查找下一跳地址对应的MAC,进行rewrite MAC地址,实现转发。这个过程其实很快的。也可以理解成FIB和ADJ表是同时运作。
快速转发表:第一个报文到达路由器的接口后,路由器查找快速转发表以期快速转发。但因为这个报文是第一个报文,快速转发表并没有这条数据流的转发信息的高速缓存,所以系统并不能进行快速转发。系统只能把这个报文转交到普通的FIB转发流程,由CPU负责在FIB表中查找相关转发项,然后进行封装,从出接口转发出去。与此同时,系统记录报文中的五元组信息,在高速缓存中生成相应快速转发信息。
show ip route static
S* 0.0.0.0/0 [1/0] via 10.0.0.1, Gi 0/7
S 173.29.0.0/16 [1/0] via 172.96.0.2 (recursive via 10.0.0.1)
S 192.168.0.0/16 [1/0] via 192.168.20.1, Gi 0/0
show ip route connected
C 10.0.0.0/24 is directly connected, Gi 0/7
C 12.1.1.0/24 is directly connected, vlan 12
C 173.29.0.0/24 is directly connected, vlan 101
C 192.168.20.0/24 is directly connected, Gi 0/0
show ip route summary
IP routing table name is Default-IP-Routing-Table(0)
IP routing table maximum-paths is 4
Route Source Networks
connected 4
static 5
Total 9
FIB 0
show ip route database
Codes: K - kernel, C - connected, S - static, R - RIP, B - BGP
O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
- selected route, * - FIB route, p - stale info
S *> 0.0.0.0/0 [1/0] via 10.0.0.1, Gi 0/7
C *> 10.0.0.0/24 is directly connected, Gi 0/7
C *> 12.1.1.0/24 is directly connected, vlan 12
S *> 173.29.0.0/16 [1/0] via 172.96.0.2 (recursive via 10.0.0.1)
C *> 173.29.0.0/24 is directly connected, vlan 101
S *> 192.168.0.0/16 [1/0] via 192.168.20.1, Gi 0/0
S 192.168.16.0/24 [1/0] is directly connected, vlan 2 inactive
O 192.168.20.0/24 [110/1] is directly connected, Gi 0/0, 04:43:58
C *> 192.168.20.0/24 is directly connected, Gi 0/0
S 192.168.254.0/24 [1/0] is directly connected, vlan 2 inactive