Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Для узла с IP-адресом 198.219.147.99 адрес сети равен 198.219.128.0.
Чему равно наименьшее возможное значение третьего слева байта маски?
Ответ запишите в виде десятичного числа.
Правильный ответ
128
Пояснение
Решение:
Маска — это единиц подряд и затем нули, поэтому её третий слева байт зависит только от : если граница сети проходит внутри третьего байта, он равен 10000000 = 128 при , 11000000 = 192 при , 11100000 = 224 при и так далее. Значит, чем меньше , тем меньше третий байт, и надо найти наименьшее допустимое .
Двоичные записи:
адрес узла 198.219.147.99 — 11000110.11011011.10010011.01100011,
адрес сети 198.219.128.0 — 11000110.11011011.10000000.00000000.
Единица на 17-й позиции (старший бит третьего байта) присутствует в адресе сети, поэтому она обязана попасть в сетевую часть: . Дальше третьи байты 10010011 и 10000000 совпадают лишь в трёх старших разрядах, различающийся четвёртый бит маска должна обнулить, поэтому .
Подходят , то есть маски 255.255.128.0, 255.255.192.0 и 255.255.224.0. Наименьшее значение третьего байта — 128.
Проверка программой:
def to_bits(s):
return ''.join(format(int(x), '08b') for x in s.split('.'))
ip = to_bits('198.219.147.99')
net = to_bits('198.219.128.0')
ok = [k for k in range(33) if ip[:k] + '0' * (32 - k) == net]
bytes3 = [int(('1' * k + '0' * (32 - k))[16:24], 2) for k in ok]
print(ok, bytes3, min(bytes3))
Ответ: 128