Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Для узла с IP-адресом 168.73.162.138 адрес сети равен 168.73.128.0.
Для скольких различных значений маски это возможно?
В ответе запишите только число.
Правильный ответ
2
Пояснение
Решение:
Маска подсети — это 32-битное число, в котором сначала идут только единицы, а потом только нули: единицы отмечают биты адреса сети, нули — биты номера узла. Поэтому маска полностью задаётся длиной префикса, и перебрать нужно всего 33 варианта. Ключевое свойство конъюнкции: единица в адресе сети может стоять только там, где единицы есть и в адресе узла, и в маске.
Требуется сосчитать, сколько разных масок переводят данный адрес узла именно в этот адрес сети. Третьи байты двоично: узел 162 = 10100010, сеть 128 = 10000000.
Условий два. Единица сети на 1-й позиции требует единицы в маске. А единицы узла на 3-й и 7-й позициях в адресе сети погашены, значит там маска обязана иметь нули. Так как маска — это сплошной блок единиц, третий байт может быть только 10000000 (128) или 11000000 (192): уже байт 11100000 (224) сохранил бы единицу на 3-й позиции и дал бы третий байт сети 160.
ip = [168, 73, 162, 138]
net = [168, 73, 128, 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(len(good))Подходят ровно две маски: 255.255.128.0 и 255.255.192.0.Ответ: 2