山西长治供电公司_Linux路由表的结构与算法分析_20160420

合集下载

计算机网络中的路由算法

计算机网络中的路由算法

计算机网络中的路由算法路由算法在计算机网络中起着关键的作用,它用于确定数据包在网络中的传输路径。

根据不同的网络拓扑和需求,有多种不同的路由算法被应用。

本文将介绍几种常见的路由算法。

1. 距离矢量算法(Distance Vector Algorithm)距离矢量算法是一种分布式的路由算法,每个节点在路由表中记录到达目的节点的距离向量。

节点之间通过交换距离向量信息来更新路由表,并且通过Bellman-Ford算法来计算最短路径。

该算法简单易实现,但是在大型网络中容易产生计数到无穷大的问题,即由于链路故障等原因产生的无限循环。

2. 链路状态算法(Link State Algorithm)链路状态算法是一种集中式的路由算法,每个节点都会收集与自身相连的链路状态信息,并通过最短路径算法(如Dijkstra算法)计算出到达其他节点的最短路径。

然后,每个节点都将自己的链路状态信息广播给所有其他节点,使得每个节点都有完整的网络拓扑和链路状态信息。

该算法需要节点之间频繁的广播和计算,但是能够保证收敛,即要么找到最短路径,要么不进行路由。

3. 路径向量算法(Path Vector Algorithm)路径向量算法可以看作是距离矢量算法和链路状态算法的结合,它通过回退进行路径检测和避免计数到无穷大的问题。

每个节点在路由表中记录到达目的节点的路径和向量信息,通过交换路径向量信息来更新路由表。

在计算最短路径时,路径向量算法使用类似链路状态算法的Dijkstra算法,但是在寻找路径时,会检查前面的节点是否已经在路径中出现,以避免产生环路。

4. 队列距离矢量算法(Queue Distance Vector Algorithm)队列距离矢量算法是距离矢量算法的一种改进算法,主要解决计数到无穷大问题。

该算法引入了队列和计数器,通过计数器和链路状态信息来确定数据包是否进入队列。

每个节点在路由表中记录到达目的节点的距离向量和队列的长度。

第6章路由算法总结ppt课件

第6章路由算法总结ppt课件

在日常生活中,随处都可以看到浪费 粮食的 现象。 也许你 并未意 识到自 己在浪 费,也 许你认 为浪费 这一点 点算不 了什么
非自适应路由算法
固定路由算法(fixed routing algorithm) 洪泛法(flooding) 随机走动法(random walk) 基于流量的路由算法(flow-based routing)
由所有的线路平均延迟,可直接计算出流量的加权 平均值,从而得到整个网络的平均分组延迟
这样找出网络的最小平均延迟就可以实现最优路由 选择
在日常生活中,随处都可以看到浪费 粮食的 现象。 也许你 并未意 识到自 己在浪 费,也 许你认 为浪费 这一点 点算不 了什么
自适应路由算法
孤立路由选择 集中路由选择 分布式路由选择
当结点或链路发生故障时,该方法可使路由算法有 较好的稳健性
在日常生活中,随处都可以看到浪费 粮食的 现象。 也许你 并未意 识到自 己在浪 费,也 许你认 为浪费 这一点 点算不 了什么
基于流量的路由算法
该方法不仅考虑网络的拓扑结构,还要考虑网络的 负载因素
对某一给定的线路,如果已知负载量与平均流量, 那么可以根据排队论的知识计算出该线路上的平均 分组延迟
• 如果找不到相应的表项,在G的路由表中增加一项 :(N,G’,D’+C)
• 如果V=G’,G中路由表对应的表项根据D’+C和D的 比较获得
– 如果D’+C<D,G中表项更新为(N,G’,D’+C)
– 否则G中表项保持原状,仍为(N,V,D)
在日常生活中,随处都可以看到浪费 粮食的 现象。 也许你 并未意 识到自 己在浪 费,也 许你认 为浪费 这一点 点算不 了什么

