一种基于TCAM的路由查找系统及其方法与流程

文档序号:11206071阅读:351来源:国知局
一种基于TCAM的路由查找系统及其方法与流程

本发明涉及一种基于tcam的路由查找系统及其方法,属于高速ip查找技术领城。



背景技术:

近年来,internet用户激增,导致路由表的激增,这导致了传统的ipv4的a类,b类,c类地址资源的枯竭。一种过渡的办法就是利用无域间路由(cidrclasslessinter-domainrouting)。通过采用可变长度的网络id,代替了固定的8、16、24位固定的网络id,从而使ip地址利用率提升。但同时对于路由查找算法,也大大增加了复杂度。

路由表在20多年间从几千条增加到60多万条。一些经典的算法可能在路由表增长的过程中,会由于搜索时间更长,或者占用更多的存储空间而不适用,因此,如何处理因为路由表的激增而带来的路由查找的问题变得更加迫在眉睫。

tcam(ternarycontent-addressablememory),三值按内容可寻址存储器,是一种具有搜索功能的随机存储器。tcam单元在搜索时会有三种状态,即0、1、x(不关心),也就是允许通配符存在。tcam不同于软件搜索的特点是,在一个时钟周期内,就可以得出搜索结果,在速度上有着无可比拟的优势。正是由于tcam的高速以及支持通配符的特性,tcam在高速的数据库,数据压缩,路由查找,模式识别以及人工智能方面有着出色的表现。

而对于tcam这种从速度上来说,其他软件算法无法比拟的硬件搜索引擎来说,仍然面临挑战。tcam的功耗能够达到十几瓦到几十瓦,如此高的功耗对于器件的散热造成巨大的挑战,如何减小tcam功耗成为一个急切而又热门的话题。同时,tcam的复杂的更新,以及更新延时造成性能的下降。

在plo_opt【d.shahandp.gupta,”fastupdatesonternary-camsforparcketlookupsandclassification,”ieeemicro,vol.21,no.1,jan./fab.2001】方案中,所有的未使用的tcamentry被放置在tcam芯片的中间。假设ip地址的长度为l(对于ipv4来说l等于32),前缀长度大于1/2l的前缀放置在未使用的tcam块的上方(低地址);前缀长度小于等于1/2l的前缀放置在未使用的tcam块下方。利用这种方案,在删除或者添加一个前缀时,在最坏情况下,挪动前缀需要1/2l次。也就是说,plo_opt方案的时间复杂度是o(l/2)对于ipv4来说,需要移动16次才能够更新一个前缀,平均的移动次数较多,降低了tcam搜索的性能。plo_opt示意图如图1(a)所示。

在cao_opt【d.shahandp.gupta,”fastupdatesonternary-camsforparcketlookupsandclassification,”ieeemicro,vol.21,no.1,jan./fab.2001】方案中,所有闲置的tcamentry同plo_opt方案一样,都是放置在tcam芯片的中间。在cao_opt方案中,前缀的存储是按照trie这种方式来存储的,也就是说,只需要保证在同一个分支上的前缀的相对顺序,在tcam搜索的时候就会保证搜索结果正确,而不需要较长的前缀放在低地址,短的前缀放在高地址。对于任何一个前缀来说,从该前缀到未使用的前缀的相对距离不会超过[d/2](d表示该分支的长度,[d/2]表示向上取整)。因此,cao_opt方案的时间复杂度是o([d/2])。但在cao_opt方案中,为了维持在同一分支的节点的关系,在删除前缀的时候,需要移动更多的前缀。并且由于前缀的增长,d的值一定会增加,这会降低该方案的性能。cao_opt示意图如图1(b)所示。



技术实现要素:

为了克服现有技术中存在的不足,本发明目的是提供一种基于tcam的路由查找系统及其方法。本发明的目的在于减小tcam更新时前缀移动次数,提高更新性能,并在一定程度上加速tcam的查找速度。

