基于Linux的RTP流检测识别算法研究

2013-11-30 05:01杨瑞光刘玉军山秀明乔杰华
计算机工程与设计 2013年1期
关键词:数据包端口数值

杨瑞光,刘玉军,山秀明,乔杰华

(1.清华大学 电子工程系,北京100084;2.装甲兵工程学院 信息工程系,北京100072)

0 引 言

多媒体在网络传输中大量采用基于流媒体协议的数据传输服务。目前流媒体数据传输较多的是RTP/RTCP[1]。文献[2]提出一种应用协议识别算法,根据网络流概念,在网络层建立应用协议特征的描述方法,采用主成分分析方法来确定网络流特征属性的主要成分,所提方法能够准确识别目前网络中常用的应用协议,识别准确率较高。文献[3]设计了一个对多种协议具有可扩展性的应用层协议过滤系统。该系统在高速报文数据捕获和报文过滤子系统基础上,对捕获的原始数据报文进行IP分组和传输层的重组,运用应用层协议识别技术对应用层数据包进行分析、识别。文献[4]提出一种基于正则表达式的应用层协议识别方法。该方法也是一种基于内容的检测方法,其采用正则表达式描述协议应用层数据的特征,然后再报文体内容中寻找匹配项以确定报文所属的整个流所属的应用类型。文献[5]Nguyen等学者提出基于网络流特征数据进行机器学习的方法来进行网络流识别。文献[6]研究表明即使传输层荷载被加密,基于网络流特征数据进行机器学习的方法依旧能够有效地进行网络流识别。但是流识别需要参考数据流的全局信息。文献[7]通过总结网络流识别技术,并对RTP协议的特征进行具体分析,提出基于信令协议解析与协议特征两种不同策略的识别算法,并用实验的方式对此两种算法进行对比与验证。证明该两种算法都能在一定精度要求和性能要求的前提下对RTP协议流进行识别,为本文识别算法研究提供了很好的参考依据。

上述文献采用不同的方法实现了流媒体数据包的识别,但对数据包检测识别准确率和转发速率研究还有待于进一步提高,成为制约多媒体数据传输QoS的一个关键因素。

虽然通过Linux/Netfilter规则匹配可以识别RTP包,但是Netfilter只对地址和端口进行简单的规则匹配,不能直接识别RTP流承载的信息,过滤结果粗略且不精确,甚至可能造成安全漏洞。Netfilter规则定制需要手工配置,灵活性较差。本文通过对RTP协议分析,设计相应的识别算法,在Netfilter框架中开发相应的专用匹配模块来实现对UDP承载的RTP包进行自动检测识别。

1 Linux/Netfilter

Netfilter在Linux内核中运行,优先级较高,对提高检测识别效率及数据包的转发速度十分有利。Netfilter结构可实现数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换,以及基于用户及媒体访问控制地址的过滤和基于状态的过滤、包速率限制等许多功能[8]。Netfilter/IPtables提供了一个功能扩展框架,允许开发人员按照其规定的接口开发程序并以模块的形式加载到Netfilter体系中,通过它可以让用户编辑内核过滤规则,IPtables共有3张表(filter,nat,mangle)和5个链(INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING),每个链都有其特定的作用。

当网络数据包进入协议栈后,将被交由Netfilter按序与其规则链中的规则逐一进行匹配,当某一条规则与数据包匹配成功后,则按规则所指定的方式来处理数据包。每一个规则由链名、匹配、目的等要素组成,用户可通过IPtables来对规则进行添加、删除、修改等配置操作,并将操作传递给Netfilter。

本文主要是根据Netfilter/IPtables程序开发规则,设计了针对RTP协议的匹配算法以及用于与用户交互的控制模块,插入在filter表的forward链。

2 基于协议分析的RTP流检测识别算法设计

在流媒体数据中,待传输的声音和视频数据被封装在RTP数据包中,每个RTP数据包被封装在UDP消息段中,然后再封装在IP数据包中。

图1 RTP包头结构

RTP包头结构如图1所示,本算法关注的域如下[9]:

