Индексированный алгоритм поиска по IP-адресам

учитывая список ACL с 10 миллиардами диапазонов IPv4 в cidr notiation или между двумя IPs:

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

каков эффективный алгоритм поиска/индексирования для тестирования того, что данный IP-адрес соответствует критериям одного или нескольких диапазонов ACL?

предположим, что большинство определений диапазона ACL охватывают большое количество блоков класса C.

индексирование точек через хэш-таблицы легко, но попробуйте, поскольку я, возможно, не смог бы придумать разумный метод для обнаружения, который точки покрываются большим списком "линий".

были некоторые мысли, такие как индексирование намеков на определенный уровень детализации-скажем, предварительные вычисления на уровне класса C каждый ACL, который покрывал эту точку, но таблица была бы слишком большой.. Или какое-то дерево KD для динамического задания уровней детализации.

также подумал, что, возможно, есть алгоритмы обнаружения столкновений, которые могут решить эту проблему.

любые советы или указатели в правильном направлении?

3 ответов


вы можете посмотреть на интервал дерево чтобы найти все интервалы, которые перекрываются с любым заданным интервалом или точкой.

для неперекрывающихся ip-диапазонов вы можете использовать b-дерево или компактные попытки, такие как массивы Judy (64-битные) для индексирования и поиска (сохраните начальный ip как ключ и конечный ip как значение).


простой Дерево Radix, который был использован в самый длинный префикс match поиск маршрутов в интернете можно масштабировать для хранения узлов, представляющих большие подсети CIDR, которые перекрывают другие меньшие. Самый длинный поиск совпадения будет проходить через эти узлы, которые также будут выбраны, чтобы получить весь набор подсетей CIDR, которые соответствуют IP-адресу.

теперь, чтобы держать диапазоны IP в том же дереве, мы можем преобразовать каждый диапазон в набор CIDR подсети. Это всегда можно сделать, хотя набор может иметь много подсетей (и даже некоторые IP-адреса хоста-то есть IP/32-адреса CIDR).


У вас есть 10 миллиардов рублей, чтобы соответствовать 4 миллиардов возможных адресов?

составьте таблицу из 4 миллиардов адресов. Для каждого из 10 миллиардов правил "нарисуйте" адреса, к которым он применяется, делая что-то разумное, когда два или более правил применяются к одному и тому же адресу.