为了实现上述发明目的,解决己有技术中存在的问题,本发明采取的技术方案是:一种基于tcam的路由查找系统,包括容量为n个条目的tcam模块1、容量为m个条目的tcam模块2、具有n个输入端的编码器,具有m个输入端的优先级编码器,两输入选择器和两输入或门,所述tcam模块1的n个输出端分别与编码器的n个输入端一一对应相连,所述tcam模块2的m个输出端分别与优先级编码器的m个输入端一一对应相连,所述编码器的输出端与两输入选择器的“1”端相连,所述优先级编码器的输出端与两输入的选择器的“0”端相连,所述tcam模块1输出的匹配标志1与两输入选择器的选择端相连,所述tcam模块1输出的匹配标志1和tcam模块2输出的匹配标志2分别与两输入或门相连,两输入选择器的输出端作为系统的匹配地址,两输入或门的输出端作为系统的匹配标志,所述n及m均为大于零的正整数;所述tcam模块1中存放n1条第一层前缀,n1为大于零的正整数,存放的地址范围为[0,n1-1],前缀采用随机存放的方式,每个entry的输出端与entry地址相对应的编码器的输入端连接,tcam模块1的地址范围[n1,n-1]不存放前缀,每条entry的输出与entry地址相对应的编码器的输入端相连;在tcam模块2的地址范围为[0,n2-1]的tcamentry中存放n2条前缀,输出端分别与地址为[0,n2-1]的优先级编码器的输入端相连,前缀随机存放,tcam模块2的地址范围为[n2,n2+ne1-1]放置ne1条未使用的tcamentry,组成空闲空间1,ne1为大于零的正整数,每条entry的输出端与该entry地址相对应的优先级编码器的输入相连;在tcam模块2的地址范围为[n2+ne1,n2+ne1+no1-1]的tcamentry中存放no1条,长度为24~17的其他层的前缀,no1为大于零的正整数,每条entry的输出端与该entry地址相对应的优先级编码器的输入相连,前缀按照前缀长度存放,前缀长度长的放在低地址,短的放在高地址;在tcam模块2的地址范围为[n2+ne1+no1,n2+ne1+no1+ne2-1]的tcamentry不存放前缀,组成空闲空间2,每条entry的输出与该entry地址相对应的优先级编码器的输入相连;在tcam模块2的地址范围为[n2+ne1+no1+ne2,n2+ne1+no1+ne2+no2-1]的tcamentry中存放no2条长度为16~13的其它层前缀,每条entry的输出与该entry地址相对相应的优先级编码器的输入端连接,前缀按照前缀长度存放,前缀长度长的放在低地址,短的放在高地址;在tcam模块2的地址范围为[n2+ne1+no1+ne2+no2,n2+ne1+no1+ne2+no2+ne3-1]的tcamentry中不存放前缀,组成空闲空间3tcam模块2地址范围为[n2+ne1+no1+ne2+no2+ne3,m-1]的tcamentry中存放m-(n2+ne1+no1+ne2+no2+ne3)条前缀长度为12~8的其他层前缀,每条entry的输出端与该entry地址相对相应的优先级编码器的输入连接,前缀按照前缀长度存放,前缀长度长的放在低地址,短的放在高地址。

所述系统的一种基于tcam的路由查找及更新方法,其中查找方法包括以下步骤:

步骤401、将待查找的目的ip同时送入tcam模块1和tcam模块2中,进行搜索;

步骤402、从编码器的输出端得到tcam模块1的匹配地址,从优先级编码器的输出端得到tcam模块2的匹配地址,从tcam模块1的输出端得到匹配标志1,从tcam模块2输出端得到匹配标志2;

步骤403、将tcam模块1得到的匹配标志1送入选择器的选择端;

步骤404、将tcam模块1得到的匹配地址的最高位前加标志位“1”,送入选择器“1”端,将tcam模块2中得到的匹配地址的最高位前加“0”,送入选择器“0”端;

步骤405、从选择器输出端得到搜索的匹配结果,从或门输出端得到匹配标志;

所述更新方法包括插入和删除两部分,其中插入包括以下步骤:

步骤501、开始,准备好要插入的前缀;

步骤502、判断要插入的前缀是否应该插入到第一层前缀中,如果该前缀应该插入到第一层,则执行步骤503,否则执行步骤508;

步骤503、判断要插入的前缀在第一层前缀中是否存在超集p1,如果p1存在,则执行步骤504,如果不存在,则执行步骤511;

步骤504、判断p1在第二层中是否存在超集p2,如果p2存在,则执行步骤506,如果不存在,则执行步骤505;

步骤505、将前缀p1插入到第二层前缀中;

步骤506、将前缀p2插入到其它前缀层中;

步骤507、将前缀p1移动到p2在移动之前的位置;

步骤508、如果要插入的前缀应该插入到第二层,则执行步骤509,否则执行步骤511;

步骤509、判断被插入前缀在第二层是否存在超集p2,如果存在,则执行步骤510,如果不存在,则执行步骤511;

步骤510、将前缀p2插入到其它层;

步骤511、在相应的前缀层插入目标前缀;

步骤512、记录前缀数量和位置的变化;

步骤513、结束此次前缀插入操作;

所述删除包括以下步骤:

步骤601、开始删除过程,准备好被删除的前缀;