版本(Ver):2bit,RTP的版本,值是2。

负载类型(PT):7bit,定义了有效载荷的格式。其有效负载号对应相应的编码名称,部分负载号使用非RTP方式来动态定义,在同一RTP流当中,RTP负载类型是不变的。通过负载类型可以获得流媒体数据的编码方式,从而在接收端进行快速解码。

序列号(SN):16bit,序列号初始数值一个随机数,但相邻的RTP数据包SN有其变化规律,后前一包比前一包序列号加一,可以根据SN变化规律来判断检测丢包和重建包。

时间戳(TS):32bit,时间戳记录RTP数据包的抽样时间值。其初始值也是一个随机数,可以作为判断RTP流的一个重要依据。

SSRC:32bit,用来标识RTP信息包流的起源,在RTP会话或者期间的每个信息包流都有一个清楚的SSRC,SSRC不是发送端的IP地址,而是在新的信息包流开始时源端一个随机数。

对RTP协议的分析,可以总结的 “流特征”如下[10]:

(1)RTP的版本号Ver数值为2;

(2)在同一RTP会话中中,其有效载荷PT值为固定值;

(3)RTP会话中的SN值为递增,后一包比前一包增加数值 “1”;

(4)RTP会话中Timestamp递增数值有其变化规律;

(5)同一流媒体会话中RTP流的SSRC值为固定值。

RTP流的检测识别是根据上述流特征分析展开,通过对数据包中特征字段的判断来确定需要转发的数据包,从而实现RTP数据包检测识别和转发。

2.1 RTP流特征的初步判定

对数据包的初步判定是利用RTP协议基本特性作为判断依据,通过对RTP包的特征属性及特定位域数值的比对,初步过滤出可能的RTP报文。对于这些特性的判别基本上是静态的数值检测。

(1)UDP数据包类型检测:RTP/UDP数据传输是流媒体数据传输的主要方式,由于本文设计的算法是针对基于UDP承载的数据传输,因此,首先判断IP包是否承载UDP包。

(2)包长度有效性验证:参照RTP数据包包头,对于一个正常包含有VER、TS和SSRC等字段的有效RTP包来说,其UDP承载包的有效负载长度至少需要12个字节。

(3)VER字段匹配:这可以作为一条判别的标准,检测UDP载荷数据前两个比特是否是二进制 “10”,即是否与现行的RTP版本号相同(RTP的版本号是2)。

2.2 流特征精确识别RTP会话

对RTP的精确识别是在对RTP包进行初步判定的基础上对数据流中动态变化的数据字段分析,并从中寻找存在的变化规律。依据数据流变化的规律性,来检测变化的相关值。在同一次的RTP通信中包类型、包长度和Ver数值具有固定特性,这对RTP包判别提供了依据,但是仅仅判断这些数值是不能准确识别RTP流。RTP包头信息中SSRC、SN、TS的数值是在会话建立之初动态生成且有些在会话进行中将发生变化,但存在一定的规律性,能够为更准确对RTP流检测识别提供依据,需建立针对RTP会话级(动态)的信息可进行检测的机制。

RTP会话特征信息对于不同的RTP会话连接完全独立,仅在当次会话期间有效并存在一定的规律。检测数据包是否满足会话特征条件,首先需获取其所在会话的相关状态信息作为参照比对标准。开辟缓存并从处于同一会话连接的历史数据包中抽取会话信息保存其中是获取当前会话信息的有效途径。

(1)检测报文的地址和端口

一般情况下,流媒体应用程序在进行RTP会话时会使用一些特殊的端口(对)进行通信(如:5004和5005),如果仅利用这些简单的通用特征作为判别标准显然存在相当大的误判概率。对于同一次RTP流会话,其数据报文应具有相同的源地址(端口)和目的地址(端口),还要RTP会话期的时效性进行判断,可以将收到的数据包中这些相关信息暂存入缓存,作为后续数据包判别的标准。同时,这种对端口地址加会话时效的动态检测处理方式能够让检测程序更加准确,在使用时不必像大多数的过滤程序(包括Netfilter本身)那样需提前根据特定情况来手工配置指定地址和端口的过滤规则。