计算机网络网络层路由算法

计算机网络网络层路由算法
一个网络示例
链路状态包
分发链路状态数据包
泛洪法:为了控制泛洪规模,每个数据包包含一个序号,序号随着每个数据包发出逐一递增,路由器记录下它所看到的所有(源路由器,序号)对,当一个新的链路状态数据包到达时,路由器检查这个数据包是否已经出现在上述观察到的列表中,若是新的数据包,则转发,若重复或过时则丢弃。
交换距离信息更新路由表示例
无穷计算问题
∞ 第1次交换后
∞ 第3次交换后
A
B
C
D
E
1
2
3
4 初始时
3
2
3
4 第1次交换后
3
4
3
4 第2次交换后
5
4
5
4 第3次交换后
5
6
5
6 第4次交换后
7
6
7
6 第5次交换后
7
8
7
8 第6次交换后




(b)
.
.
.
A
B
C
D
E



∞ 初始时
1
路由算法(Routing Algorithm)
是网络层软件的一部分,负责所收到数据包发送到哪一条线路上。
路由选择算法应具有下列特性:正确性、简单性、鲁棒性、稳定性、公平性和最优性。
路由算法应该能够处理拓扑结构和流量方面的各种变化,而不能要求所有主机停止所有工作。
路由选择算法可以分为两大类:
01


1
2

∞ 第2次交换后
1
2
3
1
2
3
4 第4次交换后
(a)

路由原理与技术第3章路由器硬件结构与路由查询算法要点课件

路由原理与技术第3章路由器硬件结构与路由查询算法要点课件

路由器操作系统
路由器操作系 路由器之所以可以 接不同 型的网 并 文 行路由,除了必 的硬件条件外,更主要的 是因 每个路由器都有一个核心操作系 来 一 度路由器各部分的运行。 大 部 分 Cisco 路 由 器 使 用 的 是 Cisco 网 互 操 作 系 (Internetworking Operating System, IOS)。IOS配置通常是通 基于文本的命令行接口(Command Line Interface,CLI) 行的。
多比特检索树(Trie)
v 在基本的二叉检索树中每次检查一个比特,即一级对应1个比 特;如果让每一级对应多个比特,就可以大大降低树的深度。 也就能够降低路由查询的时间复杂度。
v 每一级对应的比特数被称为查找步宽。同一级的步宽可以一 样,也可以不一样。前者实现起来比较简单,但浪费存储空 间,后者实现复杂一些,但是会节省一定的存储空间。
v 基本思想是把所有路由前缀按照其长度分为不同的前缀集合, 每个前缀集合内采用哈希算法查找;查询时,从长度位W/2的 集合开始,采用二分查找法。
图中节点对应的是前缀集合,而不是某个或某几个比特位
v 为了保证该算法的正确性,需要引入一个被成为Marker的表 项。考虑下面的例子。有4个地址前缀:0*、1*、00*、110*。 现查找110*。
v 时间复杂度降低的代价就是空间复杂度的上升,每一个中间节点 都需要包含2k个指针(每一级步宽都是K),最差情况下每加入一 个新前缀,需要插入W/K个中间节点,从而需要占用空间O(2k *W/K),所以空间复杂度为O(N*2k *W/K)。
v 更新时需要进行一次路由查找,然后更新节点的指针,最差情况 下需要更新2k-1指针,所以更新复杂度为O(2k +W/K)。

Linuxroute命令详解和使用示例(查看和操作IP路由表)

Linuxroute命令详解和使用示例(查看和操作IP路由表)

Linuxroute命令详解和使⽤⽰例(查看和操作IP路由表)Linux系统的route命令⽤于显⽰和操作IP路由表(show / manipulate the IP routing table)。

要实现两个不同的⼦⽹之间的通信,需要⼀台连接两个⽹络的路由器,或者同时位于两个⽹络的⽹关来实现. 在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在⼀个局域⽹中,局域⽹中有⼀个⽹关,能够让机器访问Internet,那么就需要将这台机器的IP地址设置为Linux机器的默认路由。

