作者:宋嵩,杜文,牛志升,李康
移动通信给人们带来了十分方便的服务,无线局域网作为一种移动接入Internet的方法,逐渐成为研究的热门课题。但是,由于应用日益广泛的多媒体业务数据流量比较大,而无线带宽有限,同时IP 网络基本上是采用点到点尽力型(BestEffort) 服务方式,所以很难有效满足实时多媒体业务的服务质量(Quality of Service)要求。为保证WLAN中多媒体业务的实时传输,需要进行QoS差分,给多媒体业务提供不同服务质量选择。目前,关于多媒体QoS保证的研究普遍采用软件仿真来完成,缺乏实际网络测试。为了验证各种差分算法的可行性,我们开发了一个实时多媒体业务开放式试验平台,实验测试多媒体业务QoS保证调度算法,包括我们自己提出的调度算法。
IPv6扩大了IPv4地址空间,彻底解决了IPv4的地址空间耗尽和路由表爆炸等问题,并且在安全性、移动性以及QoS等方面提供了强有力的支持,而且, 更加合理的IPv6协议包头设计使得路由器在处理数据包时更加快捷。Linux操作系统以其源代码开放、性能高和稳定可靠等优点得到了日益广泛的应用,越来越多的科研项目利用Linux系统作为实验的软件平台。因此,测试平台选择了在IPv6 网络环境下使用Linux操作系统来实现。
IPv6网络环境和L inux实现机制
IPv6对IP4的改进
IPv6继承了IPv4的优点,摒弃了它的缺点。IPv6与IPv4不兼容,但同所有TCP / IP 协议簇中的协议兼容,所以IPv6完全可以取代IPv4。相对于IPv4, IPv6 最大的优点是有足够的地址空间。IPv6的地址是128位,大大增加了可用的地址空间,甚至以后每台家电或者手机都分配一个IP地址都绰绰有余。而且, IPv6 的自动配置地址的功能使得用户配置网络非常简单。
相对于IPv4, IPv6简化了包头格式,包头有8个字段,总长固定为40字节;由于包头长度统一,因此不再需要包头长度字段,并且去除了IPv4 中一些其他字段,可以节省大量网络路由器资源。此外, IPv6 提供了可扩展协议( ExtensibleProtocol),设计更为灵活,去掉选项字段,引入“下一头标”(Next Header)指示IPv6 报头之后的第一个扩展头的类型。
IPv6扩展头也必须携带一个Next Header字段。这样,协议头的结构像一个链表一样可以不断扩展,所以很容易加入新的特性,加强选择功能。
Linux 2. 2以上内核版本,Windows XP Service Pack 1和Windows Server 2003等操作系统都提供对IPv6的支持。
Linux的Netfilter钩子函数
NetFilter是Linux 2. 4内核实现数据包过滤、数据包处理等的功能框架。NetFilter提供了一个抽象、通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统。Netfilter框架包含以下三部分:
1)钩子(Hook) 。Netfiter为IPv6协议定义了5个钩子函数(如表1所示) ,这些钩子函数在数据包流过协议栈的几个关键点被调用。在这几个点中,协议栈将把数据包及钩子函数标号作为参数调用Netfilter的框架。
2) ip tables。内核模块可以对一个或多个钩子进行注册,实现挂接,当某个数据包被传递给Netfilter框架时,内核检测是否有模块对该协议和钩子函数进行了注册。若注册了,则调用该模块注册的回调函数,检查、修改、丢弃该数据包并指示Netfilter将该数据包传入用户空间的队列。
3)用户空间。排队的数据包被传递给用户空间异步地进行处理。一个用户进程能检查、修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数注入内核。
Netfilter实现流程如图1所示。图示指明了Netfilter 5个钩子函数挂载点在Linux内核协议栈中的位置,箭头标明了IP包在包含Netfilter框架的IP层的流向。IP包从最左端进入系统经过校验和版本检查后经过第一个挂载点, 交给NF_IP6_PRE_ROUTING注册的钩子函数进行处理;经过路由选择,决定该数据包需要转发还是发给本机;若该数据包是发给本机的,则经过NF_ IP6_LOCAL_ IN注册的钩子函数处理以后传递给上层协议; 若需要转发,则转至NF_ IP6_FORWARD注册的钩子函数进行处理;所有需要发送到网络的数据包,无论是本机发出的还是转发的,都要经过最后一个钩子函数NF_IP6_POST_ROUTING处理以后,才能发送到网络上。本地网络层以上产生的数据包通过NF_ IP6_LOCAL _OUT注册的钩子函数处理后,才可以进行路由选择,然后由NF_ IP6_POST_ROUTING处的钩子函数处理后发送到网络上。
根据所需要处理的数据包的不同特点,选择合适的挂载点,加入相应的回调处理函数,就可以实现对网络数据包的截获和各种控制。本文测试平台使用Netfilter在NF_ IP6_POST_ROUTING挂载点截获所有网络数据包对其进行调度管理,实现差分QoS机制,保证多媒体业务的实时传输。
实时多媒体业务服务质量保证机制
基于SIP协议的多媒体业务
会话初始协议SIP ( Session Initiation Protocol)是一个基于应用层的控制协议,用来建立、控制维护和终止多媒体会话或呼叫。SIP协议为大范围应用的多媒体通信提供了高级的信令和控制功能,通过少量基于文本的消息包在两个实体之间传递消息, 还在网络中提供代理服务器和重定位服务器来中继和传送消息, 支持多媒体会议、远程学习、Internet会话和多媒体发布等一系列服务。在SIP协议应用中包含两个部分:用户端和网络服务器。用户端可以产生SIP消息包并通过一个或多个网络服务器传送到其他用户端, 用户端之间也可以直接通信。这里使用IPv6下的SIP服务器为用户端建立连接。这样,在进行多媒体通信时,就构成了两类数据包,一类用于管理多媒体业务的信令数据包,一类为用于不同的SIP客户端之间通信时的图像、语音数据。为了保证在网络中多媒体业务的实时传输,给多媒体业务以高优先级进行传输;同时,为了保证多媒体会话可以随时建立,特别给予用于建立连接的信令数据以更高的优先级。这样就形成了三级服务差分的概念,信令、多媒体业务、数据传输,其中SIP服务器的数据为信令数据,具有绝对高优先级,多媒体业务和数据传输分别具有高优先级和低优先级。
差分QoS调度
先入先出( FIFO)排队法是指先到达的分组先被发送,这和处理机任务调度的F IFO算法思想是一致的。系统每次发送位于等待队列头部的分组,新到的分组则加到队列的尾部。当一个新的分组到达而缓存已满时,就需要一个丢弃策略来决定丢弃分组。这里,使用队尾丢弃(Drop Tail)策略, 丢弃最新到达的分组。根据使用SIP服务器在IP网络中进行多媒体通信时的三种数据包划分三种不同的优先级,设置三个不同队列,如图2所示。
其中,用于建立实时业务连接的信令数据包,具有绝对高优先级,对应接入队列0,系统检测到之后,直接转发,以保证实时通信业务可以随时建立。SIP客户端进行多媒体通信的数据具有高优先级,对应接入队列1;普通数据具有地优先级,对应接入队列2。接入队列1和2中的数据包都将等待系统转发。系统每次进入时间中断进行数据包发送时,都先检查高优先级的接入队列1,如果队列中有数据包等待则转发、退出;如果队列为空,则检查接入队列2执行相同的操作。这样,多媒体业务会话就可以随时建立,并进行有服务质量保证的实时传输。
测试平台的设计与实现
测试平台拓扑结构
测试平台由六台计算机、一个AP和一个Hub组成,拓扑结构如图3所示。测试网络由一个无线局域网和一个有线局域网组成,两个子网间的数据通过路由器(计算机F)来转发。数据通过路由器时,路由器将其截获,然后根据不同的优先级确定数据转发的顺序等,实现差分QoS调度。
图3中计算机F装有双网卡,配置为路由器,同时运行差分QoS调度算法,是测试平台的核心部件。无线局域网由AP来组成,有两个无线终端A和B。有线局域网中有两台计算机C和D。在A和C之间建立VoIP传输会话( Session) 1, 被赋予高优先级。在B和D之间建立数据传输会话2,被赋予低优先级。计算机E为SIP服务器,用于在两个计算机终端上创建视频会话。
测试平台网络配置
所有实现都在IPv6 下进行,路由器和SIP服务器运行Red Hat L inux 9操作系统,其他计算机终端运行Windows XP操作系统。无线局域网网络前缀为3ffe: 327d: 8: 810: : /64,有线局域网网络前缀为3ffe: 327d: 8: 811: : /64。
计算机F为路由器,无线和有线网络中IPv6地址分别为3ffe: 327d: 8: 810: : 1 /64和3ffe: 327d: 8: 811: : 1 /64,并且开启路由功能,实现无线网络和有线网络的连接。网络配置方法为:
ifconfig eth0 add 3ffe: 327d: 8: 810: : 1 /64
#添加IPv6地址
ifconfig eth1 add 3ffe: 327d: 8: 811: : 1 /64
echo 1 》 /p roc / sys/ net/ ipv6 / conf / all/ forwarding
#开启IPv6路由功能
计算机E作为SIP服务器,除设定IPv6地址之外,还需要为其配置默认路由,以便不仅可以为本子网内的主机提供服务,而且可以为其他子网的主机提供服务。SIP服务器的IPv6地址为3ffe: 327d: 8: 811:: 111 /64, 默认路由为3ffe:
327d: 8: 811: : 1 /64。设置方法如下:
ifconfig eth0 add 3ffe: 327d: 8: 811: : 1 /64
#添加IPv6地址
route - A inet6 add : : /0 gw 3ffe: 327d: 8: 811:: 1 /64
#添加默认路由
计算机A和C的IP地址分别为3ffe: 327d: 8: 810: : 5 /64和3ffe: 327d: 8: 810: : 7 /64,默认路由为3ffe: 327d: 8: 810: : 1 /64。计算机B和D的IP地址分别为3ffe: 327d: 8: 811: : 4 /64和3ffe: 327d: 8: 811: : 8 /64,默认路由为3ffe: 327d: 8: 811: : 1 /64。计算机A~D运行Windows XP操作系统, IPv6配置方法与在Linux下有所不同。计算机A的配置方法为在命令行下使用命令:
ipv6 adu 4 /3ffe: 327d: 8: 810:: 5
#设定IPv6地址
ipv6 rtu 3ffe: 327d: 8: 810:: /64
#指定网络前缀
ipv6 rtu :: /0 4 /3ffe: 327d: 8: 810: : 1
#设置默认路由
计算机B~D配置方法同上,只是将相应的IPv6地址和默认路由作些改动即可。
Linux可加载内核模块编程
测试平台使用Linux可加载内核模块(Loadable KernelModule, LKM)来实现差分QoS调度。模块(Module)是内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核取下,动态扩展内核的功能。动态可加载内核模块的目标代码一旦链接到内核,作用和静态链接的内核目标代码完全等价。
每个LKM至少由两个基本的函数组成,一个是用于初始化所有的数据的函数init_module (),一个是用于清除数据从而能安全地退出的函数cleanup_module ()。为了在模块中使用Netfitler的钩子函数,需要在初始化函数中调用nf_register_hook ()函数注册Netfiter Hook, 在清除函数中调用nf _unregister_hook ()函数注销Netfiter Hook。具体过程如下:
/ /定义并填充用于注册函数的数据结构
static struct nf_hook_op s post_route = {
{NULL, NULL},
DiffSev_post_route, / /处理函数
PF_ INET6, / /使用IPv6协议NF_ IP6_POST_ROUTING,
/ /使用IPv6的第一个Hook
NF_ IP6_PR I_F IRST,
/ /让自己的函数首先执行
};
/ /初始化程序
int init_module ()
{**
nf_register_hook (&post_route) ;
/ /注册Netfiter Hook
return 0;
}
/ /清除程序
void cleanup_module ()
{
**
nf_unregister_hook (&post_route) ;
/ /注销Netfiter Hook
return;
}
注册钩子函数后,需要编写处理函数,对截获的数据包进行处理。模块获取数据包后,判断其优先级,然后根据放入不同的队列,进行业务差分的调度,保证实时业务的服务质量。模块在完成对数据包的操作之后,可以返回下列预定义的Netfiter返回之中的一个。
其中,最为常用的为前三个返回值。NF_DROP的含义是该数据包将被完全丢弃,所有为它分配的资源都应当被释放。NF_ACCEP返回值告诉Netfilter到目前为止,该数据包还是被接受的并且该数据包应当被递交到网络堆栈的下一个阶段。NF_STOLEN告诉Netfilter“忘掉”这个数据包。这里告诉Netfilter的是:该hook函数将从此开始对数据包的处理,并且Netfilter应当放弃对该数据包做任何的处理。但是,这并不意味着该数据包的资源已经被释放。这个数据包以及它独自的sk_buff数据结构仍然有效,只是hook函数从Netfilter获取了该数据包的所有权。
程序中对数据判断时,首先有一个对SIP服务器数据的处理,模块对截获数据包的源地址和目的地址进行检查,只要是发往和来自SIP的数据都将被无条件返回,返回值为NF_ACCEPT。这样用作会话连接建立服务器的数据被看作是网络信令数据,获得绝对的高优先级,保证了不同主机之间可以随时建立连接。为了简化操作,这里我们只比较IPv6地址的最后32位来判断。以下为数据包处理函数片断:
unsigned intVowlan_post_route (unsigned int hooknum, struct sk_buff
3 3 skb, const struct net_device 3 in, const struct net_device 3
out, int (3 okfn)( struct sk_buff 3 ) )
{
struct ipv6hdr 3 ipv6h = (3 skb) - 》 nh. ipv6h;
struct in6_addr saddr = ipv6h - 》 saddr;
struct in6_addr daddr = ipv6h - 》 daddr;
int p rio = addr_belong(daddr) ;
/ /SIP服务器数据,不进行处理,直接返回,具有绝对高优先级
if ( saddr. s6_addr32 [3 ] = = 0x11010000) return NF_ACCEPT;
if (daddr. s6_addr32 [3 ] = = 0x11010000) return NF_ACCEPT;
**/ /区分QoS, 将数据插入不同的队列
switch (p rio) {
case H IGH_PR IOR ITY: {
sendbuffer_insert(3 skb, H IGH_PR IOR ITY) ;
/ /加入高优先级队列
return NF_STOLEN;
}
case LOW_PR IOR ITY: {
sendbuffer_insert (3 skb, LOW_PR IOR ITY) ;
/ /加入低优先级队列
return NF_STOLEN; }
return NF_ACCEPT;
}
被加入不同优先级队列的数据包将被按照上一节中提到的调度算法被转发,因为本文旨在介绍开放式的试验平台,所以具体调度算法的程序实现不再赘述。
编译内核模块,将生成的DiffServ. o作为一个内核模块插入系统,此模块可以象其他系统模块一样进行后台运行。当内核模块不再需要时,可以使用命令将其卸载。相应命令分别如下:
insmod DiffServ. o / /加载内核模块
rmmod DiffServ / /卸载内核模块
实验演示结果
延时性能测试
首先让会话1运行多媒体视频业务,赋予高优先级;会话2运行FTP数据传输业务,赋予低优先级。开启优先级调度算法,使用IPv6下的Ping命令测定不同优先级业务的通信延时情况。考虑程序开销等因素,测得高优先级的会话1延时为11ms~230ms,低优先级的会话2延时为40ms~359 7ms。很显然,高优先级的多媒体业务由于被赋予了高的优先级而得到了更好的服务质量。
多媒体业务通信演示
为了便于观察算法调度效果,两个会话都用来传输视频业务,改变优先级,观察效果。先给两个会话赋予相同的优先级。这时两个会话发起连接呼叫,由于SIP服务器被赋予了绝对高优先级,所以呼叫总能顺利完成,两个会话建立连接。由于程序开销等因素,建立连接后两个视频会话在通信时,都会有一些数据丢失引起的不连续现象。这时,将会话1调整为高优先级,会话2调整为低优先级,可以看到会话1视频变得十分流畅,但是会话2的通信效果变得更差。效果如图4所示,其中a为会话1效果, b为会话2效果,图中有一只鸟在飞,当鸟飞到白色标杆处时,会话2由于数据丢失,左侧不远处还有鸟的影子,而会话1由于优先级比较高,所以比较流畅,画面比较清晰。
调整两个会话的优先级,将会话2调整为高优先级,会话1调整为低优先级,这时看到会话2视频变得十分流畅,但是会话1的通信效果变得较差。再切换优先级,反复进行实验,可以得到相同的效果,高优先级的业务可以得到好的服务质量,也就是说,可以通过优先级设置来保证实时业务的传输。
结语
为了进行实时多媒体业务QoS的研究,本文使用Linux操作系统基于IPv6设计并实现了的测试平台。测试平台使用NetFilter截获数据包,然后根据具体算法对网络数据包进行调度,实现QoS改善策略。测试平台使用Linux的动态可加载模块技术,以模块的形式作为Linux系统的一部分来运行,所以效率较高,维护方便。实验表明,测试平台工作稳定,可以很好地支持QoS算法的测试,同时,测试平台有良好的开放性,很容易在其基础上验证其他的算法、方案,对于实时多媒体业务QoS研究测试有十分重要的意义。