Задание №13 — Маски подсети
В терминологии сетей ТСР/IР маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. Обычно маска записывается по тем же правилам, что и IP-адрес, — в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого разряда — нули. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 125.44.101.252, а маска равна 255.255.255.192, то адрес сети равен 125.44.101.192.
Для узла с IР-адресом 99.188.115.211 адрес сети равен 99.188.115.192. Каково наибольшее возможное количество единиц в разрядах маски?
Правильный ответ
27
Пояснение
Решение:
Маска — это несколько единиц подряд, а затем нули. Сравним адрес узла 99.188.115.211 и адрес сети 99.188.115.192 побайтно.
Первые три байта совпадают (99, 188, 115), значит первые разряда маски — единицы.
Четвёртый байт: , а в адресе сети . Конъюнкция обнулила единицы адреса узла в разрядах со значениями , и . Самый старший из обнулённых разрядов — это разряд со значением (пятый слева). Значит, начиная с него в маске уже стоят нули, и в последнем байте маски может быть не более трёх единиц: .
Проверка: поразрядная конъюнкция и даёт — верно.
Итого единиц в маске: .
ip = [99, 188, 115, 211]
net = [99, 188, 115, 192]
def mask_bytes(k):
bits = '1' * k + '0' * (32 - k)
return [int(bits[i:i + 8], 2) for i in range(0, 32, 8)]
for k in range(32, -1, -1):
m = mask_bytes(k)
if all(a & b == c for a, b, c in zip(ip, m, net)):
print(k) # 27
breakОтвет: 27