基于Linux内核扩展模块的P2P流量控制研究

五、实验方案设计及实现

5.1流量控制系统总体设计

前面章节中分析了Netfilter防火墙框架以及包选择工具Iptables,知道了在Linux内核中有一套强大的防火墙框架Netfilter。但是传统的P2P检测和控制工具主要是对通过基于数据包的端口等进行过滤,从而达到监视网络流量的目的。仅仅是对协议包的包头进行检测而缺乏对数据包内容的检测,这种检测方法的缺陷是缺少对应用层流量的分析,使对协议的分析不够全面,很多时候就很难分辨出正常的HTTP流量和P2P下载的流量区别。为此我们需要开发出一个能够应用层上对流量进行识别和分类的工具。系统的工作流程图如图4所示:

数据流 P2P分类器 (对识别出的流量打上标记) eDonkey Gnutella Fasttrack BT 其他流量 过滤和整形 数据流

图4 Netfilter在IPv4中的结构

5.2 带宽管理的实现

Linux操作系统目前广泛引用于路由设备中,流量管理是它一个重要功能∞71,由于在前面我们已经实现了P2P的流量完全禁止,我们现在就要实现将P2P流量控制在某一个范围内的确功能。为了达到这个目的,我们就必须将前面用到的Linux的内核防火墙框架与Linux的流量整形工具tc相结合,实现对网络内部的带宽管理。

5.2.1 队列规定

我们可以在队列规定当中设置一个允许的最大速率,也就是说通过固定能传输的数据的多少来对流量进行整形。流量整形时传输的速率就被控制在一个范围内,若超出范围则采取延迟或丢包的策略口。

流量管理主要由qdisc(队列规定)class(类别)和filter(过滤器)三种对象控制。

分类的队列规定主要用在多种数据流需要进行区别对待的时候。当数据包进入我们开发的分类器的时候,就被送到设置的队列规定当中。队列中的一些规定是根据整形的分类机制来确定的,数据进入分类器后,会寻找一个符合自己的队列规则。数据寻找到自己的大类之后,又会根据队列规则选择一些小类。分类器就是用来设置一些分类规则的。当所有的分类都完成的时候,也就是说网络中的数据包已经找不到更细微的队列规定的时候,数据包就会进入合适自己的队列进行流量整形。在队列中还学要对队列进行调度,这种调度主要在流量控制中用的比较多。

在本文中主要使用了两种队列规定:

HTB(Hierarchical Token Bucket,分层的令牌桶):这种队列规定主要是使用在针对不同的用途来进行分配。由于这种规定在程序使用上的函数非常少,所以配置起来相对比较简单,所以在运用上比较广泛,尤其是在流量整形中利用的非常频繁。

SF0(Stochastic Fairness Queueing,随机公平队列):随机公平队列使用的是一种公平性的算法,这种队列规定是在非常公平的环境下进行的,这种队列规定的主要优点是在计算的时候的计算机量非常少,但是相比其它的队列算法,精确度不是很高。

5.2.2 Linux流量控制机制

图5描述了Linux内核进行数据包调度的流程。 Userspace program Ip stack Egress classifier Forwardin

图5 Linux系统的流量管理机制

Qdisc1 Ingress qdise Qdisc2 Qdisc3

图中整个大方框表示整个内核。最左面的箭头表示从网络接口进入机器的数据包。可能被丢弃的过滤器的一些数据要求进入队列。如果包被发送到相应的进程和区域的流量,如果数据包经过并提交本地进程。中继器都必须送交出口。进程发送数据的出口本地分类。

在数据在网络上的流动过程中,一些排队的数据可提供队列中排队。没有任何设置,只要求疏散队列的数据包并总是在是接收。数据包队列中,我们有队列规定来处理等待发送的网路卡的核心。在上面的箭头代表的不了所有上述情况,但这一计划,如果该卡

>>闁诲繒鍋炲ú鏍閹达箑绀傞柕濠忛檮閻庯拷<<
12@gma联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4