snooping

决定所需要的事件的一个可能性就是去杂乱的探听所有的输入和输出的分组[8]。执行探听的代码设计在内核中和对用户层程序是有效的。这个探听的特征可以用来决定在第3部分检测到的事件。例如,当一个节点不知道在一跳的MAC层地址时一个ARP包被创建。由这个推论,如果一个ARP包被一个未知目的地接收到并且由本地主机发起的,那么一个路由寻找将被发起。一个类似的行为,通过监视进出的所有包,来决定所有其他的AODV路由协议事件。

这个解决方案的最重要的优点是它不需要任何代码运行在内核空间中。所以这个解决方案需要简单的安装和执行。它的两个主要的缺点是加了不必要的头部(overhead)和依赖于ARP。例如某个路由发现的需要是有ARP请求来指出的。自从路由寻找被出去的ARP包发起,这些出去的包被加了不必须的头部,并且浪费了带宽。依赖于ARP也带来了很多问题。如果路由表和ARP缓存变的不同步了,那么路由协议不能实现正确的实现功能是可能发生的。例如,如果一个ARP缓存包含一个到特殊的未知的目的地的入口,因为它没有被路由守护进程所知道,所以这个ARP包没有为这个目的地而创建。结果是,路由寻找没有被发起。对于正确的操作,这个路由协议必须在IP路由表的外部监听和控制ARP缓存,因为它们两的不同可能导致路由协议的不正确执行。

kernel modification内核修改

另外一种决定AODV事件的可能性是去修改内核。代码可以放置在内核中去沟通在section3中所列举的事件与用户层的AODV守护进程。例如,为了发起一个路由寻找,代码加到内核中的路由寻找失败发生的地方。由内核中的这个代码设定,如果一个路由查找失败发生,那么在用户层的守护进程中一个方法被呼叫。AODV路由协议守护进程的结构和必需的支持逻辑。

这种解决方法的优点是这些事件可以被明确的决定并且没有任何浪费的加在头部前的数据。它主要的缺点是用户的安装和通用性。必要的内核修改的安装需要一个完整的内核重编辑。这个对于需用用户来说是非常难的过程。并且,内核的修改经常是不兼容的在一个修改的版本和另外一个内核之间。最后,理解linux内核和网络协议组要求检查重要的很多的为申明的复杂的代码。

Netfilter

Netfilter是在linux协议组中在许多挂钩点的一组过滤子系统,section2.3所描述的一样。Netfilter通过用户自定义的代码来重定向包流,这些代码能为用户层守护进程检测,遗失,丢弃,修改或者排队这些包。用Netfilter和在section3.1.1中描述的探听的方法是很相似的;然而,它没有不必要的加在头前面的数据或则依赖ARP的缺点。

比较其他的可能性,这个解决方法有很多优点。这些优点包括没有不必要的通信,具有很高的通用性,很方便的安装和用户层的守护进程能决定在section3中要求的事件。

在另外一方面,这个解决方法的缺点是它需要一个内核模块。然而,一个内核模块相比内核修改而言是很简单的。仅仅只要编辑一个内核模块,而不需要去编辑整个内核。并且内核模块能在任何时候装载和卸载。最后,一个内核模块比内核修改具有更高的通用性,因为它依赖Netfilter接口。这种接口不随内核的更改而改变。

自从Netfilter通过检查策略使其具有最少和最小的重要性缺陷,我们在我们最后的应用结构中利用了它。我们的应用利用了Netfilter的挂接来重定向了包,接受从本机(NF_IP_LOCAL_OUT),从别的机器(NF_IP_PRE_ROUTING),还有所有的被发送到其他机器(NF_IN_POST_ROUTING)的包。这些挂接函数被kAODV内核模块使用。Ip_queue模块是用来在用户层守护进程中对这些包进行排队。这些AODV路由协议守护进程用libipq来对每个包做控制决定。


相关内容