用于IP地址的索引范围搜索算法

时间:2009-06-25 05:54:28

标签: indexing ip-address search

给出一个ACL列表,其中包含100亿个CIDR符号的IPv4范围或两个IP:

x.x.x.x/y
x.x.x.x - y.y.y.y

什么是有效的搜索/索引算法,用于测试给定的IP地址是否满足一个或多个ACL范围的标准?

让我们假设大多数ACL范围定义都包含大量C类块。

通过哈希表索引点很容易,但我可能无法想出一个合理的方法来检测大量“行”所涵盖的点。

有一些想法,比如在一定程度的细节上索引提示 - 比如在C级预计算每个覆盖该点的ACL,但是表格太大了......或者某种KD树动态设置详细程度。

还有人认为可能存在可以解决这个问题的碰撞检测算法。

正确方向的任何提示或指示?

3 个答案:

答案 0 :(得分:3)

已在Radix Tree Internet路由查找中使用的简单longest prefix match可以进行缩放,以保存代表与其他较小CIDR子网重叠的较大CIDR子网的节点。最长匹配查找将遍历这些节点,这些节点也将被选中以获得与IP地址匹配的整个CIDR子网集。

现在,要将IP范围保存在同一个树中,我们可以convert each range into a set of CIDR subnets。虽然该集可能有很多子网(甚至一些主机IP - 即IP / 32种CIDR地址),但总是可以这样做。

答案 1 :(得分:3)

你有100亿条规则来匹配40亿个可能的地址吗?

制作一个包含40亿个地址的表格。对于100亿条规则中的每条规则,“绘制”它适用的地址,当两个或多个规则适用于同一地址时,做一些合理的事情。

答案 2 :(得分:2)

您可以查看Interval tree以查找与任何给定间隔或点重叠的所有间隔。

对于非重叠的ip范围,您可以使用b-tree或类似Judy arrays (64-bits)的压缩尝试进行索引和搜索(将start-ip存储为密钥,将end-ip存储为值)。 / p>