Задание №13 — Маски подсети
В терминологии сетей ТСР/IР маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу самого узла в этой сети. Обычно маска записывается по тем же правилам, что и IP-адрес, - в виде четырех байтов, причём каждый байт записывается в виде десятичного числа. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого разряда - нули. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 125.44.101.252, а маска равна 255.255.255.192, то адрес сети равен 125.44.101.192.
Для узла с IP-адресом 44.44.229.28 адрес сети равен 44.44.224.0. Каково наибольшее возможное количество единиц в разрядах маски?
Правильный ответ
21
Пояснение
Решение:
IP-адрес 44.44.229.28, адрес сети 44.44.224.0. Маска состоит из идущих подряд единиц, а затем нулей.
Первые два байта адреса и сети совпадают, поэтому в маске они могут быть равны 255.255 — это 16 единиц.
Третий байт: , в адресе сети . Проверяем префиксные маски третьего байта:
- : — подходит (3 единицы);
- : — подходит (4 единицы, так как четвёртый бит числа 229 нулевой);
- : — подходит (5 единиц);
- : — не подходит.
Значит, в третьем байте маски не более 5 единиц. Так как третий байт маски не равен 255, четвёртый байт обязан быть нулевым.
Наибольшее число единиц: (маска 255.255.248.0).
ip = [44, 44, 229, 28]
net = [44, 44, 224, 0]
val = lambda p: (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]
best = 0
for k in range(33):
m = ((1 << k) - 1) << (32 - k) & 0xFFFFFFFF
if val(ip) & m == val(net):
best = max(best, k)
print(best) # 21
Ответ: 21