Задание №13 — Маски подсети
В терминологии сетей ТСР/IР маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. Обычно маска записывается по тем же правилам, что и IP-адрес, — в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого разряда — нули. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 125.44.101.252, а маска равна 255.255.255.192, то адрес сети равен 125.44.101.192.
Для узла с IP-адресом 42.118.219.133 адрес сети равен 42.118.216.0. Каково наибольшее возможное количество единиц в разрядах маски?
Правильный ответ
22
Пояснение
Решение:
В маске сначала идут единицы, а потом только нули, поэтому вопрос сводится к тому, сколько старших разрядов IP-адреса сохраняется в адресе сети.
Сравним адрес узла 42.118.219.133 и адрес сети 42.118.216.0 побайтно.
Первые два байта совпадают (42 и 118), значит первые разрядов маски — единицы.
Третий байт: , а в адресе сети . Записи различаются только в двух младших разрядах — конъюнкция их обнулила. Значит, в третьем байте маски два младших разряда обязательно нули, а остальные шесть могут быть единицами: . Проверка: поразрядная конъюнкция и даёт — верно. Больше шести единиц взять нельзя: при единице во втором справа разряде сохранилась бы единица адреса узла и получилось бы 218.
После первого нуля в маске идут только нули, поэтому четвёртый байт маски равен 0; это согласуется с последним байтом адреса сети, который тоже равен 0.
Итого единиц в маске: .
ip = [42, 118, 219, 133]
net = [42, 118, 216, 0]
def mask_bytes(k):
bits = '1' * k + '0' * (32 - k)
return [int(bits[i:i + 8], 2) for i in range(0, 32, 8)]
for k in range(32, -1, -1): # ищем наибольшее число единиц
m = mask_bytes(k)
if all(a & b == c for a, b, c in zip(ip, m, net)):
print(k) # 22
breakОтвет: 22