声明:本文为原创
#####请转贴时保留以下内容######
作者:GTT
请提出宝贵意见Mail:mtloveft@hotmail.com
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结构中的一个引用计数来记住共享数目。
阅读(372) | 评论(0) | 转发(0) |