要注意的是,直接在命令⾏下执⾏route命令来添加路由,不会永久保存,当⽹卡重启或者机器重启之后,该路由就失效了;可以在/etc/rc.local中添加route命令来保证该路由设置永久有效。

1.命令格式: route [-f] [-p] [Command [Destination] [mask Netmask] [Gateway] [metric Metric]] [if Interface]] 2.命令功能: route命令是⽤于操作基于内核ip路由表,它的主要作⽤是创建⼀个静态路由让指定⼀个主机或者⼀个⽹络通过⼀个⽹络接⼝,如eth0。

当使⽤"add"或者"del"参数时,路由表被修改,如果没有参数,则显⽰路由表当前的内容。

3.命令参数: -c 显⽰更多信息 -n 不解析名字 -v 显⽰详细的处理信息 -F 显⽰发送信息 -C 显⽰路由缓存 -f 清除所有⽹关⼊⼝的路由表。

-p 与 add 命令⼀起使⽤时使路由具有永久性。

add:添加⼀条新路由。

del:删除⼀条路由。

-net:⽬标地址是⼀个⽹络。

-host:⽬标地址是⼀个主机。

netmask:当添加⼀个⽹络路由时,需要使⽤⽹络掩码。

gw:路由数据包通过⽹关。

注意,你指定的⽹关必须能够达到。

metric:设置路由跳数。

路由算法简介

路由算法简介

上述路径环路会通过R1、R2之间不断的路 由更新报文交换而解除,但是解除过程是 非常缓慢的。在出现路径环路之后,在下 一轮路由广播中,R1将向R2广播 (net1,R2,2)表项,R2收到此表项后,将 去往net1的路径改为(net1,R1,3);
然后R2向R1通告(net1,R1,3)表项, R1将去往net1的路由项改为(net1,R2, 4)…
➢ 适应范围:支持较大规模的网络,最多可 支持几百台路由器。
➢ 快速收敛:在网络拓扑结构发生变化后立 即发送更新报文,使变化在自治系统中同 步
➢ 无自环:由于OSPF根据收集到的链路状态 用最短路径树算法(Dijkstra)计算路由, 从算法本身保证了不会生成自环路由。
➢ 区域划分:允许自制系统的网络被划分成 区域来管理。
快 65536 可进行区域划分
Dijkstra算法
➢ 在路由选择算法中都要用到求最短路径的 算法,最出名的就是Bellman-Ford算法和 Dijkstra算法。他们的主要思想:黑板分析。
DSR 路由协议简介
➢ 动态源路由协议(DSR,Dynamic Source Routing)是一种按需路由协议,它允许节点 动态地发现到达目的节点的多跳路由。
图2 OSPF中AS、主干和区域间的关系
OSPF协议的基本特点
➢ 向本自治系统中的所有路由器发送信息。 使用洪泛法(flooding):路由器通过所有 输出端口向所有相邻的路由器发送信息, 这些相邻路由器又将此信息发给相邻路由 器(但不回传)。这样,最终整个路由器 都得到这个消息的一个副本。
➢ 发送的信息:与本路由器相邻的所有路由 器的链路状态。
➢ 当跳数超过15,RIP协议会认为目的地不可 达。因此,它只适应于中小型网络。

路由算法分类

路由算法及分类路由算法及分类:1、非自适应算法,静态路由算法不能根据网络流量和拓扑结构的变化更新路由表,使用静态路由表,也称为固定式路由选择算法。

特点:简单,开销少;灵活性差。

2、自适应算法,动态路由算法可根据网络流量和拓扑结构的变化更新路由表。

特点:开销大;健壮性和灵活性好。

3、最优化原则(optimality principle)如果路由器 J 在路由器 I 到 K 的最优路由上,那么从 J 到 K 的最优路由会落在同一路由上。

4、汇集树(sink tree)从所有的源结点到一个给定的目的结点的最优路由的集合形成了一个以目的结点为根的树,称为汇集树;路由算法的目的是找出并使用汇集树。

