Algorithm 为ipv6实现最长前缀匹配的最佳方法是什么?

Algorithm 为ipv6实现最长前缀匹配的最佳方法是什么?,algorithm,ipv6,Algorithm,Ipv6,ipv6路由器将许多路由存储为地址的第一个n位。2000年,研究人员在1500条ipv6路由中只发现了14种不同的前缀长度。传入数据包根据最长前缀匹配路由到不同的传出端口,因此如果数据包x的前8位匹配8位路由,但同一数据包的前48位匹配48位路由,则路由器必须选择48位路由 我的路由器正在处理如此多的数据包,以至于在路由表中查找内存的速度是一个限制因素。在路由表中查找最长匹配前缀的好算法是什么?我认为计算最长公共前缀的最有效方法通常是a或a(预处理后运行时与前缀的长度成线性关系)。使用a或a存储

ipv6路由器将许多路由存储为地址的第一个
n
位。2000年,研究人员在1500条ipv6路由中只发现了14种不同的前缀长度。传入数据包根据最长前缀匹配路由到不同的传出端口,因此如果数据包x的前8位匹配8位路由,但同一数据包的前48位匹配48位路由,则路由器必须选择48位路由


我的路由器正在处理如此多的数据包,以至于在路由表中查找内存的速度是一个限制因素。在路由表中查找最长匹配前缀的好算法是什么?

我认为计算最长公共前缀的最有效方法通常是a或a(预处理后运行时与前缀的长度成线性关系)。

使用a或a存储“标准”前缀。后缀树/数组是不必要的过度杀戮;它们用于查找中缀之间的匹配(利用任何中缀都是后缀的前缀这一事实,如果要查找多个字符串之间的匹配,请将它们连接到另一个字符串),而不仅仅是前缀之间的匹配。

是否有一些空闲内存

制作如下结构:

typedef struct node {
  struct node* table[256];
  Port_type port;
} Node;
Node* root[256];
现在,您可以这样进行查找:

Node* table = root;
for (i=0; table != NULL; i++)
{
   node = table[address_byte[i]];
   table = node->table;
}
destination = node->port;
我在这个问题上找到了一个叫做

摘要:我们介绍了我们所知的第一种使用Bloom过滤器进行最长前缀匹配(LPM)的算法。该算法在Bloom过滤器上执行并行查询,Bloom过滤器是成员资格查询的有效数据结构,用于确定按前缀长度排序的前缀集合中的地址前缀成员资格。我们表明,使用该算法进行Internet协议(IP)路由查找可以使搜索引擎提供比基于TCAM的方法更好的性能和可扩展性。
他们的基本思想是使用存储在处理器的嵌入式SRAM(fast)中的bloom过滤器,在较慢但更丰富的内存中引导前缀哈希表的查找。对于IPv4的情况,他们调整算法以考虑大多数路由表前缀是24位的事实。对于IPv6,他们在1550个BGP条目中仅找到14个唯一的前缀长度。

路由表是常量吗?否,它必须不时更新。“在给定的路由表中可能找到的标准前缀长度数量有限。”不,这不是真的。检查任何IPv6窥镜,您会发现许多/30、/35等。至少不能超过128:-0