背景技术
在基于报文流的转发系统中,一般把报文特征值(源IP地址、目的IP地址、协议号、源端口、目的端口)相同的报文识别成一条流。同一条流,其转发行为是一致的。所以,通常基于流来建立系统的转发表。每一条流对应一个流转发表项,在所述流转发表项中记录该流的转发行为,即流转发表项是对路由表和连接表经过优选整合计算生成的、对于某一条流的完整转发信息。收到一个报文后,通过报文特征值查找到对应的流转发表项,一次性把报文内容处理完毕,不再走协议栈处理流程,从而可以加快报文转发效率。
为了实现常数级的表项查找,也就是不论查找的表项数有多少,平均的查找开销始终在同一个数量级,通常采用哈希HASH算法来实现,即将报文特征值经过HASH运算之后作为HASH表的索引,此处的HASH表即为流转发表。对于有K个流转发表项的转发系统,建立H个表项的HASH表(H>K),通过对空间的牺牲来保证常数级的查找时间。
同时,对于网络设备而言,不仅关注表项的平均查找开销,对于最坏情况下的查找开销同样关注,因为这影响到报文转发的时延性能。例如,最坏情况下,若HASH冲突的次数比较大,甚至可能退化为线性查找,导致匹配最坏情况的几条报文流可能经过几百次甚至几千次的查找才能命中,时延明显偏大。
为解决上述问题,目前主要采用分离链HASH算法来创建流转发表项的HASH表并进行表项查找,具体实现如下:
对于最多支持Z条流的转发系统,建立Z个存储位置的HASH表。每个存储位置包含Y个子存储位置,要保证Y不大于HASH冲突的最大次数,也就是最多有Y条流的HASH值是一样的,以便Z条流中的任意一条都能够Hash到自己的位置。
当收到一个报文后,需要查找到该报文对应的流转发表项,先对作为关键字Key的报文特征值进行Hash运算,得到Hash函数值Hash(Key),即得到流转发表项的存储位置,再对该存储位置下包含的Y个子存储位置进行线性查找,查看Y个子存储位置中是否有与所述流转发表项的报文特征值相同的表项,若有,表明查找成功,报文会按照流转发表进行转发,否则,表明查找失败,将按照协议栈处理流程处理所述报文。
对于上述流转发系统,HASH表的新建与查找的算法是相同的,但在新建过程中,当有新建失败发生时,说明最大HASH冲突次数比Y大,需要调大Y。
在内存资源占用上,假设每个流转发表项的大小为S,则所需内存空间为S×Z×Y。查找性能方面,其最大查找开销相当于一次HASH查找加上对一个Y长度线性表的遍历开销;最小查找开销则是一次HASH查找。
下面举例说明上述现有方案的实现过程:
例如,对于最多支持100万条流的转发系统,建立100万个存储位置的HASH表,若HASH最大冲突次数为8,即每个存储位置下包含8个子存储位置,存储位置用于存储流转发表项,则共需要800万个表项的空间,其流转发表组织示意图如图1所示。当收到一个报文后,对报文特征值进行Hash运算,假设得到的Hash函数值为i,即为该报文特征值对应的流转发表项在流转发表中的存储位置,如图1所示,再对该存储位置Bucketi下包含的8个entry的子存储位置进行线性查找。
上述方案虽然能够保证Y不超过HASH最大冲突次数,即保证了报文转发的时延不会偏大,也就是保证了流转发表项的查找效率,但对内存空间的浪费是比较严重的。
因为有可能全部Z个存储位置中,只有少数几个存储位置的冲突深度能到Y,但是所有Z个存储位置都分配了Y个子存储位置的空间,额外牺牲的内存空间为S×(Y-1)×Z,当系统支持的流数N成倍放大时,这种浪费会越来越严重。因为随着HASH表项数Z的增加,HASH最大冲突次数Y也在不断增加。假设当系统支持的流转发数目变成2Z,HASH最大冲突次数相应的变成Y+y,则所耗的内存空间变成S×(Y+y)×2Z。当N为百万级的大数时,浪费的内存空间相当可观。
接上面的举例,当支持100万流表时,Hash最大冲突次数为8,需要建立可存储800万个表项的空间,额外牺牲的内存空间为100×(8-1)=700万表项的空间。若支持的流表扩容到200万,Hash最大冲突次数也跟着增大到10,则需要建立可存储2000万个表项的空间,额外牺牲的内存空间为200×(10-1)=1800万表项的空间。
因此,上述现有技术方案虽然可以保证流转发表项的查找效率,但对内存空间的浪费是比较严重的。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下通过具体实施例并参见附图,对本发明进行详细说明。
本申请中,对于最多支持N条报文流的转发系统,建立包含有M个连续存储位置的HASH表作为流转发表,M、N为自然数,M>N,每个存储位置下包含多于1个的存储位置;接收到任一报文时,对所述报文的第一特征值进行第一HASH运算,将第一HASH运算的结果所指向的HASH表存储位置记为B;遍历B下的各个子存储位置:
当B下任一子存储位置满足要求时,查找到目的表项存储位置;当B下所有子存储位置均不满足要求时,对所接收到的报文的第二特征值进行第二HASH运算,得到待查找的下一个存储位置与当前存储位置之间的步长H;
更新B为B+H,遍历B下的各个子存储位置,当B下任一子存储位置满足要求时,查找到目的表项存储位置;当B下所有子存储位置均不满足要求、且冲突次数小于预先设定的最大冲突次数时,重复执行:更新当前B为B+H及后续步骤,直到查找到目的表项存储位置或冲突次数达到预先设定的最大冲突次数。
由上述过程可知,本申请结合了分离链HASH算法和开放寻址HASH算法各自的优点,对每一个存储位置分配了子存储位置,同时,采用了二次HASH算法,提出一种新的解决方案更好的适配于网络设备的流转发系统,在保证转发吞吐量和时延性能的基础上,可极大减小对内存空间的开销。
本申请实施例的方法流程如图2所示,一种流转发表项的处理方法,对于最多支持N条报文流的转发系统,建立包含有M个连续存储位置的HASH表作为流转发表,M、N为自然数,M>N,以保证装载因子不大于1。
如图3所示,Bucket 0、Bucket 1、……、Bucket i、……、Bucket M-1即为HASH表的M个存储位置,用于存储流转发表项,每个存储位置下包含2个子存储位置,如Bucket i下包含Entry 0和Entry 1,这里子存储位置的数量可根据实际情况而设定,比如,如果装载因子小一些,子存储位置的数量可设置大一些,如果装载因子大一些,子存储位置的数量可设置小一些,例如,图3中子存储位置的数量设为2,最大冲突次数为5。
处理流转发表项时,执行以下步骤:
步骤201:接收到任一报文时,对所述报文的第一特征值进行第一HASH运算,将第一HASH运算的结果所指向的HASH表存储位置记为B。
所述报文特征值包括:源IP地址、目的IP地址、协议号、源端口号以及目的端口号中任意一项或几项的组合。
以报文的第一特征值作为关键字key进行第一HASH运算,本申请第一HASH运算中的HASH函数并不限定于某一种运算规则,可根据实际情况设置或选定,得到的函数值Hash(key)即指向HASH表的存储位置B。通过对报文的第一特征值进行第一HASH运算实现第一次查找。
例如,如图3所示,接收到的报文五元组信息若有48bit,取其中的前8位作为该报文的的第一特征值,对该报文的第一特征值进行第一HASH运算的结果B为Bucket i,即定位到流转发表的存储位置Bucket i。
步骤202:遍历B下的各个子存储位置,当B下任一子存储位置满足要求时,查找到目的表项存储位置;当B下所有子存储位置均不满足要求时,对所接收到的报文的第二特征值进行第二HASH运算,得到待查找的下一个存储位置与当前存储位置之间的步长H。
作为流转发表的HASH表的处理方式包括新建和查找,从现有HASH表的原理可知,HASH表的新建和查找所使用的算法是相同的,下面分别介绍本申请中如何对作为流转发表的HASH表进行新建和查找。
所述流转发表项的处理方式为新建时,所述B下任一子存储位置满足的要求为:该子存储位置为空。B下所有子存储位置均不满足要求,即B下所有子存储位置均不为空。新建时,只要找到没有被占用的存储位置,就表示找到了目的表项存储位置,将流转发表项存储在该位置。
所述流转发表项的处理方式为查找时,所述B下任一子存储位置满足的要求为:B下任一子存储位置的流转发表项的报文特征值与所述接收到的报文的特征值相同;所述B下所有子存储位置均不满足要求,即B下所有子存储位置中流转发表项的报文特征值与所述接收到的报文的特征值均不相同。
这里的报文特征值与上述报文的第一特征值及第二特征值没有特定的关系,报文的特征值可以根据需要来取,只要比较的双方(所有子存储位置中流转发表项的报文与所述接收到的报文)都是按照同样的规则来取特征值即可,比如,报文五元组信息有48bit,所有子存储位置中流转发表项的报文与所述接收到的报文均取48bit中的前7位作为特征值,来进行对比判断;通常,所述第一特征值与第二特征值为源IP地址、目的IP地址、协议号、源端口号以及目的端口号中任意一项或几项的组合。
当B下所有子存储位置均不满足要求时,记为一次冲突发生,若采用现有技术方案,此时表示查找失败,但本申请中,继续对所接收到的报文的第二特征值进行第二HASH运算,得到一个步长H,也就是待查找的下一个存储位置与当前存储位置之间的步长。
例如,当流转发表项的处理方式为查找时,如图3所示,遍历Bucket i下的各个子存储位置Entry 0、Entry 1,依次分别比较存储位置Entry 0、Entry 1所存储的流转发表项的报文特征值与所述接收到的报文的特征值是否相同,若相同,表示查找成功,转发系统获取到所述流转发表项,根据所述流转发表项,一次性将报文内容处理完毕。若Entry 0、Entry 1所存储的流转发表项的报文特征值与所述接收到的报文的特征值均不相同,则继续对所接收到的报文的第二特征值进行第二HASH运算,得到待查找的下一个存储位置与当前存储位置之间的步长H=4。
其中,步骤201中报文的第一特征值、第一HASH函数与步骤202中报文的第二特征值、第二HASH函数的设置满足如下条件:
第二HASH运算得到的函数值H远小于第一HASH运算得到的函数值。
也就是说,此处两次HASH运算的HASH函数及报文特征值可以根据实际情况灵活设置,可以采用不同的设置方法,并不限定于某一种设置方法,只要满足上述条件就可以。
例如,可以保持第一HASH函数与第二HASH函数相同,即运算规则相同,但报文的第一特征值与第二特征值设置为不同;或者,报文的第一特征值与第二特征值设置为相同,但第一HASH与第二HASH的运算规则设置为不同,只要能保证第二HASH运算得到的函数值H远小于第一HASH运算得到的函数值就可以。
如此设置,是为了保证第二HASH运算得到的函数值H,也就是待查找的下一个存储位置与当前存储位置之间的步长不能太大。
本申请中,第二HASH运算,可以大大降低第二次及以后的HASH查找发生冲突的概率。
步骤203:更新B为B+H,遍历B下的各个子存储位置,当B下任一子存储位置满足要求时,查找到目的表项存储位置;当B下所有子存储位置均不满足要求、且冲突次数小于预先设定的最大冲突次数时,重复执行步骤203;每当B下所有子存储位置均不满足要求时,记为一次冲突。
本申请中引入的第二HASH运算,虽然已经可以大幅减少第二次及以后的HASH查找发生冲突的概率,但为了保证最坏情况下的查找开销可控,这里仍然引入了最大冲突次数,是为了对最大冲突长度进行限制,使得HASH表的最大查找开销不会太大,从而保证最坏情况下的查找时延是可控的。
本申请中,最大查找开销为2次HASH查找+C个m长度的线性表遍历;最小查找开销为一次Hash查找,其中,C为最大冲突次数,m为每个存储位置下包含的子存储位置的个数。
当冲突次数大于或等于预先设定的最大冲突次数时,表明查找失败,对于流转发表项的处理方式为查找时,则按照现有的协议栈处理流程处理相应报文;对于流转发表项的处理方式为新建时,则放弃建立对应的流转发表项。
查找失败表明流转发表的参数还需优化,后续通过重新设置最大冲突次数等来减少查找失败的发生。
下面以流转发表项的查找为例进一步具体说明:
如图3所示,对于最多支持N条报文流的转发系统,建立包含有M个连续存储位置的HASH表作为流转发表,M、N为自然数,M>N,Bucket 0、Bucket 1、......、Bucket i、……、Bucket M-1即为HASH表的M个存储位置,每个存储位置下包含2个子存储位置,即为Entry 0和Entry 1。
接收到任一报文时,对所述报文的第一特征值进行第一HASH运算,假设第一HASH运算得出的值为Bucket i,即找到存储位置Bucket i,遍历Bucket i下的Entry 0和Entry 1。
当Entry 0或Entry 1中存储的流转发表项的报文特征值与所述接收到的报文的特征值相同时,成功查找到目的表项;
当Entry 0和Entry 1中存储的流转发表项的报文特征值与所述接收到的报文的特征值均不相同时,表示发生一次冲突,对所接收到的报文的第二特征值进行第二HASH运算,得到H=4,得到待查找的下一个存储位置为Bucket i+4,然后再对Bucket i+4下的子存储位置进行线性查找,如图3所示,当Bucket i+4下的两个子存储位置也不匹配时,表示发生了2次冲突,则继续更新待查找的下一个存储位置为Bucket i+4+4,即Bucket i+8,如此反复,直至找到所述接收到的报文的特征值对应的目的表项。
为了控制最坏情况下的时延,这里可设置最大冲突次数,第二HASH运算后,如果冲突的次数小于预先设定的最大冲突次数(比如为5),才继续更新存储位置,否则,表示查找失败,则按照现有的协议栈处理流程处理该报文。
根据HASH算法的原理可知,作为流转发表的HASH表的建表过程基本上与流转发表的查找过程相同。
下面根据本申请流转发表的查找过程对流转发表的建表过程简要举例说明。
对于最多支持N条报文流的转发系统,建立包含有M个连续存储位置的HASH表作为流转发表,M、N为自然数,M>N,每个存储位置包含有多于1个的子存储位置。
接收到任一报文时,对所述报文的第一特征值进行第一HASH运算,将第一HASH运算的结果所指向的HASH表存储位置记为B;
遍历B下的各个子存储位置,如果找到一个空闲的存储位置,在该存储位置存储所述报文的特征值对应的流转发表项,新建结束;如果没有找到空闲的存储位置,则对所接收到的报文的第二特征值进行第二HASH运算,得到待查找的下一个存储位置与当前存储位置之间的步长H,
更新B为B+H,遍历更新后的存储位置B下的各个子存储位置,如果找到一个空闲的存储位置,在此存储位置存储所述报文的特征值对应的流转发表项,否则,进一步更新B为B+H,继续遍历,如此反复,直至找到空闲的存储位置写入所述接收到的报文的特征值对应的流转发表项。
为了控制最坏情况下的时延,这里同样可设置最大冲突次数,第二HASH运算后,如果冲突的次数小于预先设定的最大冲突次数,才继续更新存储位置B=B+H,否则,表示新建失败,放弃建立对应的流转发表项。
相对于现有方案,本申请相当于把一个长的子表分解成若干个短的子表。同时,因为二次HASH运算的引入,第二次及以后的HASH查找冲突的概率大大降低了。比如,同时有8条流,其第一HASH运算的值都映射到Bucket i:
若采用现有方案,如图1所示,8条流都映射到Bucket i的8个子存储位置;
第1条流位于Bucket i,entry 0,经过1次HASH运算即命中;
第2条流位于Bucket i,entry 1,经过1次HASH运算+1次线性查找命中;
......
第8条流位于Bucket i,entry 7,经过1次HASH运算+7次线性查找命中。
这8条流总的查找开销为8次HASH运算加上(0+1+2+…+7)=28次线性查找。
若采用本申请方案,如图3所示,会有两条流映射到Bucket i的2个子存储位置,剩下的6条流经过第二HASH运算之后,因为二次Hash运算的引入,第二次及以后的Hash查找冲突的概率大大降低了,这里假设6条流分散到了6个不同的存储位置。即:
第1条流位于Bucket i,entry 0,经过1次HASH运算即命中;
第2条流位于Bucket i,entry 1,经过1次HASH运算+1次线性查找命中;
第3条流位于Bucket j,entry 0,经过1次HASH运算+2次线性查找+1次HASH运算命中;
第4条流位于Bucket k,entry 0,经过1次HASH运算+2次线性查找+1次HASH运算命中;
......
第8条流位于Bucket Z,entry 0,经过1次HASH运算+2次线性查找+1次HASH运算命中。
这8条流总的查找开销为14次HASH运算加上13次线性查找。
由上述计算过程可知,相对于现有的技术方案,本申请方案在查找效率上,增加了HASH运算的开销,但是减小了线性查找的开销,查找效率基本相当。但是,相对于现有方案,本申请方案在内存的开销上,则大大节省了。
总的来说,本申请方案与现有方案在查找效率上基本相当,但在内存的开销上,本申请方案则大大节省了。
本申请实施例的装置结构如图4所示,一种流转发表项的处理装置,包括哈希表建立模块,用于针对最多支持N条报文流的转发系统,建立包含有M个连续存储位置的哈希HASH表,M、N为自然数,M>N,所述装置还包括:HASH运算模块、流转发表项定位模块、冲突处理模块,其中:
报文处理模块,用于接收到任一报文时,对所述报文的第一特征值进行第一HASH运算,将第一HASH运算的结果所指向的HASH表存储位置记为B;
流转发表项定位模块,用于遍历B下预先分配的多于1个的子存储位置,当B下任一子存储位置满足要求时,查找到目的表项存储位置;当B下所有子存储位置均不满足要求时,对所接收到的报文的第二特征值进行第二HASH运算,得到待查找的下一个存储位置与当前存储位置之间的步长H;
冲突处理模块,用于执行如下步骤K:更新存储位置B为B+H,遍历B下的各个子存储位置,当B下任一子存储位置满足要求时,查找到目的表项存储位置;当B下所有子存储位置均不满足要求、且冲突次数小于预先设定的最大冲突次数时,重复执行步骤K;每当B下所有子存储位置均不满足要求时,记为一次冲突。
较佳地,所述流转发表项的处理装置用于新建流转发表时,所述流转发表项定位模块,具体用于当B下任一子存储位置为空时,查找到目的表项存储位置;当B下所有子存储位置均不为空时,对所接收到的报文的第二特征值进行第二HASH运算,得到待查找的下一个存储位置与当前存储位置之间的步长H;
所述冲突处理模块,具体用于当B下任一子存储位置为空时,查找到目的表项存储位置;当B下所有子存储位置均不为空、且冲突次数小于预先设定的最大冲突次数时,重复执行步骤K。
较佳地,所述流转发表项的处理装置用于查询流转发表项时,所述流转发表项定位模块,具体用于当B下任一子存储位置的流转发表项的报文特征值与所述接收到的报文的特征值相同时,查找到目的表项存储位置;当B下所有子存储位置中流转发表项的报文特征值与所述接收到的报文的特征值均不相同时,对所接收到的报文的第二特征值进行第二HASH运算,得到待查找的下一个存储位置与当前存储位置之间的步长H;
所述冲突处理模块,具体用于当B下任一子存储位置的流转发表项的报文特征值与所述接收到的报文的特征值相同时,查找到目的表项存储位置;当B下所有子存储位置中流转发表项的报文特征值与所述接收到的报文的特征值均不相同、且冲突次数小于预先设定的最大冲突次数时,重复执行步骤K。
较佳地,所述冲突处理模块,还用于当冲突次数大于或等于预先设定的最大冲突次数时,按照协议栈处理流程处理所述报文。
较佳地,所述第一HASH函数、第二HASH函数、报文的第一特征值及报文的第二特征值的设置满足如下条件:
第二HASH运算得到的函数值H远小于第一HASH运算得到的函数值。
较佳地,所述报文特征值包括:源IP地址、目的IP地址、协议号、源端口号以及目的端口号中任意一项或几项的组合。
本申请在保证现有流转发表查找效率的基础上,可以大幅减少对内存空间的浪费。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。