基于索引分簇的网络协议特征匹配方法转让专利

申请号 : CN201511028457.4

文献号 : CN105515917B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 孙一品陈曙晖庞立会王飞钟求喜张博锋刘宇靖闫晓明

申请人 : 中国人民解放军国防科学技术大学

摘要 :

本发明公开了基于索引分簇的网络协议特征匹配方法,目的是优化设计载荷特征与协议识别规则的关联关系,提高规则匹配性能。技术方案是第一步预处理,输入协议识别规则集合,建立深度报文检查索引分簇和固定位置引分簇;第二步深度报文检查;采用当前主流的深度报文匹配引擎遍历检查网络报文的报文载荷中是否包含字符串集合中字符串,输出命中结果;第三步规则匹配;首先,借助深度报文检查索引分簇表,重构深度报文检查引擎返回的命中结果,其次,对深度报文检查特征串索引分簇的规则进行匹配,然后对固定位置索引分簇的规则进行匹配。本发明相比于目前基于报文深度检查的协议识别方法,显著减少了协议规则的匹配次数,提高了协议识别的性能。

权利要求 :

1.基于索引分簇的网络协议特征匹配方法,其特征在于包含以下步骤:第一步,预处理,流程如下:

步骤1.1建立深度报文检查索引分簇;输入协议识别规则集合R,从协议识别规则的载荷特征中提取深度报文检查字符串集合D,针对每条规则按照长度优先原则筛选深度报文检查字符串作为索引要素,建立深度报文检查索引分簇表A,记录规则处理状态B[N]及未处理规则数Y,Y为整数;

其中变量定义如下:

协议识别规则集合R,R中包含N条协议规则,N为整数;记Ri表示第i条协议规则,Ri包含Mi个载荷特征,ri,j为Ri第j个载荷特征,1≤i≤N,1≤j≤Mi,i、j、Mi均为整数;载荷特征包含字符串和固定位置两个元素,记ri,j=,其中,string[K]表示长度为K的字符串,令stringk表示ri,j中第k个字符,1≤k≤K,k、K均为整数;令offset表示固定位置要求,若offset等于-1,则ri,j为浮动位置串;通过ri,j.string[K]访问ri,j中的string[K],通过ri,j.offset访问ri,j中的offset;

深度报文检查字符串集合D初始值为空,D中不包含重复字符串;

载荷特征映射表S[N][M]为N行M列矩阵,S[N][M]初始值为全0,Si,j表示协议规则Ri的载荷特征ri,j在集合D中的编号,若Si,j等于0,说明ri,j的字符串ri,j.string[K]不属于集合D;

深度报文检查索引分簇表A,Ad表示D中第d个字符串的描述信息,d为整数,Ad包含4部分信息,记Ad=,其中:●float为浮动位置标记,若float等于1,表示Ad字符串属于浮动位置载荷特征,通过Ad.float访问Ad的float元素;

●location[P]表示长度为P的固定位置向量,若locationp等于1,说明Ad来自某个固定位置载荷特征,且该固定位置特征载荷的offset等于p,1≤p≤P,p、P均为整数,通过Ad.locationp访问Ad的locationp元素;

●index为索引标记,若index等于1,表示Ad为某协议规则的索引要素,通过Ad.index访问Ad的index元素;

●rule[L]为长度为L的向量,其中存储Ad作为索引要素的协议规则的编号,通过Ad.rule[L]访问Ad的rule[L]元素,通过Ad.rulel访问Ad的rulel元素,1≤l≤L,l为整数;

固定位置索引分簇表F,Ff表示第f个固定位置索引,包含2部分信息,记Ff=,f为整数,其中:●offset表示Ff所在的偏移位置,采用索引偏移位置为offset的字节为索引,通过Ff.offset访问Ff的offset元素;

●rule[Row][L]为ROW行L列矩阵,存储对应该字节的ROW种取值的协议识别规则编号,其中ruler,s表示编号等于ruler,s的协议规则包含某个固定位置特征,该固定位置特征要求偏移位置为offset的字节取值等于r,1≤r≤256,1≤s≤L,r、s均为整数,通过Ff.rule[ROW][L]访问Ff的rule[ROW][L]元素,ROW≥256;

协议识别规则处理状态向量B[N],初始值为全0,Bi标记第i条协议识别规则Ri的处理状态,若Bi等于0,表明该规则尚未处理,若Bi等于1,表明该规则已完成索引分簇;

一条规则最多包含M个载荷特征,一个索引要素最多关联L条规则,报文数据载荷的最大长度为P字节,M、L、P均为整数;

步骤1.2建立固定位置索引分簇;输入协议识别规则集合R,针对未处理的协议识别规则,按照信息熵评估结果选择固定位置载荷作为索引要素,建立固定位置索引分簇表F,记录规则处理状态B[N]及未处理规则数Y;

第二步,深度报文检查,流程如下:向深度报文检查引擎输入深度报文检查字符串集合D、网络报文;深度报文检查引擎遍历检查网络报文的报文载荷DATA中是否包含D中字符串,输出命中结果Result,Result中包含rnum个命中结果,其中第ci个命中结果Resultci=,分别通过Resultci.offset、Resultci.id访问offset和id元素,其中Resultci.offset表示命中位置,Resultci.id表示命中的字符串编号;Result按照offset从小到大排序,ci、rnum均为正整数,1≤ci≤rnum;

第三步,规则匹配,流程如下:

步骤3.1深度报文检查结果重构;根据深度报文检查索引分簇表A,将命中结果Result筛选和重构,提取命中结果中包含的深度报文检查索引要素编号,构成索引要素命中队列HIT,及字符串命中明细表C,其中HIThi表示第hi个索引要素编号,Cck表示集合D中第ck个字符串的命中位置列表,采用链表结构存储,Cck,cz表示链表Cck中存储的第cz个命中位置,hi、ck、cz均为正整数;

步骤3.2深度报文检查索引类规则匹配;根据索引要素命中队列HIT中记录的字符串编号遍历相关规则;

步骤3.3固定位置类索引规则匹配;根据固定位置索引分簇表F遍历相关规则,输出命中的协议规则编号,结束。

2.如权利要求1所述的基于索引分簇的网络协议特征匹配方法,其特征在于所述步骤

1.1建立深度报文检查索引分簇,包括以下步骤:

