Как различить сетевые потоки

Я хочу иметь возможность различать потоки сетей. Я определяю поток как кортеж из трех значений (sourceIP, destIP, protocol), Я храню их в C ++ map для быстрого доступа. Однако, если IP-адрес назначения и IP-адрес источника разные, но содержат одинаковые значения (например,)

[packet 1: source = 1.2.3.4, dest = 5.6.7.8]

[packet 2: source = 5.6.7.8, dest = 1.2.3.4 ]

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

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

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

Как я могу легко различить потоки в соответствии с этими правилами?

1

Решение

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

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

2

Другие решения

Если вы считаете, что один клиент может иметь более одного подключения к услуге, вы увидите, что вам действительно нужно четыре значения для однозначной идентификации потока: IP-адреса источника и назначения, а также порты источника и назначения. Например, представьте, что два разработчика в одном офисе одновременно ищут StackOverflow. Они оба подключатся к stackoverflow.com:80 и оба будут иметь один и тот же адрес источника. Но исходные порты будут другими (иначе брандмауэр компании не будет знать, куда направлять возвращаемые пакеты). Таким образом, вам нужно идентифицировать каждый узел по <address, port> пара.

Некоторые идеи:

  • Как и предполагал Старк, сортируйте узлы источника и назначения, объединяйте их и хешируйте результат.

  • Хешируйте источник, хешируйте место назначения и XOR результат. (Обратите внимание, что это может ослабить хеш и допустить больше коллизий.)

  • Сделайте 2 записи для каждого потока путем хэширования
    <src_addr, src_port, dst_addr, dst_port> а также
    <dst_addr, dst_port, src_addr, src_port>, Добавьте их обоих на карту и наведите их на одну и ту же структуру данных.

2

По вопросам рекламы [email protected]