步骤602、判断被删除前缀是否位于第一层,如果被删除前缀位于第一层,则执行步骤603,否则执行步骤609;

步骤603、判断被删除前缀在第二层中是否有超集p2,如果p2存在,则执行步骤604,如果p2不存在,则执行步骤613;

步骤604、判断p2在第一层前缀中有无与被删除前缀不同的子集,如果子集存在,则执行步骤613,如果不存在子集,则执行步骤605;

步骤605、将前缀p2移动到被删除的前缀的位置处;

步骤606、判断前缀p2在其它层前缀中是否有超集p3,如果p3存在,则执行步骤607,如果p3不存在,则执行步骤613;

步骤607、判断前缀p3在第二层前缀中是否存在与p2不同的子集,如果存在,则执行步骤613,如果不存在,则执行步骤608;

步骤608、将前缀p3移动到前缀p2的位置;

步骤609、判断被删除前缀是否位于第二层中,如果位于第二层前缀中,则执行步骤610,否则执行步骤613;

步骤610、判断被删除前缀在其他层中是否存在超集p3,如果存在,则执行步骤611,如果不存在,则执行步骤613;

步骤611、判断p3在第二层前缀中有无与被删除前缀不同的子集前缀,如果该子集存在,则执行步骤613,如果不存在,则执行步骤612;

步骤612、将前缀p3移动到被删除前缀的位置处;

步骤613、删除目标前缀;

步骤614、记录前缀位置和数量的变化;

步骤615、结束此次删除操作。

本发明有益效果是:一种基于tcam的路由查找系统及其方法,系统包括容量为n个条目的tcam模块1、容量为m个条目的tcam模块2、具有n个输入端的编码器,具有m个输入端的优先级编码器,两输入选择器和两输入或门,所述tcam模块1的n个输出端分别与编码器的n个输入端一一对应相连,所述tcam模块2的m个输出端分别与优先级编码器的m个输入端一一对应相连,所述编码器的输出端与两输入选择器的“1”端相连,所述优先级编码器的输出端与两输入的选择器的“0”端相连,所述tcam模块1输出的匹配标志1与两输入选择器的选择端相连,所述tcam模块1输出的匹配标志1和tcam模块2输出的匹配标志2分别与两输入或门相连,两输入选择器的输出端作为系统的匹配地址,两输入或门的输出端作为系统的匹配标志,所述n及m均为大于零的正整数;与已有技术相比,本发明提供的基于tcam的路由查找及更新方法,具有以下优点:(1)处于第一层和第二层的前缀由于不存在重叠和包含的关系,因此可以在其相应的区间内无序随机放置;(2)降低了在更新时的tcam表的移动次数;(3)由于减小了移动前缀的次数,在一定程度上降低了tcam的功耗;(4)由于在第一部分tcam中,仅使用了编码器,提高了搜索的速度。

附图说明

图1是plo_opt、cao_opt方案示意图。

图中:(a)是plo_opt方案示意图。

(b)cao_opt方案示意图。

图2是传统的tcam查找方案示意图。

图3是本发明系统原理框图。

图4是本发明查找方法步骤流程图。

图5是本发明插入方法步骤流程图。

图6是本发明删除方法步骤流程图。

具体实施方式

下面结合本发明用到的一些名词做简单解释:

前缀重叠:如果两个前缀a和前缀b在同一分支上,这两个前缀就是互相重叠的两个前缀。

前缀的超集和子集:如果前缀a和前缀b在同一分支上,也就是它们是互相重叠的前缀,并且前缀a的长度比前缀b的长度短,我们就称前缀a是前缀b的超集(或者记作)。

前缀层i(i=1,2,…,n):有同样匹配优先级的前缀集在同一前缀层上。前缀层1有最高的优先级,前缀层n的匹配优先级最低。第一层的前缀没有子集,第二层的前缀至少在第一层有一个子集,第三层的前缀在第二层至少有一个子集,以此类推。

命中:在某一前缀层搜索前缀a时,如果前缀a被某一前缀包含或者前缀a包含了该前缀层中的某前缀,我们把这种情况称为命中。

下面结合附图对本发明作进一步说明。