1.1.1遍历协议识别规则的载荷特征,将浮动位置特征的字符串及固定位置长度大于阈值W的字符串加入集合D,得到集合D,W为正整数;具体步骤为:

1.1.1.1清空集合D;

1.1.1.2令循环变量ii=1;

1.1.1.3读取协议规则Rii,提取载荷特征个数Mii;遍历Rii的载荷特征,将浮动位置特征的字符串及固定位置长度大于W的字符串加入集合D;流程如下:

1.1.1.3.1循环变量jj置为1;

1.1.1.3.2读取Rii的第jj个载荷特征rii,jj=

1.1.1.3.3如果offset等于-1,说明rii,jj为浮动位置串,则将rii,jj.string[K]添加到D,跳转至1.1.1.3.5;否则,offset不等于-1,说明rii,jj为固定位置特征字符串,进入

1.1.1.3.4;

1.1.1.3.4如果K大于W,则将rii,jj.string[K]添加到D;

1.1.1.3.5循环变量jj增1;

1.1.1.3.6如果循环变量jj不等于Mii+1,跳转至1.1.1.3.2;否则,进入到1.1.1.4;

1.1.1.4循环变量ii增1;

1.1.1.5如果循环变量ii不等于N+1,跳转至1.1.1.3;否则,进入1.1.2;

1.1.2遍历协议识别规则的载荷特征,若载荷特征的字符串属于集合D,则填写载荷特征映射表S[N][M]及深度报文检查索引分簇表A;协议识别规则Ri包含Mi个载荷特征,记其中Mi’个载荷特征的字符串属于集合D,Mi’为整数,Mi’≤Mi;若Mi’≥1,则规则Ri属于深度报文检查索引分簇,将规则Ri的Mi’个载荷特征中的最长字符串作为Ri的索引要素;流程如下:

1.1.2.1清空载荷特征映射表S[N][M]、深度报文检查索引分簇表A、协议识别规则处理状态向量B[N],令Y=N;

1.1.2.2令循环变量iii=1;

1.1.2.3读取协议规则Riii,提取载荷特征个数Miii;遍历Riii的载荷特征,若载荷特征的字符串属于集合D,则标记S[N][M]及A,记录属于集合D的最长字串编号max_id及长度max_len,max_id、max_len为正整数;流程如下:

1.1.2.3.1max_len置为-1;

1.1.2.3.2循环变量jjj置为1;

1.1.2.3.3读取Riii的第jjj个载荷特征riii,jjj=

1.1.2.3.4在集合D中查找字符串riii,jjj.string[K],若找不到,说明字符串riii,jjj.string[K]不属于集合D,跳转至1.1.2.3.9;若找到,说明字符串riii,jjj.string[K]属于集合D,进入1.1.2.3.5;

1.1.2.3.5令临时变量id记录字符串riii,jjj.string[K]在集合D中编号;

1.1.2.3.6填写协议识别规则载荷特征映射表S[N][M],方法是:Si,j=id;

1.1.2.3.7如果riii,jjj.string[K]的长度K大于max_len,则更新max_id、max_len的值:max_len=K,max_id=id;

1.1.2.3.8若riii,jjj.offset等于-1,记录D中编号为id的字符串属于浮动位置特征,方法是:Aid.float=1;若riii,jjj.offset不等于-1,记录该固定位置特征对D中编号为id的字符串的位置要求,方法是:令临时变量kk=riii,jjj.offset,Aid.locationkk=1;

1.1.2.3.9循环变量jjj增1;

1.1.2.3.10如果循环变量jjj不等于Miii+1,跳转至1.1.2.3.3;否则,进入1.1.2.4;

1.1.2.4如果max_len等于-1,转1.1.2.7;否则,进入1.1.2.5;

1.1.2.5选择集合D中编号为max_id的字符串作为规则Ri的索引要素,将规则编号iii插入至Amax_id.rule[L],方法是:令变量kkk从1递增,若首次出现Amax_id.rulekkk等于零,则Amax_id.rulekkk置为iii,即完成将规则编号iii插入至Amax_id.rule[L],进入1.1.2.6;

1.1.2.6至此规则Riii完成深度报文检查索引分簇,更新Biii、Y的值:Biii=1,Y=Y-1;

1.1.2.7循环变量iii增1;

1.1.2.8如果循环变量iii不等于N+1,跳转至1.1.2.3;否则,结束。

3.如权利要求2所述的基于索引分簇的网络协议特征匹配方法,其特征在于所述1.1.1中定义阈值W优选为3。

4.如权利要求1所述的基于索引分簇的网络协议特征匹配方法,其特征在于所述步骤

1.2建立固定位置引分簇,包括以下步骤:

1.2.1清空固定位置索引分簇表F,固定位置索引要素个数fk置为0;

1.2.2遍历报文载荷位置,统计未处理的协议识别规则在载荷位置上的取值分布并存储在整数向量V[ROW]中,计算信息熵H,记录最大熵值max_H及固定位置索引点max_offset,H、max_H为实数,max_offset为整数;流程如下:

1.2.2.1令max_H置为0,清空V[ROW];

1.2.2.2循环变量g置为0;

1.2.2.3循环变量fi置为0;

1.2.2.4如果Bfi不等于0,跳转至1.2.2.6;否则,Bfi等于0,进入1.2.2.5;

1.2.2.5读取协议规则Rfi,提取载荷特征个数Mfi;遍历Rfi的载荷特征,查看是否载荷偏移位置g有取值要求;流程如下:

1.2.2.5.1令循环变量fj=1;

1.2.2.5.2读取Rfi的第fj个载荷特征rfi,fj=

1.2.2.5.3记临时变量 如果rfi,fj.offset≤g≤K+rfi,fj.offset,说明rfi,fj要求报文载荷在偏移位置g上的取值等于fs,令Vfs=Vfs+1,转1.2.2.6;否则,进入

1.2.2.5.4;

1.2.2.5.4循环变量fj增1;

1.2.2.5.5如果循环变量fj不等于Mfi+1,跳转至1.2.2.5.2;否则,进入1.2.2.6

1.2.2.6循环变量fi增1;

1.2.2.7如果循环变量fi不等于N+1,跳转至1.2.2.4;否则,进入1.2.2.8;

