




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选文档Linux路由表的结构与算法分析 路由是网络栈的核心部分。路由表本身的设计很大情度上影响着路由的性能,并且好的设计 能削减系统资源的消耗,这两方面尤其体现在路由表的查找上。目前的内核路由存在两种查找算法,一种为HASH算法,另一种为LC-trie算法,前者是目 前内核使用的缺省算法,而后者更适用在超大路由表的状况,它在这种状况提高查找效率的同时,大大地增加了算法本身的简单性和内存的消耗。综上,这两种算法 各有其适用的场合,本文分析了基于2.6.18内核路由部分的代码在HASH算法上路由表结构的实现,并且在文章最终给出了一个简洁的策略路由的应用。 一、路由表的结构 为了支持策略路由,Li
2、nux使用了多个路由表而不是一个,即使不使用策略路由,Linux也使用了 两个路由表,一个用于上传给本地上层协议,另一个则用于转发。Linux使用多个路由表而不是一个,使不同策略的路由存放在不同的表中,有效地被免了查找 浩大的路由表,在肯定情度上提高了查找了效率。 路由表本身不是由一个结构表示,而是由多个结构组合而成。路由表可以说是一个分层的结构组合。在第一层,它先将全部的路由依据子网掩码(netmask)的长度(032)分成33个部分(struct fn_zone),然后在同一子网掩码(同一层)中,再依据子网的不同(如10.1.1.0/24和10.1.2.0/24),划分为其次层 (stru
3、ct fib_node),在同一子网中,有可能由于TOS等属性的不同而使用不同的路由,这就是第三层(struct fib_alias),第三层结构表示一个路由表项,而每个路由表项又包括一个相应的参数,如协议,下一跳路由地址等等,这就是第四层(struct fib_info)。分层的好处是显而易见的,它使路由表的更加优化,规律上也更加清淅,并且使数据可以共享(如struct fib_info),从而削减了数据的冗余。struct fib_table *fib_tablesRT_TABLE_MAX+1; / RT_TABLE_MAX 为255 图1为一个路由表的总体结构。自上而下由左向右看,它首先
4、为一个fib_table结构指针的数组,它被定义为: struct fib_table unsigned char tb_id; unsigned tb_stamp; int (*tb_lookup)(struct fib_table *tb, const struct flowi *flp, struct fib_result *res); int (*tb_insert)(struct fib_table *table, struct rtmsg *r, void (*tb_select_default)(struct fib_table *table, const struct flow
5、i *flp, struct fib_result *res); unsigned char tb_data0; 每个fib_table结构在内核中表示一个路由表: +图1(引自1)这个结构中包括这个表的ID,以及主要的一些用于操作路由表的函数指针,这里我们只关怀最终一域tb_data0,这是一个零长的数组,它在内核中也较为常见,它表示struct fn_hash struct fn_zone *fn_zones33;struct fn_zone *fn_zone_list;指向这个结构的末尾。由图1可以看到,这个结构的末尾接着便是一个struct fn_hash结构,这个结构是随fib_ta
6、ble结构一起安排的,所以fib_table-tb_data就是fn_hash。 struct fn_zone struct fn_zone *fz_next; /* Next not empty zone */ struct hlist_head *fz_hash; /* Hash table pointer */ int fz_nent; /* Number of entries */ int fz_divisor; /* Hash divisor */ u32 fz_hashmask; /* (fz_divisor - 1) */#define FZ_HASHMASK(fz) (fz)-
7、fz_hashmask) int fz_order; /* Zone order */ u32 fz_mask;#define FZ_MASK(fz) (fz)-fz_mask); 这个fn_zone域就是我们上面提前的结构,用于将路由依据子网掩码的长度分开成33个部分,其中fn_zones0用于默认网关。而fn_zone_list域就是将正在使用的fn_zone链成一个链表。接着再深化到struct fn_zone结构中:这个结构中有两个域比较重要,一个为fz_hash域,它指向一个HASH表的表头,这个HASH的长度是fz_divisor。并且这个HASH表的长度是可变的,当表长达到一个限
8、定值时,将重建这个HASH表,被免消灭HASH冲突表过长造成查找效率降低。 为了提高查找的效率,内核使用了大量的HASH表,而路由表就是一个例子。在图1中可以看到,等长子网掩码的路由存放在同一个fn_zone中,而依据到不同子网(fib_node)的路由键值(fn_key),将它HASH到相应的链表中。struct fib_node struct hlist_node fn_hash; struct list_head fn_alias; u32 fn_key; 这个键值其实就是这个子网值了(如10.1.1.0/24,则子网值为 10.1.1),得到这个键值通过n = fn_hash()函数H
9、ASH之后就是这个子网对应的HASH值,然后就可以插入到相应的fz_hashn链表中了。冲突的fib_node由 fn_hash域相链,而fn_alias则是指向到达这个子网的路由了。struct fib_alias struct list_head fa_list; struct rcu_head rcu; struct fib_info *fa_info; u8 fa_tos; u8 fa_type; u8 fa_scope; u8 fa_state; 当到达这个子网的路由由于TOS等属性的不同可存在着多个路由时,它们就通过fib_alias中fa_list域将这些路由表项链成一个链表。这
10、个结构中的另一个域fa_info指向一个fib_info结构,这个才是存放真正重要路由信息的结构。struct fib_info struct hlist_node fib_hash; struct hlist_node fib_lhash; int fib_dead; unsigned fib_flags; int fib_protocol; u32 fib_prefsrc; u32 fib_priority; int fib_nhs; struct fib_nh fib_nh0;#define fib_dev fib_nh0.nh_dev; 这个结构里面是一个用于路由的标志和属性,其中最重
11、要的一个域是fib_nh0, 在这里,我们再次看到了零长数组的应用,它是通过零长来实现变长结构的功能的。由于,我们需要一个定长的fib_info结构,但是在这个结构末尾,我们 需要的fib_nh结构的个数是不确定的,它在运行时确定。这样,我们就可以通过这种结构组成,在运行时为fib_info安排空间的时候,同时在其末尾 安排所需的若干个fib_nh结构数组,并且这个结构数组可以通过fib_info-fib_nhn来访问,在完成fib_info的安排后 将fib_nhs域置为这个数组的长度。 另一方面,fib_info也是HASH表的一个应用,结构中存在着两个域,分别是 fib_hash 和fi
12、b_lhash,它们都用于HASH链表。这个结构在完成安排后,将被用fib_hash域链入fib_info_hash表中,假如这个路由存在 首选源地址,这个fib_info将同时被用fib_lhash链入fib_info_laddrhash表中。这样,就可以依据不同目的实现快速查找了。 Struct fib_nh也是一个重要的结构。它存放着下一跳路由的地址(nh_gw)。刚刚已经提到,一个路由(fib_alias)可能有多个fib_nh结构, 它表示这个路由有多个下一跳地址,即它是多路径(multipath)的。下一跳地址的选择也有多种算法,这些算法都是基于nh_weight, nh_powe
13、r域的。nh_hash域则是用于将nh_hash链入HASH表的。struct fib_nh struct net_device *nh_dev; struct hlist_node nh_hash; struct fib_info *nh_parent; unsigned nh_flags; unsigned char nh_scope;#ifdef CONFIG_IP_ROUTE_MULTIPATH int nh_weight; int nh_power;#endif#ifdef CONFIG_NET_CLS_ROUTE _u32 nh_tclassid;#endif int nh_oif
14、; u32 nh_gw;二、路由的查找路由的查找速度直接影响着路由及整个网络栈的性能。路由的查找当然首先发生在路由缓存中,当在缓存中查找失败时,它再转去路由表中查找,这是本文所关注的地方。 上一节已经具体地描述了路由表的组成。当一个主要的IP层将要发送或接收到一个IP数据包时,它就要调用路由子系统完成路由的查找工作。路由表查找就是依据给定的参数,在某一个路由表中找到合适的下一跳路由的地址。 上面已提到过,当一个主机不支持策略路由时,它只使用了两个路由表,一个是 ip_fib_local_table,用于本地,另一个是ip_fib_main_table,用于接发。只有在查找 ip_fib_loc
15、al_table表时没有找到匹配的路由(不是发给本地的)它才会去查找ip_fib_main_table。当一个主机支持策略路 由时,它就有可能存在着多个路由表,因而路由表的选择也就是查找的一部分。路由表的选择是由策略来确定的,而策略则是由应用(用户)来指定的,如能过ip rule命令:ip rule add from 10.1.1.0/24 table TR1ip rule add iff eth0 table RT2如上,第一条命令创建了基于源地址路由的一条策略,这个策略使用了RT1这个路由表,其次条命令创建了基于数据包入口的一个策略,这个策略使用了RT2这个路由表。当被指定的路由表不存在时
16、,相应的路由表将被创建其次步就是遍历这个路由表的fn_zone,遍历是从最长前缀(子网掩码最长)的fn_zone开头的,直到找到或出错为止。由于最长前缀才是最匹配的。假设有如下一个路由表:dst nexthop dev 10.1.0.0/16 10.1.1.1 eth0 10.1.0.0/24 10.1.0.1 eth1 它会先找到其次条路由,然后选择10.1.0.1作为下一跳地址。但是,假如由其次步定位到的子网(fib_node)有多个路由,如下:dst nexthop dev 10.1.0.0/24 10.1.0.1 eth1 10.1.0.0/24 10.1.0.2 eth1 到达同一个
17、子网有两个可选的路由,仅凭目的子网无法确定,这时,它就需要更多的信息来 确定路由的选择了,这就是用于查找路由的键值(struct flowi)还包括其它信息(如TOS)的缘由。这样,它才能定位到对应一个路由的一个fib_alias实例。而它指向的fib_info就是路由所需 的信息了。 最终一步,假如内核被编译成支持多路径(multipath)路由,则fib_info中有多个fin_nh,这样,它还要从这个fib_nh数组中选出最合适的一个fib_nh,作为下一跳路由。三、路由的插入与删除 路由表的插入与删除可以看看是路由查找的一个应用,插入与删除的过程本身也包含一个查找的过程,这两个操作都需
18、要检查被插入或被删除的路由表项是否存在,插入一个已经存在的路由表项要做特殊的处理,而删除一个不存在的路由表项当然会出错。下面看一个路由表插入的例子:ip route add 10.0.1.0/24 nexthop via 10.0.1.1 weight 1 nexthop via 10.0.1.2 weight 2 table RT3 这个命令在内核中建立一条新的路由。它首先查找路由表RT3中的子网掩码长为24的 fn_zone,假如找不到,则创建一个fn_zone。接着,连续查找子网为10.0.1的fib_node,同样,假如不存在,创建一个 fib_node。然后它会在新建一个fib_in
19、fo结构,这个结构包含2个fib_nh结构的数组(由于有两个nexthop),并依据用户空间传递 过来的信息初始化这个结构,最终内核再创建一个fib_alias结构(假如从前已经存在,则出错),并用fib_nh来创始化相应的域,最终将自己链入 fib_node的链中,这样就完成了路由的插入操作。 路由的删除操作是插入操作的逆过程,它包含一系列的查找与内存的释放操作,过程比较简洁,这里就不再赘述了。四、策略路由的一个简洁应用 Linux系统在策略路由开启的时候将使用多个路由表,它不同于其它某些系统,在全部状况下都只使用 单个路由表。虽然使用单个路由表也可以实现策略路由,但是如本文之前所提到的,使用多个路由表可以得到更好的性能,特殊在一个大型的路由系统中。下面只通 过简洁的状况说明Linux下策略路由的应用。 如图2,有如下一个应用需求,其中网关服务器上有三个网络接口。接口1的IP为 172.16.100.1,子网掩码为255.255.255.0,网关gw1为a.b.c.d,172.16.100.0/24这个网段的主机可以通过 这个网关上网;接口2的IP是172.16.10.1,子网掩码同接口一,网关gw2为e.f.g.h,172.16.10.0/24这个网段的主机可以 通过这个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装箱运输合同样本
- 分包单位的合同范本
- 代理销售中介合同范本
- 农民集资建房合同范本
- 弘扬中华优良传统文化过中国人自己的传统节日单元整体教学设计
- 做好班主任 做一名有智慧的班主任 校园廉洁 14
- 2025家庭居室设计施工一体化合同
- 2025机电安装工程合同乙种本范本
- 2025YY年房屋租赁合同协议
- 语文核心素养的培育知到课后答案智慧树章节测试答案2025年春湖南师范大学
- 第四课 人民民主专政的社会主义国家 课件-高考政治一轮复习统编版必修三政治与法治
- 2025年郑州黄河护理职业学院单招职业适应性考试题库带答案
- (完整版)特殊教育与随班就读
- 旋流风口RA-N3选型计算表格
- 《VB程序结构基础》课件教程
- 个人房屋租赁合同标准版范本
- DBJ50-T-157-2022房屋建筑和市政基础设施工程施工现场从业人员配备标准
- 2024年中考模拟试卷地理(湖北卷)
- 沙塘湾二级渔港防波堤工程施工组织设计
- 大学生心理健康教育知到智慧树章节测试课后答案2024年秋长春医学高等专科学校
- 慢肾风中医辨证施护
评论
0/150
提交评论