Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Для узла с IP-адресом 188.89.220.167 адрес сети равен 188.89.220.0.
Чему равно наименьшее возможное значение третьего слева байта маски?
Ответ запишите в виде десятичного числа.
Правильный ответ
252
Пояснение
Решение:
Начнём с последнего байта: у узла это 167 = 10100111, а у сети — 0. Поразрядная конъюнкция обнуляет байт только тогда, когда во всех позициях, где у узла стоит единица, у маски стоит ноль. Старший бит числа 167 равен единице, а маска устроена как непрерывная цепочка единиц, поэтому в последнем байте маски единиц быть не может: он равен 0.
Теперь третий байт: и у узла, и у сети он равен 220 = 11011100. Значит, конъюнкция третьего байта маски с 11011100 должна дать само 11011100, то есть у маски обязаны стоять единицы во всех позициях, где единица есть у 220. Самая правая единица числа 220 — шестая слева, а единицы маски идут подряд с начала байта, поэтому их не меньше шести. Наименьший подходящий вариант — 11111100 = 252; проверка: конъюнкция 11111100 и 11011100 действительно даёт 11011100 = 220. Итак, минимальное значение третьего байта маски равно 252 (маска 255.255.252.0).
def ip(a, b, c, d):
return ((a * 256 + b) * 256 + c) * 256 + d
node = ip(188, 89, 220, 167)
net = ip(188, 89, 220, 0)
third = []
for k in range(33):
mask = 2 ** 32 - 2 ** (32 - k)
if (node & mask) == net:
third.append((mask // 256) % 256) # третий слева байт маски
print(third, min(third)) # [252, 254, 255] 252
Ответ: 252