Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Для узла с IP-адресом 141.237.91.232 адрес сети равен 141.237.88.0.
Чему равно наименьшее возможное значение третьего слева байта маски?
Ответ запишите в виде десятичного числа.
Правильный ответ
248
Пояснение
Решение:
Маска подсети — это 32-битное число, в котором сначала идут только единицы, а потом только нули: единицы отмечают биты адреса сети, нули — биты номера узла. Поэтому маска полностью задаётся длиной префикса, и перебрать нужно всего 33 варианта. Ключевое свойство конъюнкции: единица в адресе сети может стоять только там, где единицы есть и в адресе узла, и в маске.
Первые два байта у адреса узла и адреса сети одинаковы, поэтому маска начинается с 255.255, и ответ определяется третьим байтом. Двоично: узел 91 = 01011011, сеть 88 = 01011000.
Самая правая единица числа 88 стоит на 5-й позиции слева, значит маска должна состоять из единиц хотя бы до 5-й позиции. Минимальный подходящий байт — 11111000, то есть 248, и действительно 91 & 248 = 88. Байт 240 не годится: он погасил бы нужную единицу и дал бы третий байт сети 80 вместо 88.
ip = [141, 237, 91, 232]
net = [141, 237, 88, 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))Ответ: 248