Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Для узла с IP-адресом 158.6.234.120 адрес сети равен 158.6.192.0.
Чему равно наибольшее количество возможных адресов в этой сети?
В ответе запишите только число.
Правильный ответ
16384
Пояснение
Решение:
Маска подсети — это 32-битное число, в котором сначала идут только единицы, а потом только нули: единицы отмечают биты адреса сети, нули — биты номера узла. Поэтому маска полностью задаётся длиной префикса, и перебрать нужно всего 33 варианта. Ключевое свойство конъюнкции: единица в адресе сети может стоять только там, где единицы есть и в адресе узла, и в маске.
Чем короче префикс маски, тем больше в сети адресов, поэтому найдём все совместимые с условием маски и возьмём самую короткую. Третьи байты: узел 234 = 11101010, сеть 192 = 11000000.
Маска обязана сохранить единицы на 1-й и 2-й позициях и обязана погасить единицу узла на 3-й. Значит третий байт маски — ровно 11000000 (192): байт 128 потерял бы вторую единицу, а байт 224 сохранил бы третью и дал бы 224. Маска единственная — 255.255.192.0, то есть префикс длиной битов.
Под номер узла остаётся свободных битов, каждый независимо равен 0 или 1, поэтому всего адресов в сети .
ip = [158, 6, 234, 120]
net = [158, 6, 192, 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(max(2 ** (32 - bin(m).count('1')) for m in good))Ответ: 16384