文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>linux路由实现分析Series---(2)

linux路由实现分析Series---(2)

时间:2010-09-18  来源:mtloveft

声明:本文为原创 #####请转贴时保留以下内容###### 作者:GTT 本文档归属http://oldtown.cublog.cn/.转载请注明出处! 请提出宝贵意见Mail:[email protected] Linux Version:2.6.33 提示:本文是介绍linux 如何实现ipv4路由!   fib_table结构中最后一个成员变量很特别,它实际包含33个指针,每
一个指针对应一个网络掩码长度并指向一个类型为 fn_zone 的数据结构。
fn_zone的定义如下

struct fn_hash {
    struct fn_zone *fn_zones[33];
    struct fn_zone *fn_zone_list;
}

  根据网络掩码长度构成的hash表 在路由表项的核心一级,是由基于网络掩码长度的hash表组成。
IPv4使用32bit地址,所以IPv4地址就有32个不同的网络掩码长度,
再加上/0,就是33个不同的网络掩码长度,/0表示缺省路由。
路由子系统对每一个网络掩码长度维护一个不同的哈希表
    fn_zone结构将路由表项组织成为一个哈希表,将目的网络的掩码长度相
同的路由表项放在一个哈希表内。因而对任意的路由表项,可以根据其网络掩码长度快速得
到其对应的哈希表。非空的fn_zone通过链表组织起来,该链表的头部被保存在fn_zone_list
中。fn_zone_list链表是以网络掩码长度从大到小排列的。
路由表项是由多个不同的数据结构来描述的,每个数据结构描述不同片段的路由信息。
因为只通过部分字段可以区分多条路由表项,因而一条路由信息被分散到多个数据结构内。
这样,不是维护一个庞大而臃肿的结构而是将路由表项分散为多个片段,路由子系统更容易
在相似的路由表项之间共享公共片段信息,因而就可以独立出不同的功能,并在这些功能之
间定义更加清晰的接口。
每个网段(subnet)对应一个fib_node实例,用变量fn_key来表示,它的值为网段。例如对
子网10.1.1.0/24而言,fn_key为10.1.1。注意:fib_node结构(即该结构中的fn_key变量)与一
个网段相关,而不是与一条路由表项相关。多条路由表项可能都有相同的网段。
有相同网段的路由表项(即fn_key相同)共享同一个fib_node。每一条路由表项有各自
的fib_alias结构。例如:可能有一些路由表项,它们的网段相同而只是TOS值不同:每一个
fib_alias实例因而有不同的TOS值。每个fib_alias实例与一个存储真正路由信息(即如何到达
目的地)的fib_info结构相关联。
对于一个fib_node实例,相关的fib_alias实例链表按照IP TOS(即fa_tos字段)的递增顺
序排列。fa_tos值相同的fib_alias实例按照相关的fib_info中fib_protocol字段的递增顺序排列。
本章前面提到路由子系统划分为多个数据结构,目的是优化它们的使用并使逻辑更加清
晰。所以,fib_alias与fib_info之间的关联不是一对一,多个fib_alias结构可能共享一个
fib_info结构。当多条不同的路由表项碰巧与一个已存在的fib_info结构中的参数值相同时,
它们就指向这同一个fib_info实例。通过fib_info结构中的一个引用计数来记住共享数目。
                                     
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载