如图3、4、5、6所示,一种基于tcam的路由查找系统,包括容量为n个条目的tcam模块1、容量为m个条目的tcam模块2、具有n个输入端的编码器,具有m个输入端的优先级编码器,两输入选择器和两输入或门,所述tcam模块1的n个输出端分别与编码器的n个输入端一一对应相连,所述tcam模块2的m个输出端分别与优先级编码器的m个输入端一一对应相连,所述编码器的输出端与两输入选择器的“1”端相连,所述优先级编码器的输出端与两输入的选择器的“0”端相连,所述tcam模块1输出的匹配标志1与两输入选择器的选择端相连,所述tcam模块1输出的匹配标志1和tcam模块2输出的匹配标志2分别与两输入或门相连,两输入选择器的输出端作为系统的匹配地址,两输入或门的输出端作为系统的匹配标志,所述n及m均为大于零的正整数;所述tcam模块1中存放n1条第一层前缀,n1为大于零的正整数,存放的地址范围为[0,n1-1],前缀采用随机存放的方式,每个entry的输出端与entry地址相对应的编码器的输入端连接,tcam模块1的地址范围[n1,n-1]不存放前缀,每条entry的输出与entry地址相对应的编码器的输入端相连;在tcam模块2的地址范围为[0,n2-1]的tcamentry中存放n2条前缀,输出端分别与地址为[0,n2-1]的优先级编码器的输入端相连,前缀随机存放,tcam模块2的地址范围为[n2,n2+ne1-1]放置ne1条未使用的tcamentry,组成空闲空间1,ne1为大于零的正整数,每条entry的输出端与该entry地址相对应的优先级编码器的输入相连;在tcam模块2的地址范围为[n2+ne1,n2+ne1+no1-1]的tcamentry中存放no1条,长度为24~17的其他层的前缀,no1为大于零的正整数,每条entry的输出端与该entry地址相对应的优先级编码器的输入相连,前缀按照前缀长度存放,前缀长度长的放在低地址,短的放在高地址;在tcam模块2的地址范围为[n2+ne1+no1,n2+ne1+no1+ne2-1]的tcamentry不存放前缀,组成空闲空间2,每条entry的输出与该entry地址相对应的优先级编码器的输入相连;在tcam模块2的地址范围为[n2+ne1+no1+ne2,n2+ne1+no1+ne2+no2-1]的tcamentry中存放no2条长度为16~13的其它层前缀,每条entry的输出与该entry地址相对相应的优先级编码器的输入端连接,前缀按照前缀长度存放,前缀长度长的放在低地址,短的放在高地址;在tcam模块2的地址范围为[n2+ne1+no1+ne2+no2,n2+ne1+no1+ne2+no2+ne3-1]的tcamentry中不存放前缀,组成空闲空间3;tcam模块2地址范围为[n2+ne1+no1+ne2+no2+ne3,m-1]的tcamentry中存放m-(n2+ne1+no1+ne2+no2+ne3)条前缀长度为12~8的其他层前缀,每条entry的输出端与该entry地址相对相应的优先级编码器的输入连接,前缀按照前缀长度存放,前缀长度长的放在低地址,短的放在高地址。

所述系统的一种基于tcam的路由查找及更新方法,其中查找方法包括以下步骤:

步骤401、将待查找的目的ip同时送入tcam模块1和tcam模块2中,进行搜索;

步骤402、从编码器的输出端得到tcam模块1的匹配地址,从优先级编码器的输出端得到tcam模块2的匹配地址,从tcam模块1的输出端得到匹配标志1,从tcam模块2输出端得到匹配标志2;

步骤403、将tcam模块1得到的匹配标志1送入选择器的选择端;

步骤404、将tcam模块1得到的匹配地址的最高位前加标志位“1”,送入选择器“1”端,将tcam模块2中得到的匹配地址的最高位前加“0”,送入选择器“0”端;

步骤405、从选择器输出端得到搜索的匹配结果,从或门输出端得到匹配标志;

在更新方法中,需要记录下未使用的tcamentry的位置emptyn和前缀数量numn(n代表前缀所处的层数)。对于处于其他层的前缀来说,需要记录某一长度前缀的起始位置s(n)和e(n)(n代表前缀长度),s(n)和e(n)为大于零的正整数。它们被记为s(8),s(9),…,s(24)和e(8),e(9),…,e(24)。同时也要相应的记录各个长度前缀的数量n(8),n(9),…,n(24)。

所述更新方法包括插入和删除两部分,其中插入方法包括以下步骤:

步骤501、开始,准备好要插入的前缀;

步骤502、判断要插入的前缀是否应该插入到第一层前缀中,如果该前缀应该插入到第一层,则执行步骤503,否则执行步骤508;

步骤503、判断要插入的前缀在第一层前缀中是否存在超集p1,如果p1存在,则说明插入前缀所处分支中,有更高层次的前缀,执行步骤504,如果不存在,则说明插入前缀同原前缀不相关,执行步骤511;

步骤504、判断p1在第二层中是否存在超集p2,如果p2存在,则说明存在更高层次的前缀,执行步骤506,如果不存在,则说明p1同tcam模块2中前缀无关,执行步骤505;

