给出一个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树动态设置详细程度。
还有人认为可能存在可以解决这个问题的碰撞检测算法。
正确方向的任何提示或指示?
答案 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>