1.2.2.8根据V[ROW]计算信息熵H,流程如下:

1.2.2.8.1H置为0,临时变量total置为0;

1.2.2.8.2循环变量v置为0;

1.2.2.8.3total值增加Vv,即total=total+Vv;

1.2.2.8.4如果Vv>0,则更新H的值为H-Vv*log2(V),即H=H-Vv*log2(Vv);

1.2.2.8.5循环变量v增1;

1.2.2.8.6如果v不等于ROW+1,跳转至1.2.2.8.3;否则,进入1.2.2.8.7;

1.2.2.8.7H=H/total;

1.2.2.8.8H=H+log2(total);

1.2.2.8.9若H>max_H,更新max_H和max_offset:max_H=H,max_offset=g;

1.2.2.9循环变量g增1;

1.2.2.10如果循环变量g不等于P+1,跳转至1.2.2.3;否则,进入1.2.3;

1.2.3采用固定位置索引点max_offset创建新的固定位置索引要素,流程如下:

1.2.3.1fk增1;

1.2.3.2Ffk.offset=max_offset,清空Ffk.rule[ROW][L];

1.2.3.3令循环变量ti=0;

1.2.3.4如果Bti不等于0,跳转至1.2.2.6;否则,进入1.2.3.5;

1.2.3.5读取协议规则Rti,提取载荷特征个数Mti;遍历Rti的载荷特征,查看是否载荷偏移位置max_offset有取值要求,流程如下:

1.2.3.5.1令循环变量tj=1;

1.2.3.5.2读取Rti的第tj个载荷特征rti,tj=

1.2.3.5.3记临时变量 若rti,tj.offset≤max_offset≤K+rti,tj.offset,说明rti,tj要求报文载荷在偏移位置g上的取值等于ts,则将规则编号插入向量Ffk.rule[ROW][L]中,标记规则Rti完成固定位置索引分簇,方法是:Bti=1,Y=Y-1;转

1.2.3.6;

1.2.3.5.4循环变量tj=tj+1;

1.2.3.5.5如果循环变量tj不等于Mti+1,跳转至1.2.3.5.2;否则,进入1.2.3.6;

1.2.3.6循环变量ti=ti+1;

1.2.3.7如果循环变量ti不等于N+1,跳转至1.2.3.4;否则,进入1.2.4;

1.2.4如果Y大于0,说明仍有未处理的协议识别规则,跳转至1.2.2;否则,Y=0,说明所有协议识别规则均已处理完,结束。

5.如权利要求4所述的基于索引分簇的网络协议特征匹配方法,其特征在于所述

1.2.3.5.3中将规则编号插入向量Ffk.rule[ROW][L]中,方法是:令变量tz从1递增,首次出现Ffk.rulets,tz等于零时,则令Ffk.rulets,tz=ti。

6.如权利要求1所述的基于索引分簇的网络协议特征匹配方法,其特征在于所述第二步中采用的深度报文检查引擎采用Netlogic 2008或AC算法。

7.如权利要求1所述的基于索引分簇的网络协议特征匹配方法,其特征在于所述步骤

3.1深度报文检查结果重构,包括以下步骤:

3.1.1清空索引要素命中队列HIT及字串命中明细表C;

3.1.2令临时变量rnum记录命中结果Result中元素个数;

3.1.3令循环变量ci=1;

3.1.4读取命中结果Resultci,令临时变量cj=Resultci.offset,临时变量ck=Resultci.id;

3.1.5令临时变量insert=0,表示该命中结果不插入链表Cci;

3.1.6如果Ack.locationcj等于1,则将Resultci.offset插入链表Cck,同时令临时变量insert=1;

3.1.7如果Ack.float等于1,且链表Cck为空,则将Resultci.offset插入链表Cck,同时令临时变量insert=1;

3.1.8如果Ack.index等于1,说明字符串ck是索引要素,且临时变量insert等于1,则将ck加入索引要素命中队列HIT;

3.1.9循环变量ci=ci+1;

3.1.10如果循环变量ci不等于rnum+1,跳转至3.1.4;否则,结束。

8.如权利要求1所述的基于索引分簇的网络协议特征匹配方法,其特征在于所述步骤

3.2深度报文检查索引类规则匹配,包括以下步骤:

3.2.1令临时变量hnum记录索引要素命中队列HIT中元素个数;

3.2.2令循环变量hi=1;

3.2.3读取HIThi,为便于表示,令临时变量hs=HIThi;

3.2.4令循环变量hz=1;

3.2.5如果Ahs.rulehz等于0,说明HIThi索引的规则遍历结束,跳转至3.2.8;否则,进入

3.2.6;

3.2.6令临时变量hk=Ahs.rulehz,读取规则Rhk,遍历Rhk的载荷特征进行匹配验证,具体步骤包括:

3.2.6.1令循环变量hj=0;

3.2.6.2读取Rhk的第hj个载荷特征rhk,hj=

3.2.6.3读取载荷特征映射表S[N][M],令临时变量hss=Shk,hj,如果hss不等于0,说明该载荷特征的特征串已加入集合D,可从字符串命中明细表C查询命中结果,跳转至

3.2.6.5;否则,进入3.2.6.4;

3.2.6.4从报文载荷DATA的偏移位置offset处读取K个字符,与rhk,hj.string[K]进行比较,若不相等,说明匹配失败,跳转至3.2.6.8;否则,进入3.2.6.5;

3.2.6.5读取字符串命中明细表C,若链表Chss中不包含rhk,hj.offset,说明匹配失败,跳转至3.2.6.9;否则,进入3.2.6.6;

3.2.6.6循环变量hj=hj+1;

3.2.6.7如果循环变量hj不等于Mhk+1,跳转至3.2.6.2;否则,进入3.2.6.8;

3.2.6.8规则Rhk命中成功,输出规则编号hk,转3.2.7;

3.2.6.9规则Rhk命中失败,进入3.2.7;

3.2.7循环变量hz=hz+1,若hz不等于L+1,转3.2.5;否则,进入3.2.8;

3.2.8循环变量hi=hi+1;

3.2.9如果循环变量hi不等于hnum+1,跳转至3.2.3;否则,结束。

9.如权利要求1所述的基于索引分簇的网络协议特征匹配方法,其特征在于所述步骤

3.3固定位置类索引规则匹配,包括以下步骤:

