![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
路由分析
文章平均质量分 75
wangpengqi
这个作者很懒,什么都没留下…
展开
-
linux路由内核实现分析(一)----邻居子节点(1)
------------------------------------------------------------------------------------------以下是我根据 linux-2.6.23.9版本内核源代码所做阅读笔记,属个人兴趣而为,希望找到有共同兴趣的朋友一起讨论和研究,有谬误之处,笔者水平有限,欢迎大家拍砖:)--------------转载 2013-07-10 12:13:55 · 1088 阅读 · 0 评论 -
查询一个路由
前面已经分析了FIB表中的单位:路由表,路由哈希表,路由域,路由节点,路由别名,路由信息。拿到一张具体的路由表,根据其提供的成员方法tb_lookup,可以为一个具体的目的地址查询到一条路由。tb_lookup的函数定义如下: int fn_hash_lookup(struct fib_table *tb, const struct flowi *flp, struct fib_resu转载 2013-06-30 13:50:48 · 913 阅读 · 0 评论 -
接收路由查找
IP层接到一个数据包以后,如果需要进行路由,就调用函数myip_route_input, myip_route_input先在缓存里寻找路由,如果失败则调用myip_route_input_slow, myip_route_input_slow调用myfib_lookup在路由表里寻找路由,如果命中,首先在缓存里添加这个路由,然后返回结果。 路由缓存的数据结构是一个全局哈希表myrt_h转载 2013-06-30 14:20:37 · 762 阅读 · 0 评论 -
创建struct fib_info
在协议栈的FIB(Forwarding Information Base)模块中,结构体struct fib_info是一个很基本的单位,它表示一个路由信息,一个路由信息可以被多个路由共享。下面是其完整的定义: struct fib_info { struct hlist_node fib_hash; struct hlist_node fib转载 2013-06-30 14:55:30 · 1015 阅读 · 0 评论 -
两张路由表(FIB)的内容
local表: the fib table id: RT_TABLE_LOCAL, stamp: 0: the array of zone in hash table:: hash 8: have an fib_node list:: entries: 1: hash divisor: 16: hash mask: f: zo转载 2013-06-30 17:24:18 · 1210 阅读 · 0 评论 -
路由表(FIB)内容的生成(一)
前面已经讲到过路由表的初始化,路由表是一个比较复杂的数据结构,一下子并不好理解。下面我们通过模块初始化时Linux的notify机制所触发的网络设备事件回调myfib_netdev_event,来逐步分析如何向FIB插入路由项,来进一步理解FIB。 每一个网络设备接口在启动时或者模块my_inet被插入到内核空间时,都会有NETDEV_UP事件发生,通知内核,设备启动。 myfib_ne转载 2013-06-30 17:32:01 · 1378 阅读 · 0 评论 -
查询一个输入路由
INET域中有两个地方需要查询输入路由,一个是当收到一个IP数据报,ip_rcv将其交给ip_rcv_finish后,ip_rcv_finish 判断skb->dst是否为NULL(因为对于环回接口上收到的数据报,其dst是存在的,不需要查询输入路由),如果为NULL,则需要查询得到 输入路由。另一个地方是当收到一个ARP数据报,arp_rcv将其交给arp_process处理时,arp_proc转载 2013-06-30 10:35:09 · 1135 阅读 · 0 评论 -
目的入口(dst_entry)
最终生成的IP数据报的路由称为目的入口(dst_entry),目的入口反映了相邻的外部主机在主机内部的一种“映象”,目的入口在内核中的定义如下: struct dst_entry { struct dst_entry *next; atomic_t __refcnt; int __use;转载 2013-06-30 10:54:04 · 4391 阅读 · 0 评论 -
路由表的查询
我们已经了解了整个路由表的数据结构,下面看看如何在路由表中查询一个路由信息。my_inet模块提供的路由查询接口定义如下: int myfn_hash_lookup(struct fib_table *tb, const struct flowi *flp, struct fib_result *res) 参数tb指定查询哪一张转载 2013-06-30 15:23:34 · 1499 阅读 · 0 评论 -
路由表(FIB)详解
宏CONFIG_IP_MULTIPLE_TABLES表示路由策略,当定义了该宏,也即意味着内核配置了“路由策略”。产生的最大的不同就是内核可以使用多达256张FIB。其实,这256张FIB在内核中的表示是一个全局数组: struct fib_table *myfib_tables[RT_TABLE_MAX+1];而宏RT_TABLE_MAX定义如下: enu转载 2013-06-30 15:48:11 · 7406 阅读 · 1 评论 -
路由表(FIB)的初始化
宏CONFIG_IP_MULTIPLE_TABLES表示配置路由策略(对路由器而言?),如果定义了该宏,系统可以创建多达256张路由表,全部存放在数组struct fib_table *fib_tables[RT_TABLE_MAX+1]中。 如果配置了路由策略,在FIB的初始化函数中,首先创建了两张路由表myip_fib_local_table, myip_fib_main_table转载 2013-06-30 17:46:23 · 1596 阅读 · 0 评论 -
路由相关的初始化(二)
myipv4_dst_ops.gc_thresh是一个无符号数,当路由的哈希表的表项达到这个值时,需要进行理清,从代码来看,它正好被设为 rt_hash_table的入口数,在我们的my_inet模块中为4096。 myip_rt_max_size是rt_hash_table的大小。myrt_cache_stat是一个struct rt_cache_stat的数组,每个CPU对应数组的转载 2013-06-30 17:46:57 · 785 阅读 · 0 评论 -
Linux内核分析 - 网络[四]:路由表
路由表 在内核中存在路由表fib_table_hash和路由缓存表rt_hash_table。路由缓存表主要是为了加速路由的查找,每次路由查询都会先查找路由缓存,再查找路由表。这和cache是一个道理,缓存存储最近使用过的路由项,容量小,查找快速;路由表存储所有路由项,容量大,查找慢。首先,应该先了解路由表的意义,下面是route命令查看到的路由表:Desti转载 2013-07-01 21:54:50 · 908 阅读 · 0 评论 -
互联网络层的内核实现[内核中的路由机制]
内核中网络层3条线:A 主机到网络->互联网络层-->传输层:ip_rcv() -->NF_INET_PRE_ROUTING -->ip_rcv_finish -->ip_route_input查找该分组路由,确定下一步处理函数ip_local_deliver -->在内核高速路由缓冲中查找 -->在内核转载 2013-09-09 16:29:38 · 4231 阅读 · 0 评论 -
路由域和路由表
前面讲到过,FIB里的最基本单位是路由信息(struct fib_info),它保存了关于路由的下一跳信息,本地接口的IP地址等,一个路由项对应一个路由别名(struct fib_alias),路由别名由路由信息再加上tos,type,scope,state等信息组成。目的地址相同的路由项的路由别名共享一个路由节点 (struct fib_node),路由节点的作用就是用于管理路由别名。转载 2013-06-30 11:49:54 · 1306 阅读 · 0 评论 -
创建一个路由节点struct fib_node
在为一个网络设备接口的IP地址创建四个路由项(本地接收,子网广播,子网单播,本地接收的广播)的时候,需要为每个路由项创建一个路由节点,struct fib_node结构体表示一个路由节点,下面是其定义: struct fib_node{ struct hlist_node fn_hash; struct list_head fn_alias;转载 2013-06-30 11:30:39 · 1499 阅读 · 0 评论 -
linux路由内核实现分析(一)----邻居子节点(2)
邻居节点相关的操作: 查找到路由后,会调用arp_bind_neighbour绑定一个邻居项 int arp_bind_neighbour(struct dst_entry *dst){ struct net_device *dev = dst->dev; struct neighbour *n = dst->neighbour;转载 2013-07-10 12:14:29 · 1061 阅读 · 0 评论 -
linux路由内核实现分析(二)---FIB相关数据结构(4)
fib_info结构struct fib_info { struct hlist_node fib_hash; struct hlist_node fib_lhash; int fib_treeref; atomic_t fib_clntref; int转载 2013-07-10 12:21:32 · 1478 阅读 · 0 评论 -
linux路由内核实现分析(四)---路由缓存机制(4)
ip_route_input函数 int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr, u8 tos, struct net_device *dev){ struct rtable * rth; unsigned转载 2013-07-10 12:32:22 · 1269 阅读 · 0 评论 -
linux路由内核实现分析(二)---FIB相关数据结构(1)
------------------------------------------------------------------------------------------以下是我根据 linux-2.6.23.9版本内核源代码所做阅读笔记,属个人兴趣而为,希望找到有共同兴趣的朋友一起讨论和研究,有谬误之处,笔者水平有限,欢迎大家拍砖:)--------------转载 2013-07-10 12:14:59 · 1145 阅读 · 0 评论 -
linux路由内核实现分析(二)---FIB相关数据结构(3)
fib_node结构struct fib_node { struct hlist_node fn_hash; struct list_head fn_alias; u32 fn_key;};这个结构实际上代表一个路由节点,fn_key是这个路由节点的IP地址或者网络号(对于本地接收路由,它转载 2013-07-10 12:19:06 · 1143 阅读 · 0 评论 -
linux路由内核实现分析(四)---路由缓存机制(1)
------------------------------------------------------------------------------------------以下是我根据 linux-2.6.23.9版本内核源代码所做阅读笔记,属个人兴趣而为,希望找到有共同兴趣的朋友一起讨论和研究,有谬误之处,笔者水平有限,欢迎大家拍砖:)--------------转载 2013-07-10 12:30:28 · 954 阅读 · 0 评论 -
linux路由内核实现分析(四)---路由缓存机制(3)
在函数ip_rt_init( )中进行了rt_hash_bucket的初始化,代码如下: rt_hash_table = (struct rt_hash_bucket *) alloc_large_system_hash("IP route cache", sizeof(struc转载 2013-07-10 12:31:49 · 925 阅读 · 0 评论 -
linux路由内核实现分析(二)---FIB相关数据结构(2)
fn_zone结构struct fn_zone { struct fn_zone *fz_next; struct hlist_head *fz_hash; int fz_nent; int fz_divisor;转载 2013-07-10 12:17:42 · 1022 阅读 · 0 评论 -
linux路由内核实现分析(三)---路由查找过程
------------------------------------------------------------------------------------------以下是我根据 linux-2.6.23.9版本内核源代码所做阅读笔记,属个人兴趣而为,希望找到有共同兴趣的朋友一起讨论和研究,有谬误之处,笔者水平有限,欢迎大家拍砖:)--------------转载 2013-07-10 12:29:48 · 4941 阅读 · 0 评论 -
linux路由内核实现分析(四)---路由缓存机制(2)
dst_entry结构 struct dst_entry{ struct rcu_head rcu_head; struct dst_entry *child; struct net_device *dev; short转载 2013-07-10 12:31:01 · 877 阅读 · 0 评论 -
创建struct fib_info函数分析
在协议栈的FIB(Forwarding Information Base)模块中,结构体struct fib_info是一个很基本的单位,它表示一个路由信息,一个路由信息可以被多个路由共享。下面是其完整的定义: struct fib_info { struct hlist_node fib_hash; struct hlist_node fib转载 2013-06-30 11:25:31 · 1518 阅读 · 0 评论 -
路由规则
前面我们提到过路由策略的问题,策略性是指对于IP包的路由是以网络管理员根据需要定下的一些策略为主要依据进行路由的。例如我们可以有这样的策略:“所有来直自网A的包,选择X路径;其他选择Y路径”,或者是“所有TOS为A的包选择路径F;其他选者路径K”。 策略性路由机制与传统的路由算法相比主要是引入了多路由表以及规则的概念。关于多路由表,我们前面已经讲过,当内核配置了“路由策略”后,就可以使用转载 2013-06-30 15:15:16 · 1925 阅读 · 0 评论 -
初始化跟路由相关的定时器
结构体struct timer_list是内核中的一个实时计时器。其定义如下: struct timer_list { struct list_head entry; unsigned long expires; unsigned long magic; void (*转载 2013-06-30 17:35:20 · 654 阅读 · 0 评论 -
浅析Linux Kernel 哈希路由表实现(一)
1. 路由表目前Linux内核中支持两种路由表,一种是Hash路由表,另一种是Trie路由表,Trie算法查找效率很高,但它也因极其消毫内存资源而闻名,因此一般用在大型机上,否则在路由项过多时很可能造成内存的耗尽。在一般的机器上最好还是使用Hash路由表,之前有争论说Linux使用Hash路由表相比于二叉树效率太低,不适合商用,其实只要设计良好的哈希算法,尽量减少哈希碰撞,Hash路由表的转载 2013-08-02 19:02:16 · 3934 阅读 · 0 评论