LINUX.ORG.RU

Как организовать быстрый поиск соответствия IP адреса по списку сетей ?

 


0

1

Есть
1. файл с информацией об IP пакетах - src_ip,dst_ip, bytes. в котором порядка 8452к записей и их число растет
2. файл с информацией - сеть/маска , AS num. в котором порядка 866к записей
Нужно dst_ip каждой записи первого файла сматчить по сеть/маска записи второго файла и посчитать байты всех сматченных записей.чтобы в итоге получить число байт которое ушло на AS num
как организовать быстрый поиск соответствия? пробегать записью первого файла по второму - в лоб так сказать, видится не оптимальным.
можно табличку с результатами использовать как КЭШ, т.е. сначала по ней искать, в случае не нахождения по табличке в которую положу весь файл п.2 вычеркивая из табличики файла п.2 запись
либо составить дерево с ветками по первому октету сети и разбить табличку с файлом п.2 на 255 веток и уже после сделать тупой перебор
Можно привести строку файла п.2. к записи в которой сеть преобразовать к диапазону целых чисел - 1 поле - число с которого начинается сеть и 2 поле - число которым заканчивается сеть
Какими могут быть подходы для сокращения преобразований и ускорения поиска ?

★★★★

src_ip,dst_ip, bytes

Не mikrotik accountant случаем парсите?

Я в influxdb загнал подобную структуру и от туда можно вытаскивать запросами по ip.

Kolins ★★★
()

Можно привести строку файла п.2. к записи в которой сеть преобразовать к диапазону целых чисел - 1 поле - число с которого начинается сеть и 2 поле - число которым заканчивается сеть

так наверное лучше. такие отрезки ж не могут пересекаться?

alysnix ★★★
()
Ответ на: комментарий от alysnix

не могут, адресное пространство интернета - это не пересекающиеся блоки разной длины (число IP в блоке).

Vlad-76 ★★★★
() автор топика
Последнее исправление: Vlad-76 (всего исправлений: 1)
Ответ на: комментарий от Vlad-76

не могут

значит из второго файла делать двоичное(или еще какое) дерево отрезков, а потом последовательно матчить записи из первого по нему. тогда n*log m.

alysnix ★★★
()
Ответ на: комментарий от Vlad-76

узел дерева - уникальный октет ip адреса ?

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

alysnix ★★★
()

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

Elyas ★★★★★
()
Последнее исправление: Elyas (всего исправлений: 1)
Ответ на: комментарий от Vlad-76

в принципе понятно, осталось эффективный код написать

можно и троичное дерево сделать (лево,центр, право). если в узел попал, и он нетерминальный, то сначала ищешь в центральном отрезке, если ты левей - уходишь на левый, правей - на правый

alysnix ★★★
()

Поделить на сегменты по маске, соответствие AS num получать поиском бинарного 32-битного значения ip&~mask по сегментам бинарным поиском.

bormant ★★★★★
()
Ответ на: комментарий от Elyas

Это первый фильтр на файл п.2 - очистить файл (сеть,AS) от мелких блоков, оставить нужно самые крупные блоки от AS ки.

Vlad-76 ★★★★
() автор топика
Ответ на: комментарий от anonymous

да проблем ни каких, )) тупой перебор еще не реализовал.
просто подумалось что можно сделать быстрее и решил пообщаться со спецами на форуме.

Vlad-76 ★★★★
() автор топика
Ответ на: комментарий от alysnix

в принципе да, в интернете префиксов длиннее чем /24 быть не может для IPv4

Vlad-76 ★★★★
() автор топика

Trie. Оно же raidix tree. Подумай про IP не как о числе, а как о бинарной строке. Тебе нужно найти все строки (сети с маской), являющиеся подстрокой из твоей строки (ip).

Нужно dst_ip каждой записи первого файла сматчить по сеть/маска записи второго файла и посчитать байты всех сматченных записей.чтобы в итоге получить число байт которое ушло на AS num как организовать быстрый поиск соответствия? пробегать записью первого файла по второму - в лоб так сказать, видится не оптимальным.

Тебе нужно найти прямое произведение всех элементов двух множеств. Ясен хрен у тебя n^2 будет. Если список сетей отсортируешь, то можешь уложиться в n*log(n).

Вот тебе либа на русте, которая позволяет такое сделать: https://docs.rs/treebitmap/0.4.0/treebitmap/

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 3)
Ответ на: комментарий от Vlad-76

Наверняка да, но стопудов сишные реализации этого тоже есть. Посмотри сырцы любого BGP демона.

Либо выучи раст. Тут не то чтобы много кода тебе придётся написать:

  1. Всосать файл с подсетями и сделать из него вот это дерево.
  2. Построчно перебрать IP адреса, сделать поиск по дереву, выдать результат в другой файл.
  3. ???
  4. PROFIT!
hateyoufeel ★★★★★
()

IP хранить как uint32

Сети как 2 числа (границы IP адресов) unit32

Работа с uint32 быстрая, проверка на вхождение (IP >= start_net_IP) && (IP <= end_net_IP)

futurama ★★★★★
()
Ответ на: комментарий от hateyoufeel

почему это должно быть в BGP демоне? Скорее ip lookup должен быть в ядре линукс или модуле ipt_netflow или в каком нибудь intel DPDK.

Vlad-76 ★★★★
() автор топика
Ответ на: комментарий от Vlad-76

почему это должно быть в BGP демоне?

Потому что BGP демоны хранят такие таблицы. Ты full view откуда взял, по-твоему? В ведре тоже может быть, но не гарантирую.

hateyoufeel ★★★★★
()

Сделай массив на 2^32 элементов.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.