3.3.1令临时变量fnum记录固定位置索引分簇表F的元素个数;

3.3.2令循环变量fii=1;

3.3.3读取Ffii,令临时变量fs=Ffii.offset,令fq记录报文载荷DATA偏移位置fs处的取值,即fq=DATAfs;

3.3.4令循环变量fz=0;

3.3.5从Ffii关联的规则表Ffii.rule[ROW][L]查询Ffii.rulefq,fz,令临时变量fk=Ffii.rulefq,fz;若fk等于0,说明Ffii索引的规则遍历结束,跳转至3.3.7;否则,进入3.3.6;

3.3.6读取规则Rfk,遍历Rfk的载荷特征进行匹配验证,流程如下:

3.3.6.1令循环变量rjj=0;

3.3.6.2读取Rfk的第rjj个载荷特征rfii,rjj=

3.3.6.3从报文载荷DATA的偏移位置offset处读取K个字符,与rfii,rjj.string[K]进行比较,若不相等,说明匹配失败,跳转至3.3.6.7;否则,进入3.3.6.4;

3.3.6.4循环变量rjj=rjj+1;

3.3.6.5如果循环变量rjj不等于Mrii+1,跳转至3.2.6.2;否则,进入3.3.6.6;

3.3.6.6规则Rfk命中成功,返回规则编号fk,跳转至3.3.7;

3.3.6.7规则Rfk命中失败,进入3.3.7;

3.3.7循环变量fii=fii+1;

3.3.8如果循环变量fii不等于fnum+1,跳转至3.3.2;否则,结束。

10.如权利要求1-9中任意一项所述的基于索引分簇的网络协议特征匹配方法,其特征在于,由于一共有256个ASCII字符,所述ROW优选为256。

说明书 :

基于索引分簇的网络协议特征匹配方法

技术领域

[0001] 本发明涉及计算机领域中网络协议识别方法,特别是网络协议特征匹配方法。

背景技术

[0002] 协议识别是网络带宽管理和安全防护的关键支撑技术。现有的协议识别方法可大致分为基于端口匹配的协议识别方法、基于深度报文检查的协议识别方法、基于数据流特征的协议识别方法三种。其中,基于深度报文检查的协议识别方法是对基于端口匹配协议识别方法的扩展,除了分析报头信息外,还对报文数据载荷特征进行匹配,相比较而言,该类方法具有识别速度快、更新方便、准确率高等优点,已在业界广泛使用。
[0003] 基于深度报文检查的协议识别方法主要包含三个步骤:(1)预处理,提取协议识别规则中的载荷特征,放到深度报文检查引擎,并建立载荷特征与协议识别规则的映射关系;(2)深度报文检查,对报文数据载荷进行遍历,返回命中的载荷特征编号及其所在的偏移位置;(3)规则匹配:根据命中的载荷特征匹配相应的协议识别规则,返回协议识别结果。
[0004] 在既往研究中,协议识别规则多以单载荷特征规则为主,因此,规则匹配的开销常被忽略,一般侧重从深度报文检查改进的角度提升协议识别性能。然而,随着网络应用的不断丰富,单数据载荷特征的识别准确率降低,协议识别需要依赖多个载荷特征共同判定,规则匹配对整体性能的影响越来越大。一方面,载荷特征和协议规则的映射关系更加复杂,另一方面,载荷特征含有大量单字节或双字节特征,直接将这些载荷特征加入深度报文检查引擎,会导致大量命中结果,若在规则匹配过程中多次遍历命中结果,性能开销极大。如何优化载荷特征和协议规则的映射关系、降低规则匹配开销是协议识别亟需解决的技术问题。

发明内容

[0005] 本发明要针对已有基于报文深度检查的协议识别方法存在载荷特征和协议识别规则间关联关系复杂而导致规则匹配开销大的技术问题,提供一种基于索引分簇的网络协议特征匹配方法,优化设计载荷特征项与协议识别规则间的关联关系,提高规则匹配性能。
[0006] 不失一般性,假定基于报文深度检查的协议识别规则至少包含一个载荷特征,载荷特征包括浮动位置特征和固定位置特征,浮动位置特征不限定载荷特征的命中位置,固定位置特征会指定载荷特征相对于报文TCP/UDP数据载荷起点的偏移位置。本发明中“=”为赋值操作符,即将等号“=”右边的值赋值给等号左边的变量。
[0007] 本发明技术方案:
[0008] 第一步:预处理。
[0009] 输入:协议识别规则集合R,R中包含N条协议规则,N为整数。记Ri表示第i条协议规则,Ri包含Mi个载荷特征,ri,j为Ri第j个载荷特征,1≤i≤N,1≤j≤Mi,i、j、Mi均为整数。载荷特征包含字符串和固定位置(即载荷特征所在位置相对于报文TCP/UDP数据载荷起点的偏移)两个元素,记ri,j=,其中,string[K]表示长度为K的字符串,令stringk表示ri,j中第k个字符,1≤k≤K,k、K均为整数;令offset表示固定位置要求,若offset等于-1,则ri,j为浮动位置串;通过ri,j.string[K]访问ri,j中的string[K],通过ri,j.offset访问ri,j中的offset。
[0010] 为了加速协议处理过程,采用空间换时间的策略,对于预处理阶段得到的静态数据结果尽量采用数组存储。对此,假定一条规则最多包含M个载荷特征,一个索引要素最多关联L条规则,报文数据载荷的最大长度为P字节,M、L、P均为整数。
[0011] 输出:
[0012] (1)深度报文检查字符串集合D,D初始值为空,D中不包含重复字符串。
[0013] (2)载荷特征映射表S[N][M](N行M列矩阵),S[N][M]初始值为全0,Si,j表示协议规则Ri的载荷特征ri,j在集合D中的编号,若Si,j等于0,说明ri,j的字符串ri,j.string[K]不属于集合D。
[0014] (3)深度报文检查索引分簇表A,Ad表示D中第d个字符串的描述信息,d为整数,Ad包含4部分信息,记Ad=。其中:
[0015] ●float为浮动位置标记,若float等于1,表示Ad字符串属于浮动位置载荷特征,通过Ad.float访问Ad的float元素;
[0016] ●location[P]表示长度为P的固定位置向量,若locationp等于1,说明Ad来自某个固定位置载荷特征,且该固定位置特征载荷的offset等于p,1≤p≤P,p、P均为整数,通过Ad.locationp访问Ad的locationp元素;
[0017] ●index为索引标记,若index等于1,表示Ad为某协议规则的索引要素,通过Ad.index访问Ad的index元素;
[0018] ●rule[L]为长度为L的向量,其中存储Ad作为索引要素的协议规则的编号,由于一个索引要素最多关联L条协议规则,因此,设置rule为长度为L的向量,通过Ad.rule[L]访问Ad的rule[L]元素,通过Ad.rulel访问Ad的rulel元素,1≤l≤L,l为整数。
[0019] (4)固定位置索引分簇表F,Ff表示第f个固定位置索引,包含2部分信息,记Ff=,f为整数,其中:
[0020] ●offset表示Ff所在的偏移位置,采用索引偏移位置为offset的字节为索引,通过Ff.offset访问Ff的offset元素;
[0021] ●rule[Row][L]为ROW行L列矩阵,存储对应该字节的ROW种取值的协议识别规则编号,其中ruler,s表示编号等于ruler,s的协议规则包含某个固定位置特征,该固定位置特征要求偏移位置为offset的字节取值等于r,1≤r≤256,1≤s≤L,r、s均为整数,通过Ff.rule[ROW][L]访问Ff的rule[ROW][L]元素,由于一共有256个ASCII字符,所以设置ROW≥256,ROW优选为256。
[0022] (5)协议识别规则处理状态向量B[N],初始值为全0,Bi标记第i条协议识别规则Ri的处理状态,若Bi等于0,表明该规则尚未处理,若Bi等于1,表明该规则已完成索引分簇。
[0023] 预处理流程如下:
[0024] 步骤1.1建立深度报文检查索引分簇。输入协议识别规则集合R,从协议识别规则的载荷特征中提取深度报文检查字符串集合D,针对每条规则按照长度优先原则筛选深度报文检查字符串作为索引要素,建立深度报文检查索引分簇表A,记录规则处理状态B[N]及未处理规则数Y,Y为整数。具体步骤如下:
[0025] 1.1.1 遍历协议识别规则的载荷特征,将浮动位置特征的字符串及固定位置长度大于阈值W的字符串加入集合D,得到集合D,W为正整数,优选为3。具体步骤为:
[0026] 1.1.1.1 清空集合D;
[0027] 1.1.1.2 令循环变量ii=1;
[0028] 1.1.1.3 读取协议规则Rii,提取载荷特征个数Mii。遍历Rii的载荷特征,将浮动位置特征的字符串及固定位置长度大于W的字符串加入集合D。具体步骤如下:
[0029] 1.1.1.3.1 循环变量jj置为1;
[0030] 1.1.1.3.2 读取Rii的第jj个载荷特征rii,jj=
[0031] 1.1.1.3.3 如果offset等于-1,说明rii,jj为浮动位置串,则将rii,jj.string[K]添加到D,跳转至1.1.1.3.5;否则,offset不等于-1,说明rii,jj为固定位置特征字符串,进入1.1.1.3.4;
[0032] 1.1.1.3.4 如果K大于W,则将rii,jj.string[K]添加到D;
[0033] 1.1.1.3.5 循环变量jj增1;
[0034] 1.1.1.3.6 如果循环变量jj不等于Mii+1,跳转至1.1.1.3.2;否则,进入到1.1.1.4;
[0035] 1.1.1.4 循环变量ii增1;
[0036] 1.1.1.5 如果循环变量ii不等于N+1,跳转至1.1.1.3;否则,循环变量ii等于N+1,进入1.1.2;
[0037] 1.1.2 遍历协议识别规则的载荷特征,若载荷特征的字符串属于集合D,则填写载荷特征映射表S[N][M]及深度报文检查索引分簇表A,得到载荷特征映射表S[N][M]及深度报文检查索引分簇表A。协议识别规则Ri包含Mi个载荷特征,记其中Mi’个载荷特征的字符串属于集合D,Mi’为整数,Mi’≤Mi。若Mi’≥1,则规则Ri属于深度报文检查索引分簇,将规则Ri的Mi’个载荷特征中的最长字符串作为Ri的索引要素。具体步骤如下:
[0038] 1.1.2.1 清空载荷特征映射表S[N][M]、深度报文检查索引分簇表A、协议识别规则处理状态向量B[N],令Y=N。
[0039] 1.1.2.2 令循环变量iii=1;
[0040] 1.1.2.3 读取协议规则Riii,提取载荷特征个数Miii。遍历Riii的载荷特征,若载荷特征的字符串属于集合D,则标记S[N][M]及A,记录属于集合D的最长字串编号max_id及长度max_len,max_id、max_len为正整数。具体步骤如下:
[0041] 1.1.2.3.1 max_len置为-1;
[0042] 1.1.2.3.2 循环变量jjj置为1;
[0043] 1.1.2.3.3 读取Riii的第jjj个载荷特征riii,jjj=
[0044] 1.1.2.3.4 在集合D中查找字符串riii,jjj.string[K],若找不到,说明字符串riii,jjj.string[K]不属于集合D,跳转至1.1.2.3.9;若找到,说明字符串riii,jjj.string[K]属于集合D,进入1.1.2.3.5;
[0045] 1.1.2.3.5 令临时变量id记录字符串riii,jjj.string[K]在集合D中编号;
[0046] 1.1.2.3.6 填写协议识别规则载荷特征映射表S[N][M],方法是:将id赋值给Si,j,即Si,j=id;
[0047] 1.1.2.3.7 如果riii,jjj.string[K]的长度K大于max_len,则更新max_id、max_len的值:max_len=K,max_id=id;
[0048] 1.1.2.3.8 若riii,jjj.offset等于-1,记录D中编号为id的字符串属于浮动位置特征,方法是:Aid.float=1;若riii,jjj.offset不等于-1,记录该固定位置特征对D中编号为id的字符串的位置要求,方法是:令临时变量kk=riii,jjj.offset,Aid.locationkk=1;
[0049] 1.1.2.3.9 循环变量jjj增1;
[0050] 1.1.2.3.10 如果循环变量jjj不等于Miii+1,跳转至1.1.2.3.3;否则,进入1.1.2.4;
[0051] 1.1.2.4 如果max_len等于-1,转1.1.2.7;否则,进入1.1.2.5;
[0052] 1.1.2.5 选择集合D中编号为max_id的字符串作为规则Ri的索引要素,将规则编号iii插入至Amax_id.rule[L],方法是:令变量kkk从1递增,若首次出现Amax_id.rulekkk等于零,则Amax_id.rulekkk置为iii,即完成将规则编号iii插入至Amax_id.rule[L],进入1.1.2.6;
[0053] 1.1.2.6 至此规则Riii完成深度报文检查索引分簇,更新Biii、Y的值:Biii=1,Y=Y-1;
[0054] 1.1.2.7 循环变量iii增1;
[0055] 1.1.2.8 如果循环变量iii不等于N+1,跳转至1.1.2.3;否则,进入步骤1.2。
[0056] 步骤1.2建立固定位置索引分簇。针对未处理的协议识别规则,按照信息熵评估结果选择固定位置载荷作为索引要素,建立固定位置索引分簇表F。输入协议识别规则集合R,规则处理状态B[N]及未处理规则数Y,输出固定位置索引分簇表F。步骤如下:
[0057] 1.2.1 清空固定位置索引分簇表F,固定位置索引要素个数fk置为0;
[0058] 1.2.2 遍历报文载荷位置,统计未处理的协议识别规则在载荷位置上的取值分布并存储在整数向量V[ROW]中,计算信息熵H,记录最大熵值max_H及固定位置索引点max_offset,H、max_H为实数,max_offset为整数。具体步骤包括:
[0059] 1.2.2.1 令max_H置为0,清空V[ROW];
[0060] 1.2.2.2 循环变量g置为0;
[0061] 1.2.2.3 循环变量fi置为0;
[0062] 1.2.2.4 如果Bfi不等于0,跳转至1.2.2.6;否则,Bfi等于0,进入1.2.2.5;
[0063] 1.2.2.5 读取协议规则Rfi,提取载荷特征个数Mfi。遍历Rfi的载荷特征,查看是否载荷偏移位置g有取值要求。具体步骤如下:
[0064] 1.2.2.5.1 令循环变量fj=1;
[0065] 1.2.2.5.2 读取Rfi的第fj个载荷特征rfi,fj=
[0066] 1.2.2.5.3 记临时变量 如果rfi,fj.offset≤g≤K+rfi,fj.offset,说明rfi,fj要求报文载荷在偏移位置g上的取值等于fs,令Vfs=Vfs+1,转1.2.2.6;
否则,进入1.2.2.5.4;
[0067] 1.2.2.5.4 循环变量fj增1;
[0068] 1.2.2.5.5 如果循环变量fj不等于Mfi+1,跳转至1.2.2.5.2;否则,进入1.2.2.6[0069] 1.2.2.6 循环变量fi增1;
[0070] 1.2.2.7 如果循环变量fi不等于N+1,跳转至1.2.2.4;否则,进入1.2.2.8;
[0071] 1.2.2.8 根据V[ROW]计算信息熵H,流程如下:
[0072] 1.2.2.8.1 H置为0,临时变量total置为0;
[0073] 1.2.2.8.2 循环变量v置为0;
[0074] 1.2.2.8.3 total值增加Vv,即total=total+Vv;
[0075] 1.2.2.8.4 如果Vv>0,则更新H的值为H-Vv*log2(V),即H=H-Vv*log2(Vv);
[0076] 1.2.2.8.5 循环变量v增1;
[0077] 1.2.2.8.6 如果循环变量v不等于ROW+1,跳转至1.2.2.8.3;否则,进入1.2.2.8.7;
[0078] 1.2.2.8.7 H=H/total;
[0079] 1.2.2.8.8 H=H+log2(total);
[0080] 1.2.2.8.9 若H>max_H,则更新max_H和max_offset的值,方法是:max_H=H,max_offset=g,进入1.2.2.9;否则,max_H和max_offset的值保持不变,进入1.2.2.9;
[0081] 1.2.2.9 循环变量g增1;
[0082] 1.2.2.10 如果循环变量g不等于P+1,其中P为报文数据载荷的最大长度,跳转至1.2.2.3;否则,进入1.2.3。
[0083] 1.2.3 采用固定位置索引点max_offset创建新的固定位置索引要素。具体步骤包括:
[0084] 1.2.3.1 fk增1;
[0085] 1.2.3.2 Ffk.offset=max_offset,清空Ffk.rule[ROW][L];
[0086] 1.2.3.3 令循环变量ti=0;
[0087] 1.2.3.4 如果Bti不等于0,跳转至1.2.2.6;否则,进入1.2.3.5;
[0088] 1.2.3.5 读取协议规则Rti,提取载荷特征个数Mti。遍历Rti的载荷特征,查看是否载荷偏移位置max_offset有取值要求。具体步骤如下:
[0089] 1.2.3.5.1 令循环变量tj=1;
[0090] 1.2.3.5.2 读取Rti的第tj个载荷特征rti,tj=
[0091] 1.2.3.5.3 记临时变量 若rti,tj.offset≤max_offset≤K+rti,tj.offset,说明rti,tj要求报文载荷在偏移位置g上的取值等于ts,则将规则编号插入向量Ffk.rule[ROW][L]中,方法是:令变量tz从1递增,首次出现Ffk.rulets,tz等于零时,则令Ffk.rulets,tz=ti;标记规则Rti完成固定位置索引分簇,方法是:Bti=1,Y=Y-1;转1.2.3.6;
[0092] 1.2.3.5.4 循环变量tj=tj+1;
[0093] 1.2.3.5.5 如果循环变量tj不等于Mti+1,跳转至1.2.3.5.2;否则,进入1.2.3.6;
[0094] 1.2.3.6 循环变量ti=ti+1;
[0095] 1.2.3.7 如果循环变量ti不等于N+1,跳转至1.2.3.4;否则,进入1.2.4;
[0096] 1.2.4 如果Y大于0,说明仍有未处理的协议识别规则,跳转至1.2.2;否则,Y=0,说明所有协议识别规则均已处理完,进入第二步。
[0097] 第二步:深度报文检查。该阶段的深度报文检查引擎可采用专门的硬件引擎,如Netlogic 2008,或软件匹配算法,如由贝尔实验室的Alfred V.Aho和Margaret J.Corasick在1975年提出多模式匹配算法--AC算法(Aho AV,Corasick MJ.Efficient string matching:An aid to bibliographic search[C].Communications of the ACM,
1975,18(6):333-340.)。
[0098] 深度报文检查流程如下:向深度报文检查引擎输入深度报文检查字符串集合D、网络报文。深度报文检查引擎遍历检查网络报文的报文载荷DATA中是否包含D中字符串,输出命中结果Result,Result中包含rnum个命中结果,其中第ci个命中结果Resultci=,分别通过Resultci.offset、Resultci.id访问offset和id元素,其中Resultci.offset表示命中位置,Resultci.id表示命中的字符串编号。Result按照offset从小到大排序,即Resultci’.offset
[0099] 第三步:规则匹配。
[0100] 输入:命中结果Result,报文载荷DATA,协议识别规则集合R,协议识别规则载荷特征映射表S[N][M],深度报文检查索引分簇表A,固定位置索引分簇表F。
[0101] 输出:命中的协议规则编号。
[0102] 规则匹配流程如下:
[0103] 步骤3.1深度报文检查结果重构。根据深度报文检查索引分簇表A,将命中结果Result筛选和重构,提取命中结果中包含的深度报文检查索引要素编号,构成索引要素命中队列HIT,其中HIThi表示第hi个索引要素编号,及字符串命中明细表C,其中Cck表示集合D中第ck个字符串的命中位置列表,采用链表结构存储,令Cck,cz表示链表Cck中存储的第cz个命中位置,hi、ck、cz均为正整数。具体步骤包括:
[0104] 3.1.1 清空索引要素命中队列HIT及字串命中明细表C;
[0105] 3.1.2 令临时变量rnum记录命中结果Result中元素个数;
[0106] 3.1.3 令循环变量ci=1;
[0107] 3.1.4 读取命中结果Resultci,为便于表示,令临时变量cj=Resultci.offset,临时变量ck=Resultci.id;
[0108] 3.1.5 令临时变量insert=0,表示该命中结果不插入链表Cci;
[0109] 3.1.6 如果Ack.locationcj等于1,则将Resultci.offset插入链表Cck,同时令临时变量insert=1;
[0110] 3.1.7 如果Ack.float等于1,且链表Cck为空,则将Resultci.offset插入链表Cck,同时令临时变量insert=1;
[0111] 3.1.8 如果Ack.index等于1,说明字符串ck是索引要素,且临时变量insert等于1,则将ck加入索引要素命中队列HIT。
[0112] 3.1.9 循环变量ci=ci+1;
[0113] 3.1.10 如果循环变量ci不等于rnum+1,跳转至3.1.4;否则,进入步骤3.2。
[0114] 步骤3.2深度报文检查索引类规则匹配。根据索引要素命中队列HIT中记录的字符串编号遍历相关规则。具体步骤包括:
[0115] 3.2.1 令临时变量hnum记录索引要素命中队列HIT中元素个数;
[0116] 3.2.2 令循环变量hi=1;
[0117] 3.2.3 读取HIThi,为便于表示,令临时变量hs=HIThi;
[0118] 3.2.4 令循环变量hz=1;
[0119] 3.2.5 如果Ahs.rulehz等于0,说明HIThi索引的规则遍历结束,跳转至3.2.8;否则,进入3.2.6;
[0120] 3.2.6 为便于表示,令临时变量hk=Ahs.rulehz,读取规则Rhk,Rhk的载荷特征个数为Mhk,遍历Rhk的载荷特征进行匹配验证,具体步骤包括:
[0121] 3.2.6.1 令循环变量hj=0;
[0122] 3.2.6.2 读取Rhk的第hj个载荷特征rhk,hj=
[0123] 3.2.6.3 读取载荷特征映射表S[N][M],为便于表示,令临时变量hss=Shk,hj,如果hss不等于0,说明该载荷特征的特征串已加入集合D,可从字符串命中明细表C查询命中结果,跳转至3.2.6.5;否则,进入3.2.6.4;
[0124] 3.2.6.4 从报文载荷DATA的偏移位置offset处读取K个字符,与rhk,hj.string[K]进行比较,若不相等,说明匹配失败,跳转至3.2.6.8;否则,进入3.2.6.5;
[0125] 3.2.6.5 读取字符串命中明细表C,若链表Chss中不包含rhk,hj.offset,说明匹配失败,跳转至3.2.6.9;否则,进入3.2.6.6;
[0126] 3.2.6.6 循环变量hj=hj+1;
[0127] 3.2.6.7 如果循环变量hj不等于Mhk+1,跳转至3.2.6.2;否则,进入3.2.6.8;
[0128] 3.2.6.8 规则Rhk命中成功,输出规则编号hk,转3.2.7;
[0129] 3.2.6.9 规则Rhk命中失败,进入3.2.7;
[0130] 3.2.7 循环变量hz=hz+1,若hz不等于L+1,转3.2.5;否则,进入3.2.8;
[0131] 3.2.8 循环变量hi=hi+1;
[0132] 3.2.9 如果循环变量hi不等于hnum+1,跳转至3.2.3;否则,进入步骤3.3。
[0133] 步骤3.3固定位置类索引规则匹配。根据固定位置索引分簇表F遍历相关规则。
[0134] 3.3.1 令临时变量fnum记录固定位置索引分簇表F的元素个数;
[0135] 3.3.2 令循环变量fii=1;
[0136] 3.3.3 读取Ffii,为便于表示,令临时变量fs=Ffii.offset,令fq记录报文载荷DATA偏移位置fs处的取值,即fq=DATAfs;
[0137] 3.3.4 令循环变量fz=0;
[0138] 3.3.5 从Ffii关联的规则表Ffii.rule[ROW][L]查询Ffii.rulefq,fz,为便于表示,令临时变量fk=Ffii.rulefq,fz。若fk等于0,说明Ffii索引的规则遍历结束,跳转至3.3.7;否则,进入3.3.6;
[0139] 3.3.6 读取规则Rfk,Rfk的载荷特征个数为Mfk,遍历Rfk的载荷特征进行匹配验证,具体步骤包括:
[0140] 3.3.6.1 令循环变量rjj=0;
[0141] 3.3.6.2 读取Rfk的第rjj个载荷特征rfii,rjj=
[0142] 3.3.6.3 从报文载荷DATA的偏移位置offset处读取K个字符,与rfii,rjj.string[K]进行比较,若不相等,说明匹配失败,跳转至3.3.6.7;否则,进入3.3.6.4;
[0143] 3.3.6.4 循环变量rjj=rjj+1;
[0144] 3.3.6.5 如果循环变量rjj不等于Mrii+1,跳转至3.2.6.2;否则,进入3.3.6.6;
[0145] 3.3.6.6 规则Rfk命中成功,返回规则编号fk,跳转至3.3.7;
[0146] 3.3.6.7 规则Rfk命中失败,进入3.3.7;
[0147] 3.3.7 循环变量fii=fii+1;
[0148] 3.3.8 如果循环变量fii不等于fnum+1,跳转至3.3.2;否则,结束。
[0149] 采用本发明可以达到以下有益效果:
[0150] 1.本发明在预处理阶段,针对每条规则筛选唯一的载荷特征项作为索引要素,并将协议识别规则按照索引要素分簇组织。索引要素分两类,第一类是深度报文检查类,提取深度报文检查特征串输入到深度报文检查引擎,按照长度优先原则筛选深度报文检查特征串编号作为索引要素,建立规则分簇及深度报文检查特征串描述表。第二类是固定位置类,针对不包含深度报文检查类索引要素的协议规则,按照信息熵评估结果选择固定位置(单个字节)载荷作为索引要素,建立规则分簇。简化了载荷特征与协议识别规则之间的关联关系,即一条协议识别规则仅与一个索引要素关联,从而避免协议识别规则被重复匹配。同时,避免了将固定位置特征的单字节或双字节字符串加入深度报文检查引擎,能够有效减少深度报文检查引擎返回的命中结果;
[0151] 2.本发明在规则匹配阶段,首先,借助深度报文检查索引分簇表,重构深度报文检查引擎返回的命中结果,其次,对深度报文检查特征串索引分簇的规则进行匹配,然后对固定位置索引分簇的规则进行匹配。在不影响规则匹配准确度的前提下,能够进一步筛选和过滤深度报文检查引擎的命中结果,且在规则匹配过程中可以快速检索命中结果,有效降低规则匹配的性能开销。

