ipv6路由器将许多路由存储为地址的第一个n
位。 2000年,研究人员在1500条ipv6路线中发现只有14种不同的前缀长度。传入数据包根据最长前缀匹配路由到不同的传出端口,因此如果数据包x的前8位与8位路由匹配,但同一数据包的前48位与48位路由匹配,则路由器必须选择48位路线。
我的路由器正在处理这么多数据包,因此查找路由表的内存速度是一个限制因素。在路由表中找到最长匹配前缀的好算法是什么?
答案 0 :(得分:5)
使用trie或radix-tree来存储“标准”前缀。后缀树/数组是不必要的过度杀戮;它们用于查找 infixes 之间的匹配(使用任何中缀是后缀的前缀,如果你想找到几个字符串之间的匹配,将它们相互连接),而不是就在前缀之间。
答案 1 :(得分:2)
我在这个问题上找到了cool paper Longest Prefix Matching using Bloom Filters。
摘要:我们介绍了第一个使用Bloom过滤器进行最长前缀匹配(LPM)的算法。该算法对Bloom过滤器执行并行查询,Bloom过滤器是用于成员资格查询的有效数据结构,以便确定按前缀长度排序的前缀集合中的地址前缀成员资格。我们表明,使用此算法进行Internet协议(IP)路由查找会导致搜索引擎提供比基于TCAM的方法更好的性能和可伸缩性。
他们的基本想法是使用存储在处理器的嵌入式SRAM(快速)中的bloom过滤器来指导较慢但更丰富的内存中的前缀哈希表查找。对于IPv4情况,他们调整他们的算法以考虑大多数路由表前缀是24位的事实。对于IPv6,他们在1550个BGP条目中只找到了14个唯一的前缀长度。
答案 2 :(得分:0)
我认为计算最长公共前缀的最有效方法通常是suffix tree或suffix array(运行时与预处理后的前缀长度呈线性关系)。
答案 3 :(得分:0)
你有一些备用内存吗?
制作这样的结构:
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;