代码之家  ›  专栏  ›  技术社区  ›  Einstein

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

  •  10
  • Einstein  · 技术社区  · 16 年前

    给定一个acl列表,在cidr notation中或两个ips之间有100亿个ipv4范围:

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

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

    让我们假设大多数ACL范围定义跨越大量的C类块。

    通过哈希表对点进行索引很容易,但我可能无法找到一种合理的方法来检测哪些点被一大串“行”所覆盖。

    有一些想法,比如在某个细节级别索引提示——比如在C类级别进行预计算,每个覆盖该点的ACL,但是表太大了。或者某种类型的kd树来动态地设置细节级别。

    也有这样的想法,也许有碰撞检测算法可以解决这个问题。

    有没有正确方向的提示或指针?

    3 回复  |  直到 16 年前
        1
  •  2
  •   bill    16 年前

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

    对于不重叠的IP范围,可以使用B树或类似的紧凑尝试 Judy arrays (64-bits) 用于索引和搜索(将起始IP存储为键,将结束IP存储为值)。

        2
  •  3
  •   nik    16 年前

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

    现在,要将IP范围保存在同一个树中,我们可以 convert each range into a set of CIDR subnets . 尽管集合可能有很多子网(甚至一些主机IP,也就是IP/32类CIDR地址),但这总是可以做到的。

        3
  •  3
  •   Will    16 年前

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

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