【问题标题】:Indexed ranged search algorithm for IP AddressesIP 地址的索引范围搜索算法
【发布时间】:2010-11-05 18:07:54
【问题描述】:

给定一个 ACL 列表,其中包含 100 亿个以 CIDR 表示或两个 IP 之间的 IPv4 范围:

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

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

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

通过哈希表索引点很容易,但尝试一下,因为我可能无法想出一个合理的方法来检测哪些点被一大串“线”覆盖。

有一些想法,比如在某个细节级别索引提示——比如在 C 类级别预先计算涵盖该点的每个 ACL,但表会太大..或者某种 KD 树来动态设置详细程度。

还想到也许有碰撞检测算法可以解决这个问题。

有正确方向的提示或指示吗?

【问题讨论】:

    标签: indexing ip-address search


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      现在,要将 IP 范围保存在同一棵树中,我们可以convert each range into a set of CIDR subnets。尽管该集合可能有很多子网(甚至一些主机 IP,即 IP/32 类 CIDR 地址),但始终可以这样做。

      【讨论】:

        【解决方案3】:

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

        对于不重叠的 ip-range,您可以使用 b-tree 或紧凑型尝试(如 Judy arrays (64-bits))进行索引和搜索(将 start-ip 存储为 key,end-ip 作为 value)。

        【讨论】:

          猜你喜欢
          • 2016-02-04
          • 1970-01-01
          • 2014-12-21
          • 1970-01-01
          • 1970-01-01
          • 2015-11-28
          • 2012-04-24
          • 2011-02-09
          • 2012-05-26
          相关资源
          最近更新 更多