具体实施方式
一种基于数组链表的大流量网络地址前缀识别方法,其特征是:建立一个用于记录IP地址前缀流量信息的8层结构,每层结构记录IP地址的4个比特前缀流量信息且每层结构至少包括一个结点,其中,第0层记录IP地址的第0个至第3个比特流量信息,第1层记录IP地址的第4个至第7个比特流量信息,第2层记录IP地址的第8个至第11个比特流量信息,第3层记录IP地址的第12个至第15个比特流量信息,第4层记录IP地址的第16个至第19个比特流量信息,第5层记录IP地址的第20个至第23个比特流量信息,第6层记录IP地址的第24个至第27个比特流量信息,第7层记录IP地址的第28个至第31个比特流量信息,每个被测量的IP地址及其前缀的流量信息被记录在8层结构中,测量结束后,对于流量超过阀值的大流量网络地址前缀,其相应的网络地址前缀、网络地址前缀长度和网络地址前缀的流量大小输出,具体步骤如下:
第一步:设置参数
设置大流量网络地址前缀流量阀值T,设置结点数据结构S,结点数据结构由一个结点头和一个包括16个子结点的数组构成,结点头包括一个用于记录该结点的网络地址前缀的存储器、记录该结点的网络地址前缀长度的存储器和记录该结点流量的结点计数器构成,每个子结点由一个记录流量的子结点计数器和一个指向下一个结点的指针构成,设置一个当前指针指向当前处理结点,设置一个指针数组P[p],指针数值P的大小为p,p的大小设置为要处理IP地址数量的8倍,设置指针数组P的当前指针数q为0,进入第二步;
第二步:测量初始化
按照结点数据结构S生成一个新结点作为第0层结点,设置一个指针变量Ipointer指向该新结点,设置该新结点的结点头的网络地址前缀为0,网络地址前缀长度为0,流量大小为0,设置16个子结点中的每个元素的流量大小为0,指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第q个元素中,并设置当前指针数q为q+1,输入第一个IP地址及其流量大小,进入第三步;
第三步:预处理
假设IP地址流量大小为B字节,将IP地址32个比特分成8块,每4个比特为一块,其中第0至第3比特为第0块,第4至第7比特为第1块,第8至第11比特为第2块,第12至第15比特为第3块,第16至第19比特为第4块,第20至第23比特为第5块,第24至第27比特为第6块,第28至第31比特为第7块,
设当前层数为i,i=0,将第0层结点指针Ipointer赋值给当前指针,进入第四步;
第四步:结点更新
将IP地址流量大小B累加更新到当前指针指向的结点的结点计数器中,该结点所对应的4个比特为IP地址的第i块,对应IP地址的第4*i比特、4*i+1比特、4*i+2比特、4*i+3比特,每个比特所对应的比特值分别为b4*i、b4*i+1、b4*i+2、b4*i+3,计算这4个比特所对应的10进制整数x为8*b4*i+4*b4*i+1+2*b4*i+2+b4*i+3,查找该结点中的第x个子结点,将该IP地址流量大小累加更新到第x个子结点的子结点计数器中,进入第五步;
第五步:指向下一层结点
如果当前层i等于7,则表示已经进入到最后一层,该IP地址处理结束,进入第八步,否则检查第x子结点的指向下一层的指针,如果指向下一层指针不为空,进入第七步,如果指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到第六步;
第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值乘以16加上x,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值加上4,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第q个元素中,并设置当前指针数q为q+1,进入第七步;
第七步:设置当前处理
将第x子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=i+1,回到第四步;
第八步:判断IP地址处理结束
如果IP地址及其流量记录没有处理结束,处理下一个IP地址及其流量大小,回到第三步,如果所有的IP地址都处理结束,进入第九步;
第九步:读取指针数组中的结点指针
设当前指针j为0,从指针数组P中读取第j个指针,进入第十步;
第十步:结点输出判断
如果第j个指针指向的结点头的流量计数器值大于大流量网络地址前缀阀值T,进入第十一步,否则进入第十六步;
第十一步:设置次结点
将第j个指针指向的结点划分为4个大小为1比特的子层,其中第0子层至第3子层分别有2、4、8、16个次结点,其中第3子层对应的16个次结点就是第j个指针指向的结点的16个子结点,假设当前子层m为0,当前次结点n为0,进入第十二步;
第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第j个指针指向的结点的网络地址前缀长度加上m+1,当前次结点的网络地址前缀为第j个指针指向的结点的网络地址前缀乘以2(m+1)加上n,如果当前子层m等于3,则当前次结点流量大小为第j个指针指向的结点的第n个子结点的流量大小,进入第十三步;如果当前子层m小于3,当前次结点对应的流量大小为第j个指针指向的结点的第n*2(3-m)个子结点到第(n+1)*2(3-m)-1个子结点的流量累加和,进入第十三步;
第十三步:大流量网络地址前缀输出
如果当前次结点的流量大于大流量网络地址前缀阀值T,则输出当前次结点的网络地址前缀、网络地址前缀长度和流量大小,进入第十四步,否则直接进入第十五步;
第十四步:设置大流量网络地址前缀次结点的下一个次结点序号
如果m小于3,设置m=m+1,n等于2*n,回到第十二步,如果m等于3,n为偶数,则设置n=n+1,回到第十二步,如果m等于3,n为奇数,且n小于15,则设置m=m-1,n=(n+1)/2,回到第十二步,如果m等于3,n等于15,则进入第十六步;
第十五步:设置非大流量网络地址前缀次结点的下一个次结点序号
如果n为偶数,则设置n=n+1,回到第十二步,如果n为奇数,n小于2(m+1)-1,且m大于0,则设置m=m-1,n=(n+1)/2,回到第十二步,如果n为奇数,且n等于2(m+1)-1,则进入第十六步;
第十六步:下一个被处理的结点
如果指针数组P的当前结点指针j小于当前指针数q-1,设置当前结点指针j为j+1,回到第十步,否则结束退出。
图1、图2、图3是基于数组链表的大流量网络地址前缀检测方法表示具体实施方式中涉及的结点结构图、分层结构示例图和流程图,该例子中处理的IP地址0.1.32.83,流量90字节,IP地址1.2.1.35,流量50字节,
本发明实施举例的具体技术步骤如下:
(1)第一步:设置参数
设置大流量网络地址前缀流量阀值T为100字节,设置图1的结点数据结构S,结点数据结构由一个结点头和一个包括16个子结点的数组构成,结点头包括一个用于记录该结点的网络地址前缀的存储器、记录该结点的网络地址前缀长度的存储器和记录该结点流量的结点计数器构成,每个子结点由一个记录流量的子结点计数器和一个指向下一个结点的指针构成,设置一个当前指针指向当前处理结点,设置一个指针数组P[p],指针数值P的大小p为24,p的大小设置为要处理IP地址数量的8倍,设置指针数组P的当前指针数q为0,进入(2)第二步;
(2)第二步:测量初始化
按照结点数据结构S生成一个新结点作为第0层结点,设置一个指针变量Ipointer指向该新结点,设置该新结点的结点头的网络地址前缀为0,网络地址前缀长度为0,流量大小为0,设置16个子结点中的每个元素的流量大小为0,指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第0个元素中,并设置当前指针数q为0+1=1,输入第一个IP地址0.1.32.83及其流量大小90字节,进入(3)第三步;
(3)第三步:预处理
IP地址0.1.32.83的流量大小为90字节,将IP地址32个比特分成8块,每4个比特为一块,其中第0至第3比特为第0块,第4至第7比特为第1块,第8至第11比特为第2块,第12至第15比特为第3块,第16至第19比特为第4块,第20至第23比特为第5块,第24至第27比特为第6块,第28至第31比特为第7块,
设当前层数为i,i=0,将第0层结点指针Ipointer赋值给当前指针,进入(4)第四步;
(4)第四步:结点更新
将IP地址0.1.32.83流量大小90字节累加更新到当前指针指向的结点的结点计数器中,该结点所对应的4个比特为IP的第0块,对应IP地址的第0比特、1比特、2比特、3比特,每个比特所对应的比特值分别为0、0、0、0,计算这4个比特所对应的10进制整数x为8*0+4*0+2*0+0=0,查找该结点中的第0个子结点,将该IP流量大小累加更新到第0个子结点的子结点计数器中,进入(5)第五步;
(5)第五步:指向下一层结点
检查第0子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(6)第六步;
(6)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值0乘以16加上0,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值0加上4,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第1个元素中,并设置当前指针数q为1+1=2,进入(7)第七步;
(7)第七步:设置当前处理
将第0子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=0+1=1,回到(8)第四步;
(8)第四步:结点更新
将IP地址0.1.32.83流量大小90字节累加更新到当前指针指向的结点的结点计数器中,该结点所对应的4个比特为IP的第1块,对应IP地址的第4比特、5比特、6比特、7比特,每个比特所对应的比特值分别为0、0、0、0,计算这4个比特所对应的10进制整数x为8*0+4*0+2*0+0=0,查找该结点中的第0个子结点,将该IP流量大小累加更新到第0个子结点的子结点计数器中,进入(9)第五步;
(9)第五步:指向下一层结点
检查第0子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(10)第六步;
(10)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值0乘以16加上0,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值4加上4等于8,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第2个元素中,并设置当前指针数q为2+1=3,进入(11)第七步;
(11)第七步:设置当前处理
将第0子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=1+1=2,回到(12)第四步;
(12)第四步:结点更新
将IP地址0.1.32.83流量大小90字节累加更新到当前指针指向的结点的结点计数器中,该结点所对应的4个比特为IP的第2块,对应IP地址的第8比特、9比特、10比特、11比特,每个比特所对应的比特值分别为0、0、0、0,计算这4个比特所对应的10进制整数x为8*0+4*0+2*0+0=0,查找该结点中的第0个子结点,将该IP流量大小累加更新到第0个子结点的子结点计数器中,进入(13)第五步;
(13)第五步:指向下一层结点
检查第0子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(14)第六步;
(14)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值0乘以16加上0,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值8加上4等于12,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第3个元素中,并设置当前指针数q为3+1=4,进入(15)第七步;
(15)第七步:设置当前处理
将第0子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=2+1=3,回到(16)第四步;
(16)第四步:结点更新
将IP地址0.1.32.83流量大小90字节累加更新到当前指针指向的结点的结点计数器中,该结点所对应的4个比特为IP的第3块,对应IP地址的第12比特、13比特、14比特、15比特,每个比特所对应的比特值分别为0、0、0、1,计算这4个比特所对应的10进制整数x为8*0+4*0+2*0+1=1,查找该结点中的第1个子结点,将该IP流量大小90累加更新到第1个子结点的子结点计数器中,进入(17)第五步;
(17)第五步:指向下一层结点
检查第1子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(18)第六步;
(18)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值0乘以16加上1等于1,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值12加上4等于16,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第4个元素中,并设置当前指针数q为4+1=5,进入(19)第七步;
(19)第七步:设置当前处理
将第1子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=3+1=4,回到(20)第四步;
(20)第四步:结点更新
将IP地址0.1.32.83流量大小90字节累加更新到当前指针指向的结点的结点计数器中,该结点所对应的4个比特为IP的第4块,对应IP地址的第16比特、17比特、18比特、19比特,每个比特所对应的比特值分别为0、0、1、0,计算这4个比特所对应的10进制整数x为8*0+4*0+2*1+0=2,查找该结点中的第2个子结点,将该IP流量大小90累加更新到第2个子结点的子结点计数器中,进入(21)第五步;
(21)第五步:指向下一层结点
检查第2子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(22)第六步;
(22)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值1乘以16加上2等于18,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值16加上4等于20,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第5个元素中,并设置当前指针数q为5+1=6,进入(23)第七步;
(23)第七步:设置当前处理
将第2子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=4+1=5,回到(24)第四步;
(24)第四步:结点更新
将IP地址0.1.32.83流量大小90字节累加更新到当前指针指向的结点的结点计数器中,该结点所对应的4个比特为IP的第5块,对应IP地址的第20比特、21比特、22比特、23比特,每个比特所对应的比特值分别为0、0、0、0,计算这4个比特所对应的10进制整数x为8*0+4*0+2*0+0=0,查找该结点中的第0个子结点,将该IP流量大小90累加更新到第0个子结点的子结点计数器中,进入(25)第五步;
(25)第五步:指向下一层结点
检查第0子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(26)第六步;
(26)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值18乘以16加上0等于288,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值20加上4等于24,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第6个元素中,并设置当前指针数q为6+1=7,进入(27)第七步;
(27)第七步:设置当前处理
将第0子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=5+1=6,回到(28)第四步;
(28)第四步:结点更新
将IP地址0.1.32.83流量大小90字节累加更新到当前指针指向的结点的结点计数器中,该结点所对应的4个比特为IP的第6块,对应IP地址的第24比特、25比特、26比特、27比特,每个比特所对应的比特值分别为0、1、0、1,计算这4个比特所对应的10进制整数x为8*0+4*1+2*0+1=5,查找该结点中的第5个子结点,将该IP流量大小90累加更新到第0个子结点的子结点计数器中,进入(29)第五步;
(29)第五步:指向下一层结点
检查第0子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(30)第六步;
(30)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值288乘以16加上5等于4613,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值24加上4等于28,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第7个元素中,并设置当前指针数q为7+1=8,进入(31)第七步;
(31)第七步:设置当前处理
将第0子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=6+1=7,回到(32)第四步;
(32)第四步:结点更新
将IP地址0.1.32.83流量大小90字节累加更新到当前指针指向的结点的结点计数器中,该结点所对应的4个比特为IP的第7块,对应IP地址的第28比特、29比特、30比特、31比特,每个比特所对应的比特值分别为0、0、1、1,计算这4个比特所对应的10进制整数x为8*0+4*0+2*1+1=3,查找该结点中的第3个子结点,将该IP流量大小90累加更新到第0个子结点的子结点计数器中,进入(33)第五步;
(33)第五步:指向下一层结点
当前层i等于7,则表示已经进入到最后一层,该IP地址处理结束,进入(34)第八步;
(34)第八步:判断IP地址处理结束
如果IP地址及其流量记录没有处理结束,处理下一个IP地址1.2.1.35及其流量50字节,回到(35)第三步;
(35)第三步:预处理
IP地址1.2.1.35流量大小为50字节,将IP地址32个比特分成8块,每4个比特为一块,其中第0至第3比特为第0块,第4至第7比特为第1块,第8至第11比特为第2块,第12至第15比特为第3块,第16至第19比特为第4块,第20至第23比特为第5块,第24至第27比特为第6块,第28至第31比特为第7块,
设当前层数为i,i=0,将第0层结点指针Ipointer赋值给当前指针,进入(36)第四步;
(36)第四步:结点更新
将IP地址1.2.1.35流量大小50累加更新到当前指针指向的结点的结点计数器中,更新后其值为140字节,该结点所对应的4个比特为IP的第0块,对应IP地址的第0比特、1比特、2比特、3比特,每个比特所对应的比特值分别为0、0、0、0,计算这4个比特所对应的10进制整数x为8*0+4*0+2*0+0=0,查找该结点中的第0个子结点,将该IP流量50累加更新到第0个子结点的子结点计数器中,进入(37)第五步;
(37)第五步:指向下一层结点
当前层i等于0,检查第0子结点的指向下一层的指针,指向下一层指针不为空,进入到(38)第七步;
(38)第七步:设置当前处理
将第0子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=0+1=1,回到(39)第四步;
(39)第四步:结点更新
将IP地址1.2.1.35流量大小50累加更新到当前指针指向的结点的结点计数器中,更新后其值为50字节,该结点所对应的4个比特为IP的第1块,对应IP地址的第4比特、5比特、6比特、7比特,每个比特所对应的比特值分别为0、0、0、1,计算这4个比特所对应的10进制整数x为8*0+4*0+2*0+1=1,查找该结点中的第1个子结点,将该IP流量大小累加更新到第1个子结点的子结点计数器中,进入(40)第五步;
(40)第五步:指向下一层结点
当前层i等于1,检查第1子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(41)第六步;
(41)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值0乘以16加上1,其值等于1,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值4加上4等于8,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第8个元素中,并设置当前指针数q为8+1=9,进入(42)第七步;
(42)第七步:设置当前处理
将第1子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=1+1=2,回到(43)第四步;
(44)第四步:结点更新
将IP地址1.2.1.35流量大小50累加更新到当前指针指向的结点的结点计数器中,更新后其值为50字节,该结点所对应的4个比特为IP的第2块,对应IP地址的第8比特、9比特、10比特、11比特,每个比特所对应的比特值分别为0、0、0、0,计算这4个比特所对应的10进制整数x为8*0+4*0+2*0+0=0,查找该结点中的第0个子结点,将该IP流量大小累加更新到第0个子结点的子结点计数器中,进入(44)第五步;
(44)第五步:指向下一层结点
当前层i等于2,检查第0子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(46)第六步;
(46)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值1乘以16加上0,其值等于16,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值8加上4等于12,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第9个元素中,并设置当前指针数q为9+1=10,进入(46)第七步;
(46)第七步:设置当前处理
将第0子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=2+1=3,回到(47)第四步;
(47)第四步:结点更新
将IP地址1.2.1.35流量大小50累加更新到当前指针指向的结点的结点计数器中,更新后其值为50字节,该结点所对应的4个比特为IP的第3块,对应IP地址的第12比特、13比特、14比特、15比特,每个比特所对应的比特值分别为0、0、1、0,计算这4个比特所对应的10进制整数x为8*0+4*0+2*1+0=2,查找该结点中的第2个子结点,将该IP流量大小累加更新到第2个子结点的子结点计数器中,进入(48)第五步;
(48)第五步:指向下一层结点
当前层i等于3,检查第2子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(49)第六步;
(49)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值16乘以16加上2,其值等于258,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值12加上4等于16,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第10个元素中,并设置当前指针数q为10+1=11,进入(50)第七步;
(50)第七步:设置当前处理
将第2子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=3+1=4,回到(51)第四步;
(51)第四步:结点更新
将IP地址1.2.1.35流量大小50累加更新到当前指针指向的结点的结点计数器中,更新后其值为50字节,该结点所对应的4个比特为IP的第4块,对应IP地址的第16比特、17比特、18比特、19比特,每个比特所对应的比特值分别为0、0、0、0,计算这4个比特所对应的10进制整数x为8*0+4*0+2*0+0=0,查找该结点中的第0个子结点,将该IP流量大小累加更新到第0个子结点的子结点计数器中,进入(52)第五步;
(52)第五步:指向下一层结点
当前层i等于4,检查第0子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(53)第六步;
(53)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值258乘以16加上0,其值等于4128,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值16加上4等于20,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第11个元素中,并设置当前指针数q为11+1=12,进入(54)第七步;
(54)第七步:设置当前处理
将第0子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=4+1=5,回到(55)第四步;
(55)第四步:结点更新
将IP地址1.2.1.35流量大小50累加更新到当前指针指向的结点的结点计数器中,更新后其值为50字节,该结点所对应的4个比特为IP的第5块,对应IP地址的第20比特、21比特、22比特、23比特,每个比特所对应的比特值分别为0、0、0、1,计算这4个比特所对应的10进制整数x为8*0+4*0+2*0+1=1,查找该结点中的第1个子结点,将该IP流量大小累加更新到第1个子结点的子结点计数器中,进入(56)第五步;
(56)第五步:指向下一层结点
当前层i等于5,检查第1子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(57)第六步;
(57)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值4128乘以16加上1,其值等于66049,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值20加上4等于24,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第12个元素中,并设置当前指针数q为12+1=13,进入(58)第七步;
(58)第七步:设置当前处理
将第1个子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=5+1=6,回到(59)第四步;
(59)第四步:结点更新
将IP地址1.2.1.35流量大小50累加更新到当前指针指向的结点的结点计数器中,更新后其值为50字节,该结点所对应的4个比特为IP的第6块,对应IP地址的第24比特、25比特、26比特、27比特,每个比特所对应的比特值分别为0、0、1、0,计算这4个比特所对应的10进制整数x为8*0+4*0+2*1+0=2,查找该结点中的第2个子结点,将该IP流量大小累加更新到第2个子结点的子结点计数器中,进入(60)第五步;
(60)第五步:指向下一层结点
当前层i等于6,检查第2个子结点的指向下一层的指针,指向下一层指针为空,则按照结点结构S生成一个新结点,将指向下一层指针赋值为新生成结点的地址,进入到(61)第六步;
(61)第六步:初始化新结点
将该新结点结点头的网络地址前缀存储器的值设置为当前指针指向的结点头中网络地址前缀存储器的值66049乘以16加上2,其值等于1056786,新结点结点头的网络地址前缀长度存储器的值为当前指针指向的结点头中网络地址前缀长度存储器的值24加上4等于28,新结点结点头中结点计数器的值设置为0,设置新结点的16个子结点中的每个子结点的子结点计数器的值为0,每个指向下一个结点的指针为空,将该新结点的指针赋值到指针数组P的第13个元素中,并设置当前指针数q为13+1=14,进入(62)第七步;
(62)第七步:设置当前处理
将第2个子结点指针指向的下一层结点的指针赋值给当前指针,设置当前层为i=6+1=7,回到(63)第四步;
(63)第四步:结点更新
将IP地址1.2.1.35流量大小50累加更新到当前指针指向的结点的结点计数器中,更新后其值为50字节,该结点所对应的4个比特为IP的第7块,对应IP地址的第28比特、29比特、30比特、31比特,每个比特所对应的比特值分别为0、0、1、1,计算这4个比特所对应的10进制整数x为8*0+4*0+2*1+1=3,查找该结点中的第3个子结点,将该IP流量大小累加更新到第3个子结点的子结点计数器中,进入(64)第五步;
(64)第五步:指向下一层结点
当前层i等于7,则表示已经进入到最后一层,该IP地址处理结束,进入(65)第八步;
(65)第八步:判断IP地址处理结束
所有的IP地址都处理结束,进入(66)第九步;
(66)第九步:读取指针数组中的结点指针
设当前指针j为0,从指针数组P中读取第0个指针,进入(67)第十步;
(67)第十步:结点输出判断
第0个指针指向的结点头的流量计数器值140字节大于大流量网络地址前缀阀值T的100字节,进入(68)第十一步;
(68)第十一步:设置次结点
将第0个指针指向的结点划分为4个大小为1比特的子层,其中第0子层至第3子层分别有2、4、8、16个次结点,其中第3层对应的16个次结点就是第0个指针指向的结点的16个子结点,假设当前子层m为0,当前次结点n为0,进入(69)第十二步;
(69)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第0个指针指向的结点的网络地址前缀长度0加上0+1=1,当前次结点的网络地址前缀为第0个指针指向的结点的网络地址前缀0乘以2(0+1)加上0等于0,当前子层0小于3,当前次结点对应的流量大小为第0个指针指向的结点的第0个子结点到第7个子结点的流量累加和,其值等于140字节,进入(70)第十三步;
(70)第十三步:大流量网络地址前缀输出
当前次结点的流量140字节大于大流量网络地址前缀阀值T的100字节,则输出当前次结点的网络地址前缀0、网络地址前缀长度1和流量大小140字节,进入(71)第十四步;
(71)第十四步:设置大流量网络地址前缀次结点的下一个次结点序号
m=0小于3,设置m=0+1=1,n=2*0=0,回到(72)第十二步;
(72)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第0个指针指向的结点的网络地址前缀长度0加上1+1=2,当前次结点的网络地址前缀为第0个指针指向的结点的网络地址前缀0乘以2(1+1)加上0等于0,当前子层1小于3,当前次结点对应的流量大小为第0个指针指向的结点的第0个子结点到第3个子结点的流量累加和,其值为140字节,进入(73)第十三步;
(73)第十三步:大流量网络地址前缀输出
当前次结点的流量140字节大于大流量网络地址前缀阀值T的100字节,则输出当前次结点的网络地址前缀0、网络地址前缀长度2和流量大小140字节,进入(74)第十四步;
(74)第十四步:设置大流量网络地址前缀次结点的下一个次结点序号
m=1小于3,设置m=1+1=2,n=2*0=0,回到(75)第十二步;
(75)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第0个指针指向的结点的网络地址前缀长度0加上2+1=3,当前次结点的网络地址前缀为第0个指针指向的结点的网络地址前缀0乘以2(2+1)加上0等于0,当前子层2小于3,当前次结点对应的流量大小为第0个指针指向的结点的第0个子结点到第1个子结点的流量累加和,其值为140字节,进入(76)第十三步;
(76)第十三步:大流量网络地址前缀输出
当前次结点的流量140字节大于大流量网络地址前缀阀值T的100字节,则输出当前次结点的网络地址前缀0、网络地址前缀长度3和流量大小140字节,进入(77)第十四步;
(77)第十四步:设置大流量网络地址前缀次结点的下一个次结点序号
m=2小于3,设置m=2+1=3,n=2*0=0,回到(78)第十二步;
(78)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第0个指针指向的结点的网络地址前缀长度0加上3+1=4,当前次结点的网络地址前缀为第0个指针指向的结点的网络地址前缀0乘以2(3+1)加上0等于0,当前子层3等于3,当前次结点对应的流量大小为第0个指针指向的结点的第0个子结点流量,其值为140字节,进入(79)第十三步;
(79)第十三步:大流量网络地址前缀输出
当前次结点的流量140字节大于大流量网络地址前缀阀值T的100字节,则输出当前次结点的网络地址前缀0、网络地址前缀长度4和流量大小140字节,进入(80)第十四步;
(80)第十四步:设置大流量网络地址前缀次结点的下一个次结点序号
m=3等于3,n=0为偶数,设置n=0+1=1,回到(81)第十二步;
(81)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第0个指针指向的结点的网络地址前缀长度0加上3+1=4,当前次结点的网络地址前缀为第0个指针指向的结点的网络地址前缀0乘以2(3+1)加上0等于0,当前子层3等于3,当前次结点对应的流量大小为第0个指针指向的结点的第1个子结点流量,其值为0字节,进入(82)第十三步;
(82)第十三步:大流量网络地址前缀输出
当前次结点的流量0字节小于大流量网络地址前缀阀值T的100字节,进入(83)第十五步;
(83)第十五步:设置非大流量网络地址前缀次结点的下一个次结点序号
n=1为奇数,n小于23+1-1=15,且m=3大于0,则设置m=3-1=2,n=(1+1)/2=1,回到(84)第十二步;
(84)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第0个指针指向的结点的网络地址前缀长度0加上2+1=3,当前次结点的网络地址前缀为第0个指针指向的结点的网络地址前缀0乘以2(2+1)加上0等于0,当前子层2小于3,当前次结点对应的流量大小为第0个指针指向的结点的第2个和第3个子结点流量之和,其值为0字节,进入(85)第十三步;
(85)第十三步:大流量网络地址前缀输出
当前次结点的流量0字节小于大流量网络地址前缀阀值T的100字节,进入(86)第十五步;
(86)第十五步:设置非大流量网络地址前缀次结点的下一个次结点序号
n=1为奇数,n小于22+1-1=7,且m=2大于0,则设置m=2-1=1,n=(1+1)/2=1,回到(87)第十二步;
(87)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第0个指针指向的结点的网络地址前缀长度0加上1+1=2,当前次结点的网络地址前缀为第0个指针指向的结点的网络地址前缀0乘以2(1+1)加上0等于0,当前子层1小于3,当前次结点对应的流量大小为第0个指针指向的结点的第4个至第7个子结点流量之和,其值为0字节,进入(88)第十三步;
(88)第十三步:大流量网络地址前缀输出
当前次结点的流量0字节小于大流量网络地址前缀阀值T的100字节,进入(89)第十五步;
(89)第十五步:设置非大流量网络地址前缀次结点的下一个次结点序号
n=1为奇数,n小于21+1-1=3,且m=1大于0,则设置m=1-1=0,n=(1+1)/2=1,回到(90)第十二步;
(90)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第0个指针指向的结点的网络地址前缀长度0加上0+1=2,当前次结点的网络地址前缀为第0个指针指向的结点的网络地址前缀0乘以2(0+1)加上0等于0,当前子层0小于3,当前次结点对应的流量大小为第0个指针指向的结点的第8个至第15个子结点流量之和,其值为0字节,进入(91)第十三步;
(91)第十三步:大流量网络地址前缀输出
当前次结点的流量0字节小于大流量网络地址前缀阀值T的100字节,进入(29)第十五步;
(92)第十五步:设置非大流量网络地址前缀次结点的下一个次结点序号
n=1为奇数,n等于20+1-1=1,则进入(93)第十六步;
(93)第十六步:下一个被处理的结点
指针数组P的当前结点指针0小于当前指针数14-1=13,设置当前结点指针0为0+1=1,回到(94)第十步;
(94)第十步:结点输出判断
第1个指针指向的结点头的流量计数器值140大于大流量网络地址前缀阀值100,进入(95)第十一步;
(95)第十一步:设置次结点
将第1个指针指向的结点划分为4个大小为1比特的子层,其中第0子层至第3子层分别有2、4、8、16个次结点,其中第3子层对应的16个次结点就是第1个指针指向的结点的16个子结点,假设当前子层m为0,当前次结点n为0,进入(96)第十二步;
(96)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第1个指针指向的结点的网络地址前缀长度4加上0+1等于5,当前次结点的网络地址前缀为第1个指针指向的结点的网络地址前缀0乘以2(0+1)加上0等于0,如果当前子层m=0小于3,当前次结点对应的流量大小为第1个指针指向的结点的第0个子结点到第7个子结点的流量累加和,进入(97)第十三步;
(97)第十三步:大流量网络地址前缀输出
当前次结点的流量140大于大流量网络地址前缀阀值100,则输出当前次结点的网络地址前缀0、网络地址前缀长度5和流量大小140,进入(98)第十四步;
(98)第十四步:设置大流量网络地址前缀次结点的下一个次结点序号
m=0小于3,设置m=0+1=2,n等于2*0=0,回到(99)第十二步;
(99)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第1个指针指向的结点的网络地址前缀长度4加上1+1等于6,当前次结点的网络地址前缀为第1个指针指向的结点的网络地址前缀0乘以2(1+1)加上0等于0,当前子层m=1小于3,当前次结点对应的流量大小为第1个指针指向的结点的第0个子结点到第3个子结点的流量累加和,进入(100)第十三步;
(100)第十三步:大流量网络地址前缀输出
当前次结点的流量140大于大流量网络地址前缀阀值100,则输出当前次结点的网络地址前缀0、网络地址前缀长度6和流量大小140,进入(101)第十四步;
(101)第十四步:设置大流量网络地址前缀次结点的下一个次结点序号
m=1小于3,设置m=1+1=2,n等于2*0=0,回到(102)第十二步;
(102)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第1个指针指向的结点的网络地址前缀长度4加上2+1等于7,当前次结点的网络地址前缀为第1个指针指向的结点的网络地址前缀0乘以2(2+1)加上0等于0,当前子层m=2小于3,当前次结点对应的流量大小为第1个指针指向的结点的第0个子结点到第1个子结点的流量累加和,进入(103)第十三步;
(103)第十三步:大流量网络地址前缀输出
当前次结点的流量140大于大流量网络地址前缀阀值100,则输出当前次结点的网络地址前缀0、网络地址前缀长度7和流量大小140,进入(104)第十四步;
(104)第十四步:设置大流量网络地址前缀次结点的下一个次结点序号
m=2小于3,设置m=2+1=3,n等于2*0=0,回到(105)第十二步;
(105)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第1个指针指向的结点的网络地址前缀长度4加上3+1等于8,当前次结点的网络地址前缀为第1个指针指向的结点的网络地址前缀0乘以2(3+1)加上0等于0,当前子层m=3等于3,当前次结点对应的流量大小为第1个指针指向的结点的第0个子结点流量为90,进入(106)第十三步;
(106)第十三步:大流量网络地址前缀输出
当前次结点的流量90小于大流量网络地址前缀阀值100,则进入(107)第十五步;
(107)第十五步:设置非大流量网络地址前缀次结点的下一个次结点序号
n=0为偶数,则设置n=0+1=1,回到(108)第十二步;
(108)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第1个指针指向的结点的网络地址前缀长度4加上3+1等于8,当前次结点的网络地址前缀为第1个指针指向的结点的网络地址前缀0乘以2(3+1)加上1等于1,当前子层m=3等于3,当前次结点对应的流量大小为第1个指针指向的结点的第1个子结点流量为50,进入(109)第十三步;
(109)第十三步:大流量网络地址前缀输出
当前次结点的流量50小于大流量网络地址前缀阀值100,则进入(110)第十五步;
(110)第十五步:设置非大流量网络地址前缀次结点的下一个次结点序号
n=1为奇数,n小于2(3+1)-1=15,且m=3大于0,则设置m=3-1=2,n=(1+1)/2=1,回到(111)第十二步;
(111)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第1个指针指向的结点的网络地址前缀长度4加上2+1等于7,当前次结点的网络地址前缀为第1个指针指向的结点的网络地址前缀0乘以2(2+1)加上1等于1,当前子层m=2小于3,当前次结点对应的流量大小为第1个指针指向的结点的第2个至第3个子结点流量之和为0,进入(112)第十三步;
(112)第十三步:大流量网络地址前缀输出
当前次结点的流量0小于大流量网络地址前缀阀值100,则进入(113)第十五步;
(113)第十五步:设置非大流量网络地址前缀次结点的下一个次结点序号
n=1为奇数,n小于2(2+1)-1=7,且m=2大于0,则设置m=2-1=1,n=(1+1)/2=1,回到(114)第十二步;
(114)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第1个指针指向的结点的网络地址前缀长度4加上1+1等于6,当前次结点的网络地址前缀为第1个指针指向的结点的网络地址前缀0乘以2(1+1)加上1等于1,当前子层m=1小于3,当前次结点对应的流量大小为第1个指针指向的结点的第4个至第7个子结点流量之和为0,进入(115)第十三步;
(115)第十三步:大流量网络地址前缀输出
当前次结点的流量0小于大流量网络地址前缀阀值100,则进入(116)第十五步;
(116)第十五步:设置非大流量网络地址前缀次结点的下一个次结点序号
n=1为奇数,n小于2(1+1)-1=3,且m=1大于0,则设置m=1-1=0,n=(1+1)/2=1,回到(117)第十二步;
(117)第十二步:计算次结点流量
当前次结点的网络地址前缀长度为第1个指针指向的结点的网络地址前缀长度4加上0+1等于5,当前次结点的网络地址前缀为第1个指针指向的结点的网络地址前缀0乘以2(0+1)加上1等于1,当前子层m=0小于3,当前次结点对应的流量大小为第1个指针指向的结点的第8个至第15个子结点流量之和为0,进入(118)第十三步;
(118)第十三步:大流量网络地址前缀输出
当前次结点的流量0小于大流量网络地址前缀阀值100,则进入(119)第十五步;
(119)第十五步:设置非大流量网络地址前缀次结点的下一个次结点序号
n=1为奇数,n等于2(0+1)-1=1,则进入(120)第十六步;
(120)第十六步:下一个被处理的结点
指针数组P的当前结点指针1小于当前指针数14-1=13,设置当前结点指针j为1+1=2,回到(121)第十步;
(121)第十步:结点输出判断
如果第2个指针指向的结点头的流量计数器值90小于大流量网络地址前缀阀值100,进入(122)第十六步;
(122)第十六步:下一个被处理的结点
指针数组P的当前结点指针2小于当前指针数14-1=13,设置当前结点指针j为2+1=3,回到(123)第十步;
(123)第十步:结点输出判断
如果第3个指针指向的结点头的流量计数器值90小于大流量网络地址前缀阀值100,进入(124)第十六步;
(124)第十六步:下一个被处理的结点
指针数组P的当前结点指针3小于当前指针数14-1=13,设置当前结点指针j为3+1=4,回到(125)第十步;
(125)第十步:结点输出判断
如果第4个指针指向的结点头的流量计数器值90小于大流量网络地址前缀阀值100,进入(126)第十六步;
(126)第十六步:下一个被处理的结点
指针数组P的当前结点指针4小于当前指针数14-1=13,设置当前结点指针j为4+1=5,回到(127)第十步;
(127)第十步:结点输出判断
如果第5个指针指向的结点头的流量计数器值90小于大流量网络地址前缀阀值100,进入(128)第十六步;
(128)第十六步:下一个被处理的结点
指针数组P的当前结点指针5小于当前指针数14-1=13,设置当前结点指针j为5+1=6,回到(129)第十步;
(129)第十步:结点输出判断
如果第6个指针指向的结点头的流量计数器值90小于大流量网络地址前缀阀值100,进入(130)第十六步;
(130)第十六步:下一个被处理的结点
指针数组P的当前结点指针6小于当前指针数14-1=13,设置当前结点指针j为6+1=7,回到(131)第十步;
(131)第十步:结点输出判断
如果第7个指针指向的结点头的流量计数器值90小于大流量网络地址前缀阀值100,进入(132)第十六步;
(132)第十六步:下一个被处理的结点
指针数组P的当前结点指针7小于当前指针数14-1=13,设置当前结点指针j为7+1=8,回到(133)第十步;
(133)第十步:结点输出判断
如果第8个指针指向的结点头的流量计数器值50小于大流量网络地址前缀阀值100,进入(134)第十六步;
(134)第十六步:下一个被处理的结点
指针数组P的当前结点指针8小于当前指针数14-1=13,设置当前结点指针j为8+1=9,回到(135)第十步;
(135)第十步:结点输出判断
如果第9个指针指向的结点头的流量计数器值50小于大流量网络地址前缀阀值100,进入(136)第十六步;
(136)第十六步:下一个被处理的结点
指针数组P的当前结点指针9小于当前指针数14-1=13,设置当前结点指针j为9+1=10,回到(137)第十步;
(137)第十步:结点输出判断
如果第9个指针指向的结点头的流量计数器值50小于大流量网络地址前缀阀值100,进入(138)第十六步;
(138)第十六步:下一个被处理的结点
指针数组P的当前结点指针10小于当前指针数14-1=13,设置当前结点指针j为10+1=11,回到(139)第十步;
(139)第十步:结点输出判断
如果第`10个指针指向的结点头的流量计数器值50小于大流量网络地址前缀阀值100,进入(140)第十六步;
(140)第十六步:下一个被处理的结点
指针数组P的当前结点指针11小于当前指针数14-1=13,设置当前结点指针j为11+1=12,回到(141)第十步;
(142)第十步:结点输出判断
如果第`12个指针指向的结点头的流量计数器值50小于大流量网络地址前缀阀值100,进入(143)第十六步;
(143)第十六步:下一个被处理的结点
指针数组P的当前结点指针12小于当前指针数14-1=13,设置当前结点指针j为12+1=13,回到(144)第十步;
(145)第十步:结点输出判断
第`13个指针指向的结点头的流量计数器值50小于大流量网络地址前缀阀值100,进入(146)第十六步;
(146)第十六步:下一个被处理的结点
指针数组P的当前结点指针13等于当前指针数13,结束退出。
该例子输出的结果为
网络地址前缀 网络地址前缀阀值 大流量网络地址前缀流量
0 1 140
0 2 140
0 3 140
0 4 140
0 5 140
0 6 140
0 7 140