发明内容
本发明提出一种基于网络地址排序的双向流组流方法,本发明能够提高网络报文流量的双向流组流效率。
本发明采用如下技术方案:
一种基于网络地址排序的双向流组流方法,其特征是对于每个报文的源IP地址和宿IP地址,在检查哈希链表之前,对源IP地址和宿IP地址这两个IP地址从大到小进行排序,如果源IP地址大于宿IP地址,则在哈希链表中查找{源IP,宿IP}结点,如果源IP地址小于宿IP地址,则在哈希链表中查找{宿IP,源IP}结点,如果在哈希链表中查找到相应的结点,则直接对该结点流量记录进行更新,如果在哈希链表中查找不到相应结点,则生成一个新的结点,具体技术步骤如下:
第一步:设置参数
设置一个指针数组I[n],n为指针数组I的大小,设置n=2m,其中m是大于0的正整数,数组I的每个元素赋值为空指针,设置一个64位长度的比特串S,设置一个哈希函数F,哈希函数F的输入是64位长度的比特串S,哈希函数F输出的哈希值是一个取值范围为0到2m-1之间的正整数,哈希函数F采用目前计算机常用的MD5哈希函数,MD表示信息摘要是由Ron Rivest设计被广泛使用的哈希函数,MD5哈希函数的输入是一个任意长度的比特串,输出是一个128位信息摘要,哈希函数F选取MD5哈希函数哈希值的前m个比特作为其输出哈希值,设置一号IP地址IP1和二号IP地址IP2,设置一号IP地址到二号IP地址的流量为T1,设置二号IP地址到一号IP地址的流量为T2,设置一个结构A,结构A包括四个整数变量和一个指针变量,结构A的四个整数变量分别记录第一个IP地址、第二个IP地址、第一个IP地址到第二个IP地址的流量、第二个IP地址到第一个IP地址的流量,结构A的指针变量指向下一个结点,测量开始,如果一个新报文到达,进入第二步;
第二步:处理到达报文
读取该报文的源IP地址、宿IP地址、报文大小,比较源IP地址和宿IP地址之间的大小,如果源IP地址大于等于宿IP地址,则赋值一号IP地址IP1为源IP地址,赋值二号IP地址IP2为宿IP地址,赋值一号IP地址到二号IP地址的流量T1为该报文大小,赋值二号IP地址到一号IP地址的流量T2为0,如果源IP地址小于宿IP地址,则赋值一号IP地址IP1为宿IP地址,赋值二号IP地址IP2为源IP地址,赋值一号IP地址到二号IP地址的流量T1为0,赋值二号IP地址到一号IP地址的流量T2为该报文大小,将一号IP地址IP1赋值到64位比特串S的前32个比特,将二号IP地址IP2赋值到64位比特串S的后32个比特,将64位比特串S作为哈希函数F的输入,计算哈希值i,读取指针数组I第i个元素的指针,如果该指针为空指针,根据结构A生成一个新的结点,将第i个元素的指针指向这个新生成的结点,进入第三步,如果该指针不为空,则进入第四步;
第三步:初始化新结点
赋值这个结点的第一个IP地址为一号IP地址IP1,赋值这个结点的第二个IP地址为二号IP地址IP2,赋值这个结点的第一个IP地址到第二个IP地址的流量值为一号IP地址到二号IP地址的流量T1,赋值这个结点的第二个IP地址到第一个IP地址的流量值为二号IP地址到一号IP地址的流量T2,设置该结点的指针为空指针,进入第六步;
第四步:查找指针链表
查找指针数组I第i个元素指向的结点链表,如果在这个链表中找到一个结点,其中该结点的第一个IP地址等于一号IP地址IP1,该结点的第二个IP地址为二号IP地址IP2,进入第五步,否则根据结构A生成一个新的结点,将数组I第i个元素的指针指向结点链表的最后一个指针指向这个新生成的结点,回到第三步;
第五步:更新结点
累加一号IP地址到二号IP地址的流量T1值更新这个结点的第一个IP地址到第二个IP地址的流量值,累加二号IP地址到一号IP地址的流量T2值更新该结点的第二个IP地址到第一个IP地址的流量值,进入第六步;
第六步:测量结束
如果测量结束,进入第七步,如果测量没有结束,等待一个新报文到达,如果一个新报文到达,回到第二步;
第七步:测量结果输出
查找指针数组I中的所有的结点,将结点中的变量按照结点中的第一个IP地址、第二个IP地址、第一个IP地址到第二个IP地址的流量、第二个IP地址到第一个IP地址的流量顺序依次输出。
与现有技术相比,本发明具有如下优点及有益效果:
1、该方法的优点是每个报文只需要检查哈希链表一次即可找到双向流结点所在的位置,与传统双向流测量方法相比至少可以提高50%以上的哈希链表检索效率,同时比测量单向流的方法节省一半的结点空间,因此该方法一方面可以节省结点空间的消耗,同时又能够减少哈希链表的查找次数;
2、该方法能够测量统计IP地址间的出入流量大小,其测量结果可以用于建立流量矩阵,进行网络流量管理、流量计费等应用,同时该方法测量的双向流流量还能够用来作为流量异常判断的一个测度指标。
具体实施方式
一种基于网络地址排序的双向流组流方法,其特征是:对于每个报文的源IP地址和宿IP地址,在检查哈希链表之前,对源IP地址和宿IP地址这两个IP地址从大到小进行排序,如果源IP地址大于宿IP地址,则在哈希链表中查找{源IP,宿IP}结点,如果源IP地址小于宿IP地址,则在哈希链表中查找{宿IP,源IP}结点,如果在哈希链表中查找到相应的结点,则直接对该结点流量记录进行更新,如果在哈希链表中查找不到相应结点,则生成一个新的结点,具体技术步骤如下:
第一步:设置参数
设置一个指针数组I[n],n为指针数组I的大小,设置n=2m,其中m是大于0的正整数,数组I的每个元素赋值为空指针,设置一个64位长度的比特串S,设置一个哈希函数F,哈希函数F的输入是64位长度的比特串S,哈希函数F输出的哈希值是一个取值范围为0到2m-1之间的正整数,哈希函数F采用目前计算机常用的MD5哈希函数,哈希函数F选取MD5哈希函数哈希值的前m个比特作为其输出哈希值,设置一号IP地址IP1和二号IP地址IP2,设置一号IP地址到二号IP地址的流量为T1,设置二号IP地址到一号IP地址的流量为T2,设置一个结构A,结构A包括四个整数变量和一个指针变量,结构A的四个整数变量分别记录第一个IP地址、第二个IP地址、第一个IP地址到第二个IP地址的流量、第二个IP地址到第一个IP地址的流量,结构A的指针变量指向下一个结点,测量开始,如果一个新报文到达,进入第二步;
第二步:处理到达报文
读取该报文的源IP地址、宿IP地址、报文大小,比较源IP地址和宿IP地址之间的大小,如果源IP地址大于等于宿IP地址,则赋值一号IP地址IP1为源IP地址,赋值二号IP地址IP2为宿IP地址,赋值一号IP地址到二号IP地址的流量T1为该报文大小,赋值二号IP地址到一号IP地址的流量T2为0,如果源IP地址小于宿IP地址,则赋值一号IP地址IP1为宿IP地址,赋值二号IP地址IP2为源IP地址,赋值一号IP地址到二号IP地址的流量T1为0,赋值二号IP地址到一号IP地址的流量T2为该报文大小,将一号IP地址IP1赋值到64位比特串S的前32个比特,将二号IP地址IP2赋值到64位比特串S的后32个比特,将64位比特串S作为哈希函数F的输入,计算哈希值i,读取指针数组I第i个元素的指针,如果该指针为空指针,根据结构A生成一个新的结点,将第i个元素的指针指向这个新生成的结点,进入第三步,如果该指针不为空,则进入第四步;
第三步:初始化新结点
赋值这个结点的第一个IP地址为一号IP地址IP1,赋值这个结点的第二个IP地址为二号IP地址IP2,赋值这个结点的第一个IP地址到第二个IP地址的流量值为一号IP地址到二号IP地址的流量T1,赋值这个结点的第二个IP地址到第一个IP地址的流量值为二号IP地址到一号IP地址的流量T2,设置该结点的指针为空指针,进入第六步;
第四步:查找指针链表
查找指针数组I第i个元素指向的结点链表,如果在这个链表中找到一个结点,其中该结点的第一个IP地址等于一号IP地址IP1,该结点的第二个IP地址为二号IP地址IP2,进入第五步,否则根据结构A生成一个新的结点,将数组I第i个元素的指针指向结点链表的最后一个指针指向这个新生成的结点,回到第三步;
第五步:更新结点
累加一号IP地址到二号IP地址的流量T1值更新这个结点的第一个IP地址到第二个IP地址的流量值,累加二号IP地址到一号IP地址的流量T2值更新该结点的第二个IP地址到第一个IP地址的流量值,进入第六步;
第六步:测量结束
如果测量结束,进入第七步,如果测量没有结束,等待一个新报文到达,如果一个新报文到达,回到第二步;
第七步:测量结果输出
查找指针数组I中的所有的结点,将结点中的变量按照结点中的第一个IP地址、第二个IP地址、第一个IP地址到第二个IP地址的流量、第二个IP地址到第一个IP地址的流量顺序依次输出。
图1、图2是基于网络地址排序的双向流组流方法具体实施方式中涉及的示意图和流程图,图1中哈希链表数组大小为16,一共有6个结点,处理了9个报文,
该例子处理报文的{源IP、宿IP、流量大小}三元组是{2、1、120}、{4、1、100}、{1、2、150}、{9、5、220}、{1、4、50}、{5、9、350}、{8、3、180}、{2、7、60}、{3、1、80},其中源IP为2和宿IP为1所对应的64位串S为0x0000000100000002,源IP为4和宿IP为1所对应的64位串S为0x0000000100000004,源IP为9和宿IP为5所对应的64位串S为0x0000000500000009,源IP为8和宿IP为3所对应的64位串S为0x0000000300000008,源IP为7和宿IP为2所对应的64位串S为0x0000000200000007,源IP为3和宿IP为1所对应的64位串S为0x0000000100000003,同时假设哈希函数F对于输入S=0x0000000100000002的哈希值是1,输入S=0x0000000100000004的哈希值是1,输入S=0x0000000500000009的哈希值是4,输入S=0x0000000300000008的哈希值是4,输入S=0x0000000200000007的哈希值是8,输入S=0x0000000100000003的哈希值是13,
本发明实施举例的具体技术步骤如下:
(1)第一步:设置参数
设置一个指针数组I[n],n为指针数组I的大小,设置n=2m=24=16,其中m是大于0的正整数,数组I的每个元素赋值为空指针,设置一个64位长度的比特串S,设置一个哈希函数F,哈希函数F的输入是64位长度的比特串S,哈希函数F输出的哈希值是一个取值范围为0到2m-1之间的正整数,哈希函数F采用目前计算机常用的MD5哈希函数,哈希函数F选取MD5哈希函数哈希值的前m个比特作为其输出哈希值,设置一号IP地址IP1和二号IP地址IP2,设置一号IP地址到二号IP地址的流量为T1,设置二号IP地址到一号IP地址的流量为T2,设置一个结构A,结构A包括四个整数变量和一个指针变量,结构A的四个整数变量分别记录第一个IP地址、第二个IP地址、第一个IP地址到第二个IP地址的流量、第二个IP地址到第一个IP地址的流量,结构A的指针变量指向下一个结点,测量开始,如果一个新报文到达,进入(2)第二步;
(2)第二步:处理到达报文
读取该报文的源IP地址是2、宿IP地址是1、报文大小是120,比较源IP地址2和宿IP地址1之间的大小,源IP地址大于等于宿IP地址,则赋值一号IP地址IP1为源IP地址为2,赋值二号IP地址IP2为宿IP地址为1,赋值一号IP地址到二号IP地址的流量T1为该报文大小为120,赋值二号IP地址到一号IP地址的流量T2为0,将一号IP地址IP1赋值到64位比特串S的前32个比特,将二号IP地址IP2赋值到64位比特串S的后32个比特,S=0x0000000100000002,将64位比特串S作为哈希函数F的输入,计算哈希值1,读取指针数组I第1个元素的指针,该指针为空指针,根据结构A生成一个新的结点,将第1个元素的指针指向这个新生成的结点,进入(3)第三步;
(3)第三步:初始化新结点
赋值这个结点的第一个IP地址为一号IP地址IP1为2,赋值这个结点的第二个IP地址为二号IP地址IP2为1,赋值这个结点的第一个IP地址到第二个IP地址的流量值为一号IP地址到二号IP地址的流量T1为120,赋值这个结点的第二个IP地址到第一个IP地址的流量值为二号IP地址到一号IP地址的流量T2为0,设置该结点的指针为空指针,进入(4)第六步;
(4)第六步:测量结束
测量没有结束,等待一个新报文到达,如果一个新报文到达,回到(5)第二步;
(5)第二步:处理到达报文
读取该报文的源IP地址为4、宿IP地址为1、报文大小100,比较源IP地址4和宿IP地址1之间的大小,源IP地址4大于等于宿IP地址1,则赋值一号IP地址IP1为源IP地址为4,赋值二号IP地址IP2为宿IP地址为1,赋值一号IP地址到二号IP地址的流量T1为该报文大小为100,赋值二号IP地址到一号IP地址的流量T2为0,将一号IP地址IP1赋值到64位比特串S的前32个比特,将二号IP地址IP2赋值到64位比特串S的后32个比特,S=0x0000000100000004,将64位比特串S作为哈希函数F的输入,计算哈希值1,读取指针数组I第1个元素的指针,该指针不为空,则进入(6)第四步;
(6)第四步:查找指针链表
查找指针数组I第1个元素指向的结点链表,在这个链表中没有找到这个结点,则根据结构A生成一个新的结点,将数组I第1个元素的指针指向结点链表的最后一个指针指向这个新生成的结点,回到(7)第三步;
(7)第三步:初始化新结点
赋值这个结点的第一个IP地址为一号IP地址IP1为4,赋值这个结点的第二个IP地址为二号IP地址IP2为1,赋值这个结点的第一个IP地址到第二个IP地址的流量值为一号IP地址到二号IP地址的流量T1为100,赋值这个结点的第二个IP地址到第一个IP地址的流量值为二号IP地址到一号IP地址的流量T2为0,设置该结点的指针为空指针,进入(8)第六步;
(8)第六步:测量结束
测量没有结束,一个新报文到达,回到(9)第二步;
(9)第二步:处理到达报文
读取该报文的源IP地址为1、宿IP地址为2、报文大小为150,比较源IP地址1和宿IP地址2之间的大小,源IP地址1小于宿IP地址2,则赋值一号IP地址IP1为宿IP地址为2,赋值二号IP地址IP2为源IP地址为1,赋值一号IP地址到二号IP地址的流量T1为0,赋值二号IP地址到一号IP地址的流量T2为该报文大小为150,将一号IP地址IP1赋值到64位比特串S的前32个比特,将二号IP地址IP2赋值到64位比特串S的后32个比特,S=0x0000000100000002,将64位比特串S作为哈希函数F的输入,计算哈希值1,读取指针数组I第1个元素的指针,该指针不为空,则进入(10)第四步;
(10)第四步:查找指针链表
查找指针数组I第1个元素指向的结点链表,在这个链表中找到一个结点,其中该结点的第一个IP地址等于一号IP地址IP1,该结点的第二个IP地址为二号IP地址IP2,进入(11)第五步;
(11)第五步:更新结点
累加一号IP地址到二号IP地址的流量T1值0更新这个结点的第一个IP地址到第二个IP地址的流量值,更新后结果为120,累加二号IP地址到一号IP地址的流量T2值150更新该结点的第二个IP地址到第一个IP地址的流量值,更新后结果为150,进入(12)第六步;
(12)第六步:测量结束
测量没有结束,一个新报文到达,回到(13)第二步;
(13)第二步:处理到达报文
读取该报文的源IP地址9、宿IP地址5、报文大小220,比较源IP地址9和宿IP地址5之间的大小,源IP地址9大于等于宿IP地址5,则赋值一号IP地址IP1为源IP地址为9,赋值二号IP地址IP2为宿IP地址为5,赋值一号IP地址到二号IP地址的流量T1为该报文大小为220,赋值二号IP地址到一号IP地址的流量T2为0,将一号IP地址IP1赋值到64位比特串S的前32个比特,将二号IP地址IP2赋值到64位比特串S的后32个比特,S=0x0000000500000009,将64位比特串S作为哈希函数F的输入,计算哈希值4,读取指针数组I第4个元素的指针,该指针为空指针,根据结构A生成一个新的结点,将第4个元素的指针指向这个新生成的结点,进入(14)第三步;
(14)第三步:初始化新结点
赋值这个结点的第一个IP地址为一号IP地址IP1为9,赋值这个结点的第二个IP地址为二号IP地址IP2为5,赋值这个结点的第一个IP地址到第二个IP地址的流量值为一号IP地址到二号IP地址的流量T1为220,赋值这个结点的第二个IP地址到第一个IP地址的流量值为二号IP地址到一号IP地址的流量T2为0,设置该结点的指针为空指针,进入(15)第六步;
(15)第六步:测量结束
测量没有结束,一个新报文到达,回到(16)第二步;
(16)第二步:处理到达报文
读取该报文的源IP地址为1、宿IP地址为4、报文大小50,比较源IP地址1和宿IP地址4之间的大小,源IP地址1小于宿IP地址4,则赋值一号IP地址IP1为宿IP地址为4,赋值二号IP地址IP2为源IP地址为1,赋值一号IP地址到二号IP地址的流量T1为0,赋值二号IP地址到一号IP地址的流量T2为该报文大小为,将一号IP地址IP1赋值到64位比特串S的前32个比特,将二号IP地址IP2赋值到64位比特串S的后32个比特,S=0x0000000100000004,将64位比特串S作为哈希函数F的输入,计算哈希值1,读取指针数组I第1个元素的指针,该指针不为空,则进入(16A)第四步;
(16A)第四步:查找指针链表
查找指针数组I第1个元素指向的结点链表,在这个链表中找到一个结点,其中该结点的第一个IP地址等于一号IP地址IP1,该结点的第二个IP地址为二号IP地址IP2,进入(17)第五步;
(17)第五步:更新结点
累加一号IP地址到二号IP地址的流量T1值0更新这个结点的第一个IP地址到第二个IP地址的流量值,累加后结果为100,累加二号IP地址到一号IP地址的流量T2值50更新该结点的第二个IP地址到第一个IP地址的流量值,累加后结果为50,进入(18)第六步;
(18)第六步:测量结束
测量没有结束,一个新报文到达,回到(19)第二步;
(19)第二步:处理到达报文
读取该报文的源IP地址为5、宿IP地址为9、报文大小为350,比较源IP地址5和宿IP地址9之间的大小,源IP地址5小于宿IP地址9,则赋值一号IP地址IP1为宿IP地址为9,赋值二号IP地址IP2为源IP地址为5,赋值一号IP地址到二号IP地址的流量T1为0,赋值二号IP地址到一号IP地址的流量T2为该报文大小为350,将一号IP地址IP1赋值到64位比特串S的前32个比特,将二号IP地址IP2赋值到64位比特串S的后32个比特,S=0x0000000500000009,将64位比特串S作为哈希函数F的输入,计算哈希值为4,读取指针数组I第4个元素的指针,该指针不为空,则进入(20)第四步;
(20)第四步:查找指针链表
查找指针数组I第4个元素指向的结点链表,在这个链表中找到一个结点,其中该结点的第一个IP地址等于一号IP地址IP1,该结点的第二个IP地址为二号IP地址IP2,进入(21)第五步;
(21)第五步:更新结点
累加一号IP地址到二号IP地址的流量T1值0更新这个结点的第一个IP地址到第二个IP地址的流量值,更新后的结果为220,累加二号IP地址到一号IP地址的流量T2值350更新该结点的第二个IP地址到第一个IP地址的流量值,更新后结果为350,进入(22)第六步;
(22)第六步:测量结束
测量没有结束,一个新报文到达,回到(23)第二步;
(23)第二步:处理到达报文
读取该报文的源IP地址为8、宿IP地址为3、报文大小为180,比较源IP地址8和宿IP地址3之间的大小,源IP地址8大于宿IP地址3,则赋值一号IP地址IP1为源IP地址为8,赋值二号IP地址IP2为宿IP地址为3,赋值一号IP地址到二号IP地址的流量T1为该报文大小为180,赋值二号IP地址到一号IP地址的流量T2为0,将一号IP地址IP1赋值到64位比特串S的前32个比特,将二号IP地址IP2赋值到64位比特串S的后32个比特,S=0x0000000300000008,将64位比特串S作为哈希函数F的输入,计算哈希值为4,读取指针数组I第4个元素的指针,该指针不为空,则进入(24)第四步;
(24)第四步:查找指针链表
查找指针数组I第4个元素指向的结点链表,在这个链表中没有找到一个结点,其中该结点的第一个IP地址等于一号IP地址IP1,该结点的第二个IP地址为二号IP地址IP2,根据结构A生成一个新的结点,将数组I第4个元素的指针指向结点链表的最后一个指针指向这个新生成的结点,回到(25)第三步;
(25)第三步:初始化新结点
赋值这个结点的第一个IP地址为一号IP地址IP1为8,赋值这个结点的第二个IP地址为二号IP地址IP2为3,赋值这个结点的第一个IP地址到第二个IP地址的流量值为一号IP地址到二号IP地址的流量T1为180,赋值这个结点的第二个IP地址到第一个IP地址的流量值为二号IP地址到一号IP地址的流量T2为0,设置该结点的指针为空指针,进入(26)第六步;
(26)第六步:测量结束
测量没有结束,一个新报文到达,回到(27)第二步;
(27)第二步:处理到达报文
读取该报文的源IP地址为2、宿IP地址为7、报文大小为60,比较源IP地址2和宿IP地址7之间的大小,源IP地址2小于宿IP地址7,则赋值一号IP地址IP1为宿IP地址为7,赋值二号IP地址IP2为源IP地址为2,赋值一号IP地址到二号IP地址的流量T1为0,赋值二号IP地址到一号IP地址的流量T2为该报文大小为60,将一号IP地址IP1赋值到64位比特串S的前32个比特,将二号IP地址IP2赋值到64位比特串S的后32个比特,将64位比特串S作为哈希函数F的输入,S=0x0000000200000007,计算哈希值8,读取指针数组I第8个元素的指针,该指针为空指针,根据结构A生成一个新的结点,将第8个元素的指针指向这个新生成的结点,进入(28)第三步;
(28)第三步:初始化新结点
赋值这个结点的第一个IP地址为一号IP地址IP1为7,赋值这个结点的第二个IP地址为二号IP地址IP2为2,赋值这个结点的第一个IP地址到第二个IP地址的流量值为一号IP地址到二号IP地址的流量T1为0,赋值这个结点的第二个IP地址到第一个IP地址的流量值为二号IP地址到一号IP地址的流量T2为60,设置该结点的指针为空指针,进入(29)第六步;
(29)第六步:测量结束
测量没有结束,一个新报文到达,回到(30)第二步;
(30)第二步:处理到达报文
读取该报文的源IP地址为3、宿IP地址为1、报文大小为80,比较源IP地址3和宿IP地址1之间的大小,源IP地址3大于宿IP地址1,则赋值一号IP地址IP1为源IP地址为3,赋值二号IP地址IP2为宿IP地址为1,赋值一号IP地址到二号IP地址的流量T1为该报文大小为80,赋值二号IP地址到一号IP地址的流量T2为0,将一号IP地址IP1赋值到64位比特串S的前32个比特,将二号IP地址IP2赋值到64位比特串S的后32个比特,S=0x0000000100000003,将64位比特串S作为哈希函数F的输入,计算哈希值为13,读取指针数组I第13个元素的指针,如果该指针为空指针,根据结构A生成一个新的结点,将第13个元素的指针指向这个新生成的结点,进入(30A)第三步;
(30A)第三步:初始化新结点
赋值这个结点的第一个IP地址为一号IP地址IP1为3,赋值这个结点的第二个IP地址为二号IP地址IP2为1,赋值这个结点的第一个IP地址到第二个IP地址的流量值为一号IP地址到二号IP地址的流量T1为80,赋值这个结点的第二个IP地址到第一个IP地址的流量值为二号IP地址到一号IP地址的流量T2为0,设置该结点的指针为空指针,进入(31)第六步;
(31)第六步:测量结束
测量结束,进入(32)第七步;
(32)第七步:测量结果输出
查找指针数组I中的所有的结点,将结点中的变量按照结点中的第一个IP地址、第二个IP地址、第一个IP地址到第二个IP地址的流量、第二个IP地址到第一个IP地址的流量顺序依次输出。
输出结果为: