Задание №10. IP-адреса и маски: сеть, хосты, широковещание
Что от тебя хотят
IP-адрес это четыре числа от 0 до 255, то есть 32 бита. Маска сети показывает, где в адресе заканчивается номер сети и начинается номер узла. В двоичном виде в маске сначала идут сплошные единицы, потом сплошные нули, поэтому маска 255.255.240.0 это 20 единиц и 12 нулей.
Три ключевых слова
| Что | Как получить |
|---|---|
| Адрес сети | Побитовое И адреса узла с маской: хостовые биты обнуляются |
| Широковещательный адрес | В адресе сети все хостовые биты (там, где в маске нули) заменить на единицы |
| Число адресов в сети | 2 в степени числа нулей в маске |
Модуль ipaddress делает всю работу
Адрес и маску записываем через дробь: "145.49.137.244/255.255.240.0". Вместо маски можно писать число единиц: "145.49.137.244/20". Объект сети умеет всё нужное:
net.network_address— адрес сети;net.broadcast_address— широковещательный адрес;net.netmask— маска;net.num_addresses— сколько адресов в сети.
strict=False. Если адрес узла не равен адресу сети, без этого Python откажется строить сеть и выдаст ошибку.
Разбор 1: широковещательный адрес
Сеть задана адресом узла 145.49.137.244 и маской 255.255.240.0. Найдите широковещательный адрес. В ответе укажите сумму четырёх чисел этого адреса.
Ответ получается прямо из первого окна: адрес 145.49.143.255, сумма его чисел 592. Понять, почему так: в третьем байте маски 240 = 11110000, значит нули в младших четырёх битах, и 137 = 10001001 после замены хвоста на единицы превращается в 10001111 = 143. Четвёртый байт целиком хостовый и равен 255.
Разбор 2: подбор маски
Узлы 211.188.211.49 и 211.188.200.115 находятся в разных сетях. В масках обеих сетей одинаковое число единиц. Найдите наименьшее возможное значение третьего слева байта маски.
- Первые два байта у адресов одинаковые, поэтому различие надо искать в третьем: 211 это
11010011, а 200 это11001000. - Эти числа впервые различаются в четвёртом бите. Чтобы сети были разными, маска должна «увидеть» этот бит, то есть в третьем байте нужно хотя бы четыре единицы.
- Минимальная маска:
11110000= 240.
Второе окно делает то же самое перебором: увеличивает число единиц, пока сети не станут разными, и показывает маску.
Разновидности и прототипы задания на экзамене
Код решения на Python
Запустить код в онлайн-песочницеfrom ipaddress import ip_network
net = ip_network("145.49.137.244/255.255.240.0", strict=False)
address = str(net.broadcast_address)
total = 0
for part in address.split("."):
total += int(part)
print(address, total)
from ipaddress import ip_network
for ones in range(1, 33):
net1 = ip_network("211.188.211.49/" + str(ones), strict=False)
net2 = ip_network("211.188.200.115/" + str(ones), strict=False)
if net1 != net2:
print(ones, net1.netmask)
break
Типичные ошибки
strict=Falseip_network("192.168.1.5/24") падает с ValueError: has host bits set.ip_network("192.168.1.5/24", strict=False).net.broadcast_address.ГРОБ №10: Сеть на миллион адресов
Для маски вроде /12 цикл по всем адресам сети работает десятки секунд, а условие проверяется для каждого.
Лайфхаки на экзамене
- Число единиц в маске (длину префикса) можно писать вместо самой маски:
/20вместо255.255.240.0. - Нужен двоичный вид октета с ведущими нулями? Пиши
f"{число:08b}": ровно 8 бит. - Адреса сети можно перебирать циклом
for ip in net, но если сеть большая (миллион адресов), считай свойство по формуле, а не перебором.