Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Для узла с IP-адресом 228.154.120.177 адрес сети равен 228.154.120.128.
Каково наибольшее возможное количество единиц в двоичной записи маски?
В ответе укажите только число.
Правильный ответ
26
Пояснение
Решение:
Маска состоит из идущих подряд единиц и затем нулей. На единичной части маски биты адреса сети повторяют биты адреса узла, а на нулевой части адрес сети обязан состоять из нулей. Первые три байта у узла и у сети совпадают, поэтому смотрим на последний байт:
узел: 177 = 10110001
сеть: 128 = 10000000
Первые два бита совпадают, а третий бит последнего байта (27-й бит адреса) различается: у узла 1, у сети 0. Значит, этот бит уже находится в нулевой части маски, и единиц в маске не больше . Маска с 26 единицами подходит: она оставляет от последнего байта только 10, что и даёт 128, а младшие биты обнуляет. Поэтому наибольшее число единиц равно 26 (маска 255.255.255.192).
def ip(a, b, c, d):
return ((a * 256 + b) * 256 + c) * 256 + d
node = ip(228, 154, 120, 177)
net = ip(228, 154, 120, 128)
good = []
for k in range(33): # k — число единиц в маске
mask = 2 ** 32 - 2 ** (32 - k)
if (node & mask) == net:
good.append(k)
print(good, max(good)) # [25, 26] 26
Ответ: 26