Я хочу иметь возможность различать потоки сетей. Я определяю поток как кортеж из трех значений (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, и нам не разрешено использовать библиотеки, и я не уверен, знаю ли я о хэш-функции, которая вычисляет только элементы, не упорядоченные.
Как я могу легко различить потоки в соответствии с этими правилами?
Сравните значения исходного и целевого IP-адресов в виде 64-битных чисел. Используйте нижний ключ в качестве хеш-ключа и укажите более высокий, протокол и направление в качестве значений.
Выполните поиск таким же образом, используйте нижнее значение в качестве ключа.
Если вы считаете, что один клиент может иметь более одного подключения к услуге, вы увидите, что вам действительно нужно четыре значения для однозначной идентификации потока: 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>
, Добавьте их обоих на карту и наведите их на одну и ту же структуру данных.