附图说明

[0152] 图1是本发明基于索引分簇的网络协议特征匹配方法流程图;
[0153] 图2是本发明第一步预处理流程图;
[0154] 图3是本发明第二步深度报文检查流程图;
[0155] 图4是本发明第三步规则匹配流程图。

具体实施方式

[0156] 下面结合实例对本发明的实施方式进行详细描述。
[0157] 第一步 预处理阶段。
[0158] 输入的协议识别规则R如表1所示,共包含6条规则(即N=6),为便于描述表示,约定一条规则最多包含2个载荷特征(即M=2),一个索引要素最多关联1条规则(即L=1),报文数据载荷的最大长度为32字节(即P=32)。
[0159] 表1协议识别规则R
[0160]
[0161] 表2深度报文检查字符串集合D
[0162]编号 字符串
1 aaa
2 bbbb
3 cccc
[0163] 步骤1.1建立深度报文检查索引分簇。执行完毕后,得到深度报文检查字符串集合D(如表2所示),载荷特征映射表S[N][M](N=6,M=2,如表3所示),深度报文检查索引分簇表A(如表4所示),尚有4条规则未处理。
[0164] 表3载荷特征映射表S[N][M]
[0165]1 0
2 3
0 0
0 0
0 0
0 0
0 0
[0166] 表4深度报文检查索引分簇表A
[0167]
[0168]
[0169] 步骤1.2建立固定位置引分簇。针对载荷偏移位置0至P逐一计算熵值,得到偏移位置为1熵值最大(即4条规则对偏移位置1均有取值要求,分别为“b”,“a”,“c”及“d”),由此,偏移位置等于1(即offset=1)放入固定位置索引分簇表F(如表5所示),该索引要素按照取值不同关联4条规则。此时,全部规则均完成处理,因此F仅包含一个索引要素,即fnum=1。
[0170] 表5固定位置索引分簇表F
[0171]
[0172] 第二步深度报文检查。
[0173] 假定输入的报文载荷DATA=“aaabbbbccccaaacccc”,采用AC算法遍历报文载荷返回命中结果Result(如表6所示),共包含5条记录(即rnum=5)。
[0174] 表6命中结果Result
[0175]编号 Offset id
1 0 1
2 3 2
3 7 3
4 11 1
5 14 3
[0176] 第三步 规则匹配。
[0177] 步骤3.1深度报文检查结果重构。遍历命中结果Result,第一条记录是1号字符串“aaa”的命中结果,因“aaa”来自浮动位置特征,该结果插入字串命中明细表C,同时因“aaa”是索引字串,则字串编号1插入索引要素命中队列HIT。第二条记录是2号字符串“bbbb”的命中结果,因A2.location3等于0,该结果丢弃。第三条记录是3号字符串“cccc”的命中结果,因A3.location7等于1,该结果插入字串命中明细表C。第四条记录是1号字符串“aaa”的命中结果,因“aaa”来自浮动位置特征,且字串命中明细表C中已有记录,该结果丢弃。第五条记录是3号字符串“cccc”的命中结果,因A3.location14等于0,该结果丢弃。执行完毕后,索引要素命中队列HIT包含1个要素,即hrum=1且HIT1=1,字串命中明细表C包含2条存储结果(如表7所示)。
[0178] 表7字串命中明细表C
[0179]编号i 链表Ci
1 存储偏移位置0
2 空链表
3 存储偏移位置7
[0180] 步骤3.2深度报文检查索引类规则匹配。遍历索引要素命中队列HIT,得到字符串编号1,进一步由A1.rule[L]得到第1号协议识别规则,根据字串命中明细表C中记录的结果,判定第1号协议识别规则匹配成功,输出规则编号1。
[0181] 步骤3.3固定位置类索引规则匹配。固定位置索引分簇表F只包含一个要素,根据F1.offset=1,查看报文载荷DATA=“aaabbbbccccaaacccc”得到偏移位置取值为a,查找F1.rule[256][L]得到第4号协议识别规则,逐一匹配其载荷特征,判定匹配失败。