几种典型的路由选择算法:1、最短路径路由算法(Shortest Path Routing)1)基本思想构建子网的拓扑图,图中的每个结点代表一个路由器,每条弧代表一条通信线路.为了选择两个路由器间的路由,算法在图中找出最短路径。

2)测量路径长度的方法结点数量地理距离传输延迟距离、信道带宽等参数的加权函数3)Dijkstra算法每个结点用从源结点沿已知最佳路径到本结点的距离来标注,标注分为临时性标注和永久性标注;初始时,所有结点都为临时性标注,标注为无穷大;将源结点标注为0,且为永久性标注,并令其为工作结点;检查与工作结点相邻的临时性结点,若该结点到工作结点的距离与工作结点的标注之和小于该结点的标注,则用新计算得到的和重新标注该结点;在整个图中查找具有最小值的临时性标注结点,将其变为永久性结点,并成为下一轮检查的工作结点;重复第四、五步,直到目的结点成为工作结点;2、洪泛及选择洪泛算法1)洪泛算法(Flooding)属于静态路由算法a)基本思想把收到的每一个包,向除了该包到来的线路外的所有输出线路发送。

b)主要问题洪泛要产生大量重复包.c)解决措施每个包头包含站点计数器,每经过一站计数器减1,为0时则丢弃该包;记录包经过的路径2)选择性洪泛算法(selective flooding)洪泛法的一种改进。

linux的route命令

linux的route命令Linux下的route命令用语显示和操作路由表,下面由店铺为大家整理了linux下route命令的相关知识,希望对大家有帮助!linux的rounte命令详解route命令用于显示和操作IP路由表。

要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。

在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设置为Linux机器的默认路由。

要注意的是,直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了;要想永久保存,有如下方法:1.在/etc/rc.local里添加2.在/etc/sysconfig/network里添加到末尾3./etc/sysconfig/static-router :any net x.x.x.x/24 gw y.y.y.y格式:route格式:/sbin/route用于打印路由表(display the current routing table)。

在非root用户使用时需要使用完整路径执行route命令。

命令参数[root@linux ~]# route [-nee][root@linux ~]# route add [-net|-host] [网域或主机] netmask [mask] [gw|dev][root@linux ~]# route del [-net|-host] [网域或主机] netmask [mask] [gw|dev]观察的参数:-n :不要使用通讯协定或主机名称,直接使用IP 或port number;-ee :使用更详细的资讯来显示增加 (add) 与删除 (del) 路由的相关参数:-net :表示后面接的路由为一个网域;-host :表示后面接的为连接到单部主机的路由;netmask :与网域有关,可以设定 netmask 决定网域的大小;gw :gateway 的简写,后续接的是 IP 的数值喔,与 dev 不同;dev :如果只是要指定由那一块网路卡连线出去,则使用这个设定,后面接 eth0 等格式:route -n格式:/sbin/route -n用于打印路由表,加上-n参数就是在输出的信息中不打印主机名而直接打印ip地址。

如何使用路由器设置路由表

如何使用路由器设置路由表路由器是网络中用于转发数据包的设备,它通过路由表来指定数据包的下一跳地址。

路由表是路由器的重要组成部分,它决定了网络中数据的传输路线。

在以上基础上,本文将介绍如何使用路由器设置路由表,以便更好地管理网络。

一、理解路由表的概念路由表是路由器用于查找数据包下一跳地址的数据结构,它记录了目的地址与下一跳地址之间的映射关系。

路由器接收到数据包后根据数据包的目的地址查找路由表,找到目的地址对应的下一跳地址,将数据包转发给下一跳路由器或主机。

由于一个网络中可能存在多个下一跳地址,因此路由表中通常包含多条路由记录。

二、学会查看路由表路由器的路由表通常是动态更新的,它会根据网络状况不断调整路由策略。

在设置路由表之前,我们需要先了解当前的路由表情况。