(2)判断PT、SSRC字段

通常,在同一个RTP会话中,负载类型PT值依赖于传输的媒体数据类型且保持不变,即同一流媒体数据包RTP头的9~15b值是恒定的。再者,对于同一次RTP会话虽然作为源标识符的SSRC是定值,但其值是在会话建立之初由发送方生成的随机数。与地址端口相同,PT和SSRC具有会话期内的时效性,也应存入缓存,作为下一次检测后续数据包对应的数值是否恒定的标准。

(3)检测SN

从RTP的定义可知如果RTP数据包按顺序接收,则相邻的RTP数据包的SN应该以 “1”的步长线性增长,即:SNn-SNn-1=1,n>0。可见SN具有动态延续性特征,需要利用缓存中的历史数据进行检测。

(4)检测 TS

前后两个数据包的timestamp也应该以时钟分辨率(time resolution)线性增长,即;TSn+1-TSn=TSn-TSn-1=time resolution,n>1;TS的值与SN相同,其检测也需要依据缓存历史数据。

理想情况下数据包应当按照发送顺序依次被接收,对应的SN、TS数值也应该是线性递增的,且数值为 “1”。但是由于网络传输的原因,在数据包接收时可能会出现RTP包的乱序和丢包。一旦出现数据包的乱序和丢包,就会在进行RTP检查过程中因SN、TS的递增数值可能不等于步长值而造成误判。

针对RTP流中的乱序和丢包,对SN、TS的递增数值采用阈值优化。设置一个可以容忍的最大阈值,只要当前检测的数据包与前一个数据包的SN、TS的递增数值处于一个可以接受的最大阈值之内,则认为对SN和TS的检测符合条件。即:︱SNn-SNn-1︱≤max_sn,n>0;︱TSn-TSn-1︱≤max_ts,n>1。

2.3 RTP识别算法流程及优化设计

算法设计思路,对于收到的数据包,首先进行包类型、包长度等条件的快速初步判定,满足条件后,再与缓存中的历史数据进行比较验证以作精确判定。

检测判别算法基本流程如图2所示,当数据包与缓存对象进行比对时,如果缓存对象与数据包的源地址、目的地址、源端口和目的端口不匹配,此时不是直接判断RTP包,而是转至缓存列表,再取一个缓存对象进行匹配检查,因为缓存中的数据包源地址、目标地址、源端口和目标端口一般都不是唯一的。在检查数据包PT、SSRC的数值和SN、TS递增数值时,如果不匹配则是判断非RTP包,此时对于同一真正的RTP流来说,其数值是不变的。由以上分析我们可以发现,当第一个数据包到达时,缓存中没有可取对象,从而生成新的缓存对象放入缓存,并且不认为它是一个RTP包,不对其进行匹配判断。

除充分考虑RTP流识别的准确性外,还要提高算法的判别速度。设计上从以下3方面来考虑算法优化:

(1)建立静态缓存。缓存开辟通常有动态缓存和静态缓存两种方式。动态缓存虽然灵活性较好,但在程序运行时因需要对缓存区进行多次创建和销毁,同时对缓存进行遍历查找等操作时相比静态方式运算量和开销较大,复杂度较高。另一方面,从实际考虑,也不能无限制的开辟缓存,需要考虑开辟缓存区大小的问题。根据RTP流特征和实际需求,我们使用静态缓存。

(2)判定过期缓存。因为选用的静态缓存方式,其大小是恒定的。在缓存空间有限情况下,为了充分利用缓存空间,提高数据包的比对效率,实现RTP流的快速转发,我们在数据包存放缓存中时,标记一个时间戳,用以判定缓存数据数据是否有效以及是否为可用缓存。

(3)取消网络字节序转换。考虑到无需将数据包的地址和端口信息展现给用户,同时不会影响比对效果,缓存中数据包的源地址、目的地址、源端口、目的端口数据直接以网络字节序的方式存放,而不再转换为主机字节序。直接以网络字节序数值进行比对,可节省时间开销。