步骤505、将前缀p1插入到第二层前缀中;

步骤506、将前缀p2插入到其它前缀层中;

步骤507、将前缀p1移动到p2在移动之前的位置;

步骤508、如果要插入的前缀应该插入到第二层,则执行步骤509,否则执行步骤511;

步骤509、判断被插入前缀在第二层是否存在超集p2,如果存在,则说明存在更高层次的前缀,执行步骤510,如果不存在,则说明插入前缀同tcam模块2中前缀无关,执行步骤511;

步骤510、将前缀p2插入到其它层;

步骤511、在相应的前缀层插入目标前缀;

步骤512、记录前缀数量和位置的变化;

步骤513、结束此次前缀插入操作;

在插入过程中,涉及到前缀要插入到某一确定前缀层中,当在某一层插入前缀时,首先要在该层找到一个空闲的tcamentry的位置。对于第一层和第二层的前缀,直接将该前缀插入empty1/empty2的最低位置。在把相应层数的前缀数(num1/num2)加1即可。对于其他层的前缀,首先判断其前缀长度,并且判断在相应长度的前缀是否存在空闲的tcamentry,如果存在,则返回其所在的位置。如果不存在,则需要以该前缀长度为中心,依次从大于该前缀长度和小于该前缀长度两个方向检查该长度前缀开始的位置和结束的位置,并确定是否有空闲的tcamentry,直到找到空闲的tcamentry的位置,并记录该位置所处的前缀长度l。在空闲tcamentry被找到后,开始插入过程。首先,要确定插入到哪一层。如果是第一层或第二层,直接插入空闲地址中的最低地址,并在相应层前缀数量加1即可。对于其他前缀层,假设要插入的前缀的长度为l,返回的空闲tcamentry的位置为loc。如果l比l大,将处于e(l)位置的前缀移动到loc处。因此,e(l)位置为空闲。然后s(l)和e(l)均减一。将处于e(l-1)位置的前缀移动到s(l-1)-1的位置。这样,在s(l-2)和e(l-1)的位置就有了一个空闲的entry。重复这样的迭代过程,直到目标前缀被插入到正确的位置。如果l比l小,这个过程是类似的。不同之处在于把处于s(l)位置的前缀移动到loc处,s(l)、e(l)分别加1。同样也是重复这样的迭代,直到目标前缀被插入到正确的位置。

所述删除方法包括以下步骤:

步骤601、开始删除过程,准备好被删除的前缀;

步骤602、判断被删除前缀是否位于第一层,如果被删除前缀位于第一层,则执行步骤603,否则执行步骤609;

步骤603、判断被删除前缀在第二层中是否有超集p2,如果p2存在,则执行步骤604,如果p2不存在,则说明该前缀在原tcam中不存在与其相关的前缀,直接删除对后面的查找,更新不产生影响,执行步骤613;

步骤604、判断p2在第一层前缀中有无与被删除前缀不同的子集,如果子集存在,则节点的相对顺序关系不会被破坏,执行步骤613,如果不存在子集,则执行步骤605;

步骤605、将前缀p2移动到被删除的前缀的位置处;

步骤606、判断前缀p2在其它层前缀中是否有超集p3,如果p3存在,则执行步骤607,如果p3不存在,则说明p2是这一分支的最高层,执行步骤613;

步骤607、判断前缀p3在第二层前缀中是否存在与p2不同的子集,如果存在,则删除节点不会导致节点相对顺序被破坏,执行步骤613,如果不存在,则执行步骤608;

步骤608、将前缀p3移动到前缀p2的位置;

步骤609、判断被删除前缀是否位于第二层中,如果位于第二层前缀中,则执行步骤610,否则执行步骤613;

步骤610、判断被删除前缀在其他层中是否存在超集p3,如果存在,则执行步骤611,如果不存在,则被删除前缀位于其所在分支的最高层,执行步骤613;

步骤611、判断p3在第二层前缀中有无与被删除前缀不同的子集前缀,如果该子集存在,则执行步骤613,如果不存在,则执行步骤612;

步骤612、将前缀p3移动到被删除前缀的位置处;

步骤613、删除目标前缀;

步骤614、记录前缀位置和数量的变化;

步骤615、结束此次删除操作。

在删除过程中,涉及到在某一确定前缀层删除前缀,如果在前缀层1或者前缀层2中,只需要删除该前缀,并将相应层的前缀数量减一即可。如果在其它层删除前缀,删除该前缀,并将相应长度的前缀数量减1,如果删除的前缀位于s(l),则相应的s(l)加一;如果删除的前缀位于e(l),则相应的e(l)减一。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1