Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Для узла с IP-адресом 210.34.197.180 адрес сети равен 210.34.196.0.
Чему равно наименьшее возможное значение третьего слева байта маски?
Ответ запишите в виде десятичного числа.
Правильный ответ
252
Пояснение
Решение:
Маска подсети — это 32-битное число, в котором сначала идут только единицы, а потом только нули: единицы отмечают биты адреса сети, нули — биты номера узла. Поэтому маска полностью задаётся длиной префикса, и перебрать нужно всего 33 варианта. Ключевое свойство конъюнкции: единица в адресе сети может стоять только там, где единицы есть и в адресе узла, и в маске.
Первые два байта адреса узла и адреса сети совпадают, а расходятся они только в третьем байте, значит первые два байта маски равны 255 и всё решает третий байт. Запишем его двоично: узел 197 = 11000101, сеть 196 = 11000100.
В числе 196 единицы стоят на 1-й, 2-й и 6-й позициях слева, поэтому маска обязана содержать единицы как минимум до 6-й позиции включительно. Наименьший такой байт — 11111100, то есть 252. Проверяем: 197 & 252 = 196, при этом последняя единица адреса гасится нулём маски, как и требовалось.
ip = [210, 34, 197, 180]
net = [210, 34, 196, 0]
def to_int(a):
return (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]
n, w = to_int(ip), to_int(net)
good = []
for k in range(33): # длина префикса маски
m = (0xFFFFFFFF << (32 - k)) & 0xFFFFFFFF
if n & m == w:
good.append(m)
print(min((m >> 8) & 255 for m in good))Перебор подтверждает: подходят маски 255.255.252.0 и 255.255.254.0, минимальный третий байт равен 252.Ответ: 252