Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 132.71.21.128 и маской сети 255.255.255.192.
Определите минимальную сумму единиц в двоичной записи IP-адреса в этой сети.
В ответе укажите только число.
Правильный ответ
10
Пояснение
Решение:
Маска — это 32-битное число, у которого сначала идут только единицы, а затем только нули: единицы стоят на местах битов, отвечающих за адрес сети, нули — на местах битов адреса узла. Поразрядная конъюнкция адреса с маской обнуляет узловую часть, поэтому у всех адресов одной сети «сетевые» биты одинаковы, а «узловые» пробегают все возможные комбинации.
Маска 255.255.255.192 в двоичном виде — 11111111.11111111.11111111.11000000, в ней 26 единиц. Значит, первые 26 битов адреса зафиксированы, а последние 6 свободны и дают адреса. Адрес сети: 128 & 192 = 10000000 & 11000000 = 10000000, то есть сеть 132.71.21.128, а её неизменяемая часть в двоичной записи — 10000100.01000111.00010101.10.
Сосчитаем единицы в этой фиксированной части: в 132 их 2, в 71 — 4, в 21 — 3, в двух старших битах последнего байта — 1, всего . Эти десять единиц есть у любого адреса сети, убрать их нельзя. Остальные 6 битов мы выбираем сами, и чтобы сумма единиц была наименьшей, все их делаем нулями — получается сам адрес сети 132.71.21.128 с суммой единиц 10.
Проверка программой:
from itertools import product
def to_bits(s):
return ''.join(format(int(x), '08b') for x in s.split('.'))
ip = to_bits('132.71.21.128')
mask = to_bits('255.255.255.192')
k = mask.count('1')
head = ip[:k]
addrs = [head + ''.join(t) for t in product('01', repeat=32 - k)]
print(min(a.count('1') for a in addrs))
Ответ: 10