Ad hoc路由协议实现研究
时间:09-03
来源:与非网
点击:
4 Linux下的一种实现
4.1 Linux系统网络协议栈体系结构
Linux网络系统有硬件,数据链路层、IP层、INET Socket层、BSD Socket层和应用层5部分。其中在Linux内核中分组包括前4部分。图1为Linux系统基于TCP/IP的网络体系结构。
4.2 Linux系统网络堆栈的IP层
Linux路由系统中主要保存3种路由相关的数据:(1)在物理上与本机相连接的主机地址信息表,即邻居节点表。邻居节点表用neigh_table{} 数据结构表示,以neighbour{}数据结构为节点;(2)在网络访问中判断一个网络地址的数据表,是转发信息库FIB,用来保存路由规则,用 fib_table{)数据结构链表来表示;(3)最近使用过的路由缓存表,称为路由缓存表,用rtable{}数据结构链表表示。
在类Unix操作系统中,路由功能一般包括2部分。一部分驻留在操作系统内核中,用以基于表驱动的进程,根据路由表信息,设定正确的地址,将数据分组发往对应的网络接口,这部分称为"分组转发功能模块";另一部分实现路由协议的逻辑计算,通过与其他主机交换信息计算出到其他节点的正确路由,实现真正的寻找路由和维护路由功能,这部分称为"分组寻址功能模块"。分组转发路由模块在内核中基于一个内核路由表来工作,每次发送数据分组都要查询内核路由表,取得对应的下一跳邻居节点的地址和对应的网络接口。内核路由表一般由分组寻路功能模块操作维护。在查找内核路由表时根据路由表项转发。如果找不到匹配的路由表项,则按缺省路由发送,一般将网关作为缺省路由的下一跳节点。如果缺省路由不存在则操作系统将直接丢弃数据分组。分组寻路模块功能负责寻路,它和其他节点交换信息,采用一定的路由算法计算和维护内核路南表。分组寻路功能模块既可在内核实现,也可在用户空间实现,Linux系统自带的分组寻路模块在内核中。分组转发功能和分组寻路功能分开后,可在分组转发功能模块不变的情况下,通过修改分组寻路功能模块用其他路由协议代替现有的路由协议。
4.3 Netfilter/iptables网络分组的处理
Netfilter是嵌入在内核IP协议栈的一系列调用入口,设置在数据报处理的路径上。Netfilter为每种网络协议定义一套钩子函数(IPv4定义5个子函数),这些钩子函数在数据分组流过协议栈的几个关键点时被调用。在这几个关键点上,协议把网络数据分组、钩子函数及钩子函数标号作为参数调用 Netfilter框架。内核的任何模块可对每种协议的一个或多个钩子进行注册。当某个数据报被传送至Netfilter框架时,内核能够检测是否有模块对该协议和钩子进行注册。若已注册则调用该模块注册时使用的回调函数,这些模块就有机会检查、修改或丢弃该分组及指示Netfilter将该数据分组传入用户空间的队列。排队的数据分组被传递至用户空间,在用户空间异步进行处理。
一个用户空间进程能够检查数据分组、修改数据分组,甚至还可重新将该数据分组通过离开内核的同一个钩子函数重新注入内核中。
综上所述,由于Linux的Netfilter/iptables功能强大,并且与内核结合完美,因此受到广泛关注并应用于Ad hoc路由协议的实现。
4.4 基本问题的解决
Linux体系结构下,在处理无路由分组和更新路由缓存时具有较好的解决途径。
通过使用一个本地隧道设备Universal TUN/TAP作为这些地址‘接口’过滤无路由分组。再将这些分组缓存在一张由目的地IP地址为索引的Hash队列。
当路由发现完成成功后,使用新发现的路由,内核中的这些分组被恰当地路由出去,从而较好处理了没有路由分组。为每个路南表条目在内核外面维护一个时间戳来更新路由缓存。
设计一个route_check的简单核心模块维护该表,每个路由出去的分组都将经该模块,还可查看分组头并更新对应的时间戳。
5 结束语
由于Linux操作系统,通过分析当前操作系统的网络模块,列出实现Ad hoc路由协议所面临的问题并提出了一种可行的解决方案。
4.1 Linux系统网络协议栈体系结构
Linux网络系统有硬件,数据链路层、IP层、INET Socket层、BSD Socket层和应用层5部分。其中在Linux内核中分组包括前4部分。图1为Linux系统基于TCP/IP的网络体系结构。
4.2 Linux系统网络堆栈的IP层
Linux路由系统中主要保存3种路由相关的数据:(1)在物理上与本机相连接的主机地址信息表,即邻居节点表。邻居节点表用neigh_table{} 数据结构表示,以neighbour{}数据结构为节点;(2)在网络访问中判断一个网络地址的数据表,是转发信息库FIB,用来保存路由规则,用 fib_table{)数据结构链表来表示;(3)最近使用过的路由缓存表,称为路由缓存表,用rtable{}数据结构链表表示。
在类Unix操作系统中,路由功能一般包括2部分。一部分驻留在操作系统内核中,用以基于表驱动的进程,根据路由表信息,设定正确的地址,将数据分组发往对应的网络接口,这部分称为"分组转发功能模块";另一部分实现路由协议的逻辑计算,通过与其他主机交换信息计算出到其他节点的正确路由,实现真正的寻找路由和维护路由功能,这部分称为"分组寻址功能模块"。分组转发路由模块在内核中基于一个内核路由表来工作,每次发送数据分组都要查询内核路由表,取得对应的下一跳邻居节点的地址和对应的网络接口。内核路由表一般由分组寻路功能模块操作维护。在查找内核路由表时根据路由表项转发。如果找不到匹配的路由表项,则按缺省路由发送,一般将网关作为缺省路由的下一跳节点。如果缺省路由不存在则操作系统将直接丢弃数据分组。分组寻路模块功能负责寻路,它和其他节点交换信息,采用一定的路由算法计算和维护内核路南表。分组寻路功能模块既可在内核实现,也可在用户空间实现,Linux系统自带的分组寻路模块在内核中。分组转发功能和分组寻路功能分开后,可在分组转发功能模块不变的情况下,通过修改分组寻路功能模块用其他路由协议代替现有的路由协议。
4.3 Netfilter/iptables网络分组的处理
Netfilter是嵌入在内核IP协议栈的一系列调用入口,设置在数据报处理的路径上。Netfilter为每种网络协议定义一套钩子函数(IPv4定义5个子函数),这些钩子函数在数据分组流过协议栈的几个关键点时被调用。在这几个关键点上,协议把网络数据分组、钩子函数及钩子函数标号作为参数调用 Netfilter框架。内核的任何模块可对每种协议的一个或多个钩子进行注册。当某个数据报被传送至Netfilter框架时,内核能够检测是否有模块对该协议和钩子进行注册。若已注册则调用该模块注册时使用的回调函数,这些模块就有机会检查、修改或丢弃该分组及指示Netfilter将该数据分组传入用户空间的队列。排队的数据分组被传递至用户空间,在用户空间异步进行处理。
一个用户空间进程能够检查数据分组、修改数据分组,甚至还可重新将该数据分组通过离开内核的同一个钩子函数重新注入内核中。
综上所述,由于Linux的Netfilter/iptables功能强大,并且与内核结合完美,因此受到广泛关注并应用于Ad hoc路由协议的实现。
4.4 基本问题的解决
Linux体系结构下,在处理无路由分组和更新路由缓存时具有较好的解决途径。
通过使用一个本地隧道设备Universal TUN/TAP作为这些地址‘接口’过滤无路由分组。再将这些分组缓存在一张由目的地IP地址为索引的Hash队列。
当路由发现完成成功后,使用新发现的路由,内核中的这些分组被恰当地路由出去,从而较好处理了没有路由分组。为每个路南表条目在内核外面维护一个时间戳来更新路由缓存。
设计一个route_check的简单核心模块维护该表,每个路由出去的分组都将经该模块,还可查看分组头并更新对应的时间戳。
5 结束语
由于Linux操作系统,通过分析当前操作系统的网络模块,列出实现Ad hoc路由协议所面临的问题并提出了一种可行的解决方案。
Ad Hoc 路由协议 OSPF IP栈 BGP 相关文章:
- 新一代移动通信系统的关键技术(10-26)
- SoC面临挑战,智能分割顺势而起(11-07)
- 让ADSL上网更高效 谈谈如何选好“猫”(01-08)
- 用ADSL Modem设置家庭网共享(01-08)
- ADSL Modem路由功能全接触(01-08)
- ADSL变慢原因查找和排除八项总结(01-10)