一般来说,路由器的管理界面可以查看路由表信息。

在使用路由器设置路由表之前,我们需要确认路由表中记录的下一跳地址是否正确。

三、设置静态路由静态路由是指手动设置路由表条目,即管理员手动指定下一跳地址。

静态路由的优点是配置简单,不需要占用路由器的计算资源。

在网络规模较小且网络拓扑固定的情况下,可以使用静态路由。

设置静态路由的步骤如下:1.在路由器管理界面中找到路由表设置选项;2.添加一条路由表记录,指定目的地址和下一跳地址;3.保存设置并测试连通性。

四、设置动态路由动态路由是通过协议自动更新路由表。

其中包括RIP、OSPF等协议,它们会通过互相交换信息,动态地调整路由表,保证网络中的数据能够正常传输。

设置动态路由的步骤如下:1.选择适合的路由协议;2.配置路由器的协议参数,如协议优先级、网络地址等;3.保存设置并测试连通性。

五、总结对于一个复杂的网络,设置路由器路由表是保证网络正常运行的重要手段。

本文简要介绍了理解和设置路由表的基本内容。

在实际应用中,需要综合考虑网络规模、网络拓扑和网络性能等因素,选择合适的设置方式。

Internet路由之路由表查找算法概述-哈希LC-Trie树256-way-mtrie树

Internet路由之路由表查找算法概述-哈希/LC-Trie树/256-way-mtrie 树引:路由是互联网的一个核心概念,广义的讲,它使分组交换网的每个节点彼此独立,通过路由耦合在一起,甚至在电路交换网中,虚电路的建立也依赖路由,路由就是网络中数据通路的指向标。

狭义的讲,路由专指IP路由,它支撑着整个IP网络。

由于IP是数据报网络,它是不建立连接的,因此IP分组是一跳一跳被转发,通路是通过路由信息一跳一跳的被打通的,因此路由直接关系到整个基于IP的网络的连通性。

由于IP协议没有方向,甚至它都没有会话的概念,因此路由必然要是双向的,否则数据就有去无回了(有人提倡用NAT来解决反向路由问题,实际上NAT在公共核心网络上口碑十分不咋地,它甚至破坏了IP协议的原则,记住,NAT一般只用于端点)。

互联网如此之大,每个路由器上的路由信息会非常之多,路由器是怎么在海量的路由信息中用最快的速度-显然很重要-检索出自己需要的呢?另外如此海量的路由信息又是怎么生成的呢?本文着重回答第一个问题,关于第二个问题请参考《Internet路由结构(第二版)》(Cisco Press,想看就赶快买,不买就买不到了,Cisco有几本书真的很火爆,总是不好买)1 .基本概念路由的概念:路由是一种指向标,因为网络是一跳一跳往前推进的,因此在每一跳都要有一系列的指向标。

实际上不仅仅是分组交换网需要路由,电路交换网在创建虚电路的时候也需要路由,更实际的例子,我们日常生活中,路由无处不在。

简单的说,路由由三元素组成:目标地址,掩码,下一跳。

注意,路由项中其实没有输出端口-它是链路层概念,Linux操作系统将路由表和转发表混为一谈,而实际上它们应该是分开的(分开的好处之一使得MPLS更容易实现)。

路由项通过两种途径加入内核,一种是通过用户态路由协议进程或者用户静态配置配置加入,另一种是主机自动发现的路由。