3 RTP流自动检测识别算法实现

图2 RTP包检测算法流程

依照上一节的识别算法的设计,下面定义两个特定的数据结构存放可能的RTP数据包,作为后续数据包进行精确判定的依据。

struct_rtpbuffer{ /*缓冲区结构定义*/

unsigned long ul_prev_jiffy; /*数据包到达缓存的时间戳*/

在数据结构 “_rtpbuffer”中使用 “ul_prev_jiffy”成员表示缓存对象对应的数据包到达主机的时间截,该值取自Linux系统运行时间。当有新的数据包到达时,程序都将从系统取出一个时间值作为当前时间值,若该数据包满足初步判定条件(静态值判定)而需要与缓存对象进行逐一比对作精确判定时,首先将缓存对象的 “ul_prev_jiffy”与当前时间值进行比较,如果差值超过定义的阈值则认为该缓存对象已过期失效而继续取出下一缓存对象直到找出有效对象再作匹配检测。容易理解,过期的缓存空间即是处于空闲状态的可用缓存,因而缓存区在初始化时应当将所有缓存对象的 “ul_prev_jiffy”值置为最小值 “0”。

此外,按照算法设计当数据包被判定为可能的RTP包时,应从缓存中取出一个空闲缓存以存放其对应的缓存对象(假设此时缓存区有空闲缓存),即需要再遍历整个缓存区查找空闲缓存。实际上当发现缓存中没有对象与数据包进行匹配时,程序已经完成了一次缓存的遍历操作,因而在程序实现时为了提高程序运行效率,可以在做循环比对的同时,将发现的空闲缓存记录下来以供后续操作使用,提高运行效率。

程序运行使用时,通过IPtables向Netfilter增加一个用于识别RTP流的规则,即让Netfilter加载自行开发的规则模块,模块首先向Netfilter注册并在内核中开辟相应的静态缓存区。当一个新的数据包到达时,按照图2的流程比对数据包中的特征数值,当检查数据包的当数据包和程序的检测规则匹配完成后,缓存区内数据包的prev_jiffy变为当前时间戳(now),rtphdr标识为rtp包头,检测程序提交Netfilter,识别出RTP流并快速转发出去。

4 算法验证

测试环境:一台装有Linux的计算机作为过滤网关(简称网关),本文设计程序部署在该网关上,通过IPtables配置相关规则让Netfilter加载并运行针对RTP进行过滤的模块程序。另有两台装有Windows XP的台式机来作为RTP流媒体数据发送和接收的终端。发送端组织RTP流,接收端记录RTP数据包传输的数据包数目、传输时间等参数作为比对的标准数据。

测试步骤:

(1)使用两台终端计算机(Windows XP系统)构建常规RTP数据包发送与接收环境,使用Winpacp抓包程序记录5种不同编码格式的媒体文件中RTP流传输的数据包数目、传输时间作为比对的标准数据;

(2)将网关架设于两台终端之间,运用传统识别算法检测识别RTP流,传统识别算法主要通过人工预设规则匹配发送端和接收端数据包地址、端口信息,同时匹配检查RTP固定包头中Ver、CC、PT、SN、TS、SSRC六个参数值,来判断是否为RTP包。通过抓取识别到的RTP包记录产生的误判漏判和耗费时间;

(3)对网关使用的优化识别算法,通过设计程序自动检测识别数据包地址、端口以及RTP固定包头中Ver、PT、SN、TS、SSRC五个参数值判断RTP包,记录误判漏判和耗费时间。

依上述测试步骤,分别针对不同编码格式的媒体文件进行5次实验,测试结果对比见表1。

表1 实验结果

从表1中测试结果数据可知,对不同编码格式的媒体文件经RTP编码后,使用两种识别算法分别进行测试,流媒体数据包的误判率和漏判率基本保持不变,而基于RTP流检测识别优化算法明显降低了误判和漏判的概率,缩短了检测识别时间,从而使RTP流的识别更加准确和快速。

在Linux系统内核Netfilter模块中加载匹配模块来设计RTP优化识别算法,优化算法对数据流的识别率达到了一定的要求和精度。针对不同类型的流媒体文件进行实验,更为准确地检测识别出了流媒体数据包中的RTP流,误判率和漏判率明显降低,同时本文的优化算法与现有算法相比明显提高了识别速率。为网络流媒体数据包快速准确识别提供了很好的判断依据。

5 结束语

本文主要通过对流媒体协议RTP/RTCP的分析,在Linux系统Netfilter架构中设计了专用算法,通过检测RTP包中的Ver、PT、SN、TS、SSRC的数值来识别RTP流,实现了RTP流自动检测识别和快速转发,并通过实验验证了识别算法的有效性,对网络流媒体的识别具有积极地意义。在下步工作中,将进一步根据RTP流负载类型识别音视频数据,对传输中音视频数据进行优先级控制,实现流媒体数据的QoS调控。

[1]WANG Yanli,CHEN Ming,CHEN Hua,et al.Design and implementation of a digital video surveillance system based on RTP/RTCP[J].Computer Engineering and Science,2009,31(3):58-65(in Chinese).[王彦丽,陈明,陈华,等.基于RTP/RTCP的数字视频监控系统的设计与实现[J].计算机工程与科学,2009,31(3):58-65.]

[2]XU Li,ZHAO Xi,ZHAO Qunfei,et al.Network application protocol identification based on statistical methods[J].Journal of Xi’an Jiaotong University,2009,43(2):43-47(in Chinese).[徐莉,赵曦,赵群飞,等.利用统计特征的网络应用协议识别方法[J].西安交通大学学报,2009,43(2):43-47.]

[3]CHEN Xianqing.Design and implementation of the application layer protocol filtering system[D].Chengdu:University of E-lectronic Scinence and Technology,2010(in Chinese).[陈献庆.应用层协议过滤系统设计与实现[D].成都:电子科技大学,2010.]

[4]LIU Junchao.Regular expression-based application layer protocol identification technology research[D].Changsha:National University of Defense Technology,2008(in Chinese).[刘俊超.基于正则表达式的应用层协议识别技术研究[D].长沙:国防科技大学,2008.]

[5]Nguyen T T,Armitage G.A survey of techniques for internet traffic classification using machine learning[J].IEEE Commun Surveys Tutorials,2008,10(4):56-76.

[6]Bernaille L,Teixeira R.Early recognition of encrypted applications[G].LNCS 4427:Passive and Active Network Measurement,2007:165-175.

[7]LIU Jiaxiang.Two approaches to RTP flow discriminator[J].Computer Knowledge and Technology,2011,7(4):880-882(in Chinese).[刘佳翔.RTP协议流媒体识别算法的设计与实现[J].电脑知识与技术,2011,7(4):880-882.]

[8]YANG Gang,CHEN Shuyu.Research on Linux firewall based on Netfilter/Iptables[J].Computer Engineering and Design,2007,28(17):4124-4132(in Chinese).[杨 刚,陈蜀宇.Linux中基于Netfilter/Iptables的防火墙研究[J].计算机工程与设计,2007,28(17):4124-4132.]

[9]RFC3550-2003.RTP:A transport protocol for real-time applications[S].

[10]SONG Xue,CAI Yibing,JIN Weixin,et al.Study and implementation of network streaming media recognition algorithm based on winpcap[J].Modern Electronics Technique,2010,(11):108-110(in Chinese).[宋雪,蔡一兵,金伟信,等.基于Winpcap的网络流媒体识别算法研究与实现[J].现代电子技术,2010,(11):108-110.]

猜你喜欢
数据包端口数值
二维隐蔽时间信道构建的研究*
体积占比不同的组合式石蜡相变传热数值模拟
数值大小比较“招招鲜”
一种有源二端口网络参数计算方法
一种端口故障的解决方案
铝合金加筋板焊接温度场和残余应力数值模拟
民用飞机飞行模拟机数据包试飞任务优化结合方法研究
多按键情况下,单片机端口不足的解决方法
C#串口高效可靠的接收方案设计
卫星三端口DC-DC变换器技术综述