Я должен добавить проверки в пользовательский интерфейс моего программного обеспечения (Пользовательский интерфейс IP-подсети), который позволяет пользователю ввести пару IP-адресов и масок подсети. Я должен убедиться, что два сетевых интерфейса не настроены в одной подсети.
Насколько я понимаю, если я выполню побитовое И между IP-адресом и маской подсети, я получу идентификатор сети, и если идентификаторы N / W не совпадают, будет ли этого достаточно, чтобы утверждать, что два сетевых интерфейса не находятся в одной подсети?
Этот вопрос ограничен IPV4.
Вам нужно замаскировать два адреса с помощью тем же маска сети, чтобы определить, является ли сеть такой же. Для сравнения необходимо использовать самую короткую маску сети. Таким образом вы определяете, находятся ли оба адреса в одной сети.
Процедура одинакова как для IPv4, так и для IPv6, за исключением размеров адреса и маски.
Например, 10.0.0.0/25
и 10.0.0.64/26
повторно запустит ту же сеть с самой короткой маской (255.255.255.128
), но вернет разные сети с самой длинной маской (255.255.255.192
) даже если вторая сеть является подсетью первой сети, поэтому любые адреса во второй сети попадают в первую сеть.
С самой короткой маской:
10.0.0.0 -> 00001010000000000000000000000000
255.255.255.128 -> 11111111111111111111111110000000
AND -> ================================
00001010000000000000000000000000 = 10.0.0.0
10.0.0.64 -> 00001010000000000000000001000000
255.255.255.128 -> 11111111111111111111111110000000
AND -> ================================
00001010000000000000000000000000 = 10.0.0.0
С самой длинной маской:
10.0.0.0 -> 00001010000000000000000000000000
255.255.255.192 -> 11111111111111111111111111000000
AND -> ================================
00001010000000000000000000000000 = 10.0.0.0
10.0.0.64 -> 00001010000000000000000001000000
255.255.255.192 -> 11111111111111111111111111000000
AND -> ================================
00001010000000000000000001000000 = 10.0.0.64
С назначенными масками:
10.0.0.0 -> 00001010000000000000000000000000
255.255.255.128 -> 11111111111111111111111110000000
AND -> ================================
00001010000000000000000000000000 = 10.0.0.0
10.0.0.64 -> 00001010000000000000000001000000
255.255.255.192 -> 11111111111111111111111111000000
AND -> ================================
00001010000000000000000001000000 = 10.0.0.64
Как видите, только пример с использованием кратчайшей маски фактически возвращает правильный ответ, что второй адрес находится в сети первого адреса.
Во-первых, вам действительно нужна только одна запись маски подсети, поскольку их не следует помещать в одну подсеть, если у них две разные маски. Но помимо этого, да, вы И адреса с маской, и если вы получите тот же результат, они находятся в одной подсети.