所谓自动发现的路由实际上是“发现了一个路由项和一个转发表”,其含义在主机某一个网卡启动的时候生效,比如eth0启动,那么系统生成下列路由表项/转发项:往eth0同一IP网段的包通过eth0发出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux路由表的结构与算法分析 路由是网络栈的核心部分。路由表本身的设计很大情度上影响着路由的性能,并且好的设计 能减少系统资源的消耗,这两方面尤其体现在路由表的查找上。目前的内核路由存在两种查找算法,一种为HASH算法,另一种为LC-trie算法,前者是目 前内核使用的缺省算法,而后者更适用在超大路由表的情况,它在这种情况提高查找效率的同时,大大地增加了算法本身的复杂性和内存的消耗。综上,这两种算法 各有其适用的场合,本文分析了基于2.6.18内核路由部分的代码在HASH算法上路由表结构的实现,并且在文章最后给出了一个简单的策略路由的应用。 一、路由表的结构 为了支持策略路由,Linux使用了多个路由表而不是一个,即使不使用策略路由,Linux也使用了 两个路由表,一个用于上传给本地上层协议,另一个则用于转发。Linux使用多个路由表而不是一个,使不同策略的路由存放在不同的表中,有效地被免了查找 庞大的路由表,在一定情度上提高了查找了效率。 路由表本身不是由一个结构表示,而是由多个结构组合而成。路由表可以说是一个分层的结构组合。在第一层,它先将所有的路由根据子网掩码(netmask)的长度(0~32)分成33个部分(struct fn_zone),然后在同一子网掩码(同一层)中,再根据子网的不同(如10.1.1.0/24和10.1.2.0/24),划分为第二层 (struct fib_node),在同一子网中,有可能由于TOS等属性的不同而使用不同的路由,这就是第三层(struct fib_alias),第三层结构表示一个路由表项,而每个路由表项又包括一个相应的参数,如协议,下一跳路由地址等等,这就是第四层(struct fib_info)。分层的好处是显而易见的,它使路由表的更加优化,逻辑上也更加清淅,并且使数据可以共享(如struct fib_info),从而减少了数据的冗余。

struct fib_table *fib_tables[RT_TABLE_MAX+1]; // RT_TABLE_MAX 为255

图1为一个路由表的总体结构。自上而下由左向右看,它首先为一个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 flowi *flp, struct fib_result *res);

unsigned char tb_data[0]; };

每个fib_table结构在内核中表示一个路由表:

+ 图1(引自[1])

这个结构中包括这个表的ID,以及主要的一些用于操作路由表的函数指针,这里我们只关心最后一域――tb_data[0],这是一个零长的数组,它在内核中也较为常见,它表示

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

指向这个结构的末尾。由图1可以看到,这个结构的末尾接着便是一个struct fn_hash结构,这个结构是随fib_table结构一起分配的,所以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)->fz_hashmask)

int fz_order; /* Zone order */ u32 fz_mask; #define FZ_MASK(fz) ((fz)->fz_mask)

}; 这个fn_zone域就是我们上面提前的结构,用于将路由根据子网掩码的长度分开成33个部分,其中fn_zones[0]用于默认网关。而fn_zone_list域就是将正在使用的fn_zone链成一个链表。接着再深入到struct fn_zone结构中:这个结构中有两个域比较重要,一个为fz_hash域,它指向一个HASH表的表头,这个HASH的长度是fz_divisor。并且这个HASH表的长度是可变的,当表长达到一个限定值时,将重建这个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()函数HASH之后就是这个子网对应的HASH值,然后就可以插入到相应的fz_hash[n]链表中了。冲突的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域将这些路由表项链成一个链表。这个结构中的另一个域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_nh[0]; #define fib_dev fib_nh[0].nh_dev };

这个结构里面是一个用于路由的标志和属性,其中最重要的一个域是fib_nh[0], 在这里,我们再次看到了零长数组的应用,它是通过零长来实现变长结构的功能的。因为,我们需要一个定长的fib_info结构,但是在这个结构末尾,我们 需要的fib_nh结构的个数是不确定的,它在运行时确定。这样,我们就可以通过这种结构组成,在运行时为fib_info分配空间的时候,同时在其末尾 分配所需的若干个fib_nh结构数组,并且这个结构数组可以通过fib_info->fib_nh[n]来访问,在完成fib_info的分配后 将fib_nhs域置为这个数组的长度。 另一方面,fib_info也是HASH表的一个应用,结构中存在着两个域,分别是 fib_hash 和fib_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_power域的。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;

相关文档
最新文档