Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82684
  • 博文数量: 19
  • 博客积分: 580
  • 博客等级: 中士
  • 技术积分: 187
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-25 09:03
文章分类

全部博文(19)

文章存档

2011年(9)

2010年(9)

2009年(1)

我的朋友

分类: LINUX

2010-05-18 10:52:28

初步了解路由系统
Linux内核中采用了FIB(Forward Information Base)这个名词代替了Routing Database,原因不详。可能是不想和应用层的路由数据库发生概念上的冲突吧。但是Linux内核还是有一个叫做RouteTable的数据结构的,不过,它只是FIB的一份cache而已,其关系如同计算机中内存和CPU cache的关系。系统中路由一般采取的手段是:先到路由缓存中查找表项,如果能查找到,那么就直接将对应的一项取出作为路由的规则;如果查不到,那么就到FIB中根据规则换算出来,并且增加一项新的,在路由缓存中将项目添加进去。所以在研究Linux代码时,应该注意这一点,不能抓着RouteTable不放而忽视了FIB。 FIB是内核中最重要的路由结构。FIB存放着用来给本地流量和外发报文做内部的路由,也能让内核外的应用程序通过路由socket从内核中获取路由信息。本质上它是一个表,包含上层的地址信息和底层的设备信息。通过对FIB数据的查找和换算,一定能够获得路由一个地址的方法。当报文进入路由系统时,系统用报文的目标地址和最精确的网络掩码比较,如果不匹配,就转到另一个较精确的掩码入口和其比较。当完成比较后,IP层复制到远地主机的“direction”到路由快表中,并沿着这条路径发送数据。 Linux能被配置成支持多个FIB/路由表,在这里,FIB表就是路由表,一个FIB表包含多个路由条目,以下的语境中,你可以把“FIB表”当作一个数据库的代名词。缺省情况下只配置有2个表(即2个数据库)。在大多数情况下,Linux内核不需要基于策略的路由,特别是嵌入式系统。所以内核不需要配置多个表。如果这样,有两个预定义的全局指针指向两个表,一个是local table, 一个是main table,local表存放着到本机分配的地址的路由上,比如分配给网络接口设备的地址和环回地址,main表存放到外部节点的路由。 由于这个系统相当复杂,我们将这部分的初始化放到下一章去介绍,在此时,只需记住了FIB表就是路由表,Linux的路由表就是FIB表。还有,是ip_init函数调用了ip_rt_init去初始化路由系统。
 
路由相关数据
在Linux路由系统中主要保存了三种与路由相关的数据,第一种是在物理上和本机相连接的主机地址信息表——相邻表:neigh_table{ },第二种是保存了在网络访问中判断一个网络地址应该走什么路由的数据表——路由规则表:fib_table{ },第三种表是最新使用过的查询路由地址的缓存地址数据表——路由缓存:rtcache,由rtable{ }节点组成。
 
路由表与路由规则
当选择高级路由后,你还可以选择是否支持策略路由(Policy routing),即Linux使用了多个路由表来应付有多种路由算法存在的情况,Linux使用多个路由表,使不同策略的路由存放在不同的表中,有效地被免了查找庞大的路由。即使不使用策略路由,出于性能的考虑,Linux也使用了两个路由表,一个用于上传给本地上层协议,另一个则用于转发。从效果上看,假设我们有多个路由算法(OSPF,RIP,BGP,静态配置等)同时存在于一台机器上,每个路由算法可以选择不同的FIB 表作为自己的内核数据库,那么当报文到达IP层时选择哪一个数据库作为如何处理(转发?送到本机?还是丢弃)的参考时,就依靠一种规则了。可以是一种算法存取一个FIB表,也可以多个算法存取一个FIB表。这就是Policy Route。比如说,对于本地接收的报文应该采用一种规则,那么可以为其单独创建一个FIB表;对于组播路由的报文应该采用不同的规则,也可以为其单独创建一个FIB表...... 为了支持多种路由算法和多个路由表,Linux内核创造了一个名词:FIB规则。这个规则是指处理报文时选取FIB表的规则。规则是策略性的关键性的新的概念。我们可以用自然语言这样描述规则,例如我门可以指定这样的规则: 规则一:“所有来自1.1.1.1的IP包,使用路由表253, 本规则的优先级别是100” 规则二:“所有的包,使用252号路由表,本规则的优先级别是200”
 
 
阅读(1271) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~