路由表 转发表(FIB) 快速转发表 简介与分析

最近需要理解路由表转发表和快速转发表的相关的概念,
所以搜集了相关的内容贴在这里

参考链接:http://blog.youkuaiyun.com/an_zhenwei/article/details/39209463?locationNum=2&fps=1 侵删

控制平面转发平面可以是物理分离,也可以是逻辑分离。高端的网络设备(如核心交换机、核心路由器)一般采用物理分离。其主控板上的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

### 路由表转发表的区别和联系 路由表(RIB,Routing Information Base)和转发表FIB,Forwarding Information Base)在网络设备中分别承担不同的角色,但它们之间存在紧密的联系。 #### 1. 功能定位 - **路由表**:位于控制平面,负责路径决策。它通过路由协议(如OSPF、BGP)生成,包含所有可能的路径信息,包括冗余路径和备份路径。其主要作用是回答“数据包应该走哪条路?”[^2]。 - **转发表**:位于数据平面,负责实际的数据转发。它是基于路由表生成的最优路径集合,仅保留当前生效的路径条目。其主要作用是回答“数据包从哪个接口发出去?”。 #### 2. 内容结构 - **路由表**:字段包括目的网络、下一跳IP地址、度量值(metrics)、路由来源(静态/动态)。例如:`10.0.0.0/24 via 192.168.1.1, cost 10`。 - **转发表**:字段包括目的网络、出接口、下一跳MAC地址(或标签,如MPLS)。例如:`10.0.0.0/24 → eth0, MAC: 00:11:22:33:44:55`[^2]。 #### 3. 存储性能 - **路由表**:存储在内存中,由CPU处理,更新较慢,适合复杂的路径计算。查找方式通常依赖软件算法,如最长前缀匹配。 - **转发表**:存储在硬件芯片(如TCAM)中,支持微秒级转发,查找速度快且高效。硬件并行查询使得数据转发更加迅速。 #### 4. 更新机制 - **路由表**:动态更新,当路由协议发生变化时(如OSPF重新计算路径),路由表会相应调整[^2]。 - **转发表**:从路由表同步最优路径,更新需实时完成(如FIB Push)。它仅保留当前生效的路径,不包含冗余或备份路径。 #### 5. 实际应用场景 - **路由表**:用于路由协议计算、策略路由、负载均衡等控制层面的操作。例如,BGP选路时参考路由表条目[^2]。 - **转发表**:用于高速数据转发,如核心路由器中的MPLS标签交换。例如,交换机根据转发表直接转发数据帧[^2]。 #### 6. 类比解释 - 路由表可以类比为一张地图,标记了所有可能的路线(包括绕路和备选路径)[^2]。 - 转发表则像导航指令,只告诉用户当前最快的出口在哪,直接执行[^2]。 #### 总结 路由表是“决策大脑”,负责规划路径;转发表是“执行工具”,负责以最快速度转发数据包。两者协同工作,实现网络的高效控制转发分离(如SDN中的核心思想)[^2]。 ```python # 示例代码:模拟路由表转发表的关系 class RoutingTable: def __init__(self): self.routes = {} def add_route(self, destination, next_hop, metric): self.routes[destination] = {"next_hop": next_hop, "metric": metric} class ForwardingTable: def __init__(self): self.entries = {} def update_from_routing_table(self, routing_table): for destination, route in routing_table.routes.items(): if route["metric"] == min(routing_table.routes[d]["metric"] for d in routing_table.routes): self.entries[destination] = {"next_hop": route["next_hop"]} # 创建路由表 rt = RoutingTable() rt.add_route("10.0.0.0/24", "192.168.1.1", 10) rt.add_route("20.0.0.0/24", "192.168.1.2", 5) # 创建转发表并更新 ft = ForwardingTable() ft.update_from_routing_table(rt) print("Forwarding Table:", ft.entries) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值