Сопоставьте общедоступные IP-адреса с заданными пользователем сетевыми масками.

Недавно мне поставили задачу в моей компании, где я должен создать такую ​​​​функцию:

boolean addrMatch(String IP, String netMask);

Это не имеет никакого отношения к маршрутизации. У нас есть сетевая служба, которая будет использовать эту функцию. Параметр IP зависит от всех запросов, параметр netMask задается пользователем. Функция должна сообщать, совпадает ли фактический IP-адрес с предоставленной сетевой маской или нет. Это похоже на то, как пользователь говорит нашей системе обслуживать запросы в общедоступном Интернете только на определенное подмножество IP-адресов, а не на все из них. Мои знания, связанные с сетями, далеки от совершенства, поэтому я провел глубокий поиск по этой теме, но не продвинулся очень далеко. Что я знаю (или мне сказали): все два параметра являются действительными IP-адресами или сетевыми масками в нотации xxx.xxx.xxx.xxx. Я должен выполнить побитовое И над ними (очевидно, после преобразования их в массив BitSet или, по крайней мере, byte[]). Но я думаю, что это не полный алгоритм. Итак, мой вопрос: каков правильный алгоритм сопоставления IP-адреса с сетевой маской?

PS: я работаю на Java, но мне нужен общий метод.


person gyorgyabraham    schedule 21.08.2012    source источник


Ответы (1)


Сетевая маска - это просто битовая маска. В основном, если address & netmask != 0, адрес находится в подсети, представленной сетевой маской. Детали реализации, с которыми вам приходится иметь дело, — это байты вместо битов и различное количество байтов в зависимости от того, используете ли вы IPv4 или IPv6. Но в принципе банально.

person user207421    schedule 21.08.2012
comment
Я преобразовал IP и маску в массивы byte[] и сделал res[i] = ip[i] & mask[i]. Результат содержит 4 целых числа. Если результат не содержит нулей, IP-адрес совпадает с маской, но если содержит хотя бы один ноль, IP-адрес не может быть в подсети, представленной маской? Извините за элементарные вопросы :) - person gyorgyabraham; 21.08.2012
comment
@gyabraham Если какой-либо бит отличен от нуля, он совпадает. - person user207421; 22.08.2012