Задание №10 ЕГЭ по информатике: разбор, шаблоны кода Python и анти-примеры | СмартКИМ
СмартКИМ УДОБНАЯ ПОДГОТОВКА К ЕГЭ И ОГЭ
Задачи №10 Решать в тренажере Войти в СмартКИМ
ЕГЭ (1–27) ОГЭ (1–15) Python: шпаргалка
Быстрый переход по номерам и темам
Базовый (1 балл) Время: 2-4 мин Python ipaddress ip_network Побитовое И Все задачи №10 в каталоге

Задание №10. IP-адреса и маски: сеть, хосты, широковещание

Тема: Адрес сети, широковещательный адрес, подбор маски, модуль ipaddress
Есть IP-адреса и маска сети. Нужно найти адрес сети, широковещательный адрес или подобрать маску по условию. В Python для этого есть готовый модуль ipaddress.

Что от тебя хотят

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 находятся в разных сетях. В масках обеих сетей одинаковое число единиц. Найдите наименьшее возможное значение третьего слева байта маски.

  1. Первые два байта у адресов одинаковые, поэтому различие надо искать в третьем: 211 это 11010011, а 200 это 11001000.
  2. Эти числа впервые различаются в четвёртом бите. Чтобы сети были разными, маска должна «увидеть» этот бит, то есть в третьем байте нужно хотя бы четыре единицы.
  3. Минимальная маска: 11110000 = 240.

Второе окно делает то же самое перебором: увеличивает число единиц, пока сети не станут разными, и показывает маску.

Маска всегда состоит из единиц слева и нулей справа. Допустимые значения байта: 0, 128, 192, 224, 240, 248, 252, 254, 255. Других не бывает.

Разновидности и прототипы задания на экзамене

Тип 1: Адрес сети или широковещательный адрес
По адресу узла и маске получаем адрес сети (хостовая часть нули) или широковещательный (хостовая часть единицы).
Тип 2: Подбор маски
Известны два узла и условие про сеть. Перебираем длину маски от 1 до 32.
Тип 3: Счёт адресов с условием
Перебираем адреса сети и проверяем свойство, например число единиц.

Код решения на Python

Запустить код в онлайн-песочнице
ip_network(..., strict=False)net.broadcast_addressnet.netmaskstr(...).split(".")int(part)
Широковещательный адрес и сумма его чисел
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=False
ip_network("192.168.1.5/24") падает с ValueError: has host bits set.
✓ Так
Всегда ip_network("192.168.1.5/24", strict=False).
✕ Не так
Принять адрес сети за широковещательный
Адрес сети это хост из нулей, широковещательный из единиц.
✓ Так
Для широковещательного брать net.broadcast_address.
✕ Не так
Считать, что любая маска годится
Маска вида 255.255.250.0 невозможна: в двоичной записи нули стоят перед единицей.
✓ Так
Допустимый байт: 0, 128, 192, 224, 240, 248, 252, 254, 255.
ГРОБ

ГРОБ №10: Сеть на миллион адресов

Для маски вроде /12 цикл по всем адресам сети работает десятки секунд, а условие проверяется для каждого.

Как обойти
Меняется только хостовая часть адреса. Перебирай отдельно изменяющиеся байты, а остальные оставляй как есть.

Лайфхаки на экзамене

  1. Число единиц в маске (длину префикса) можно писать вместо самой маски: /20 вместо 255.255.240.0.
  2. Нужен двоичный вид октета с ведущими нулями? Пиши f"{число:08b}": ровно 8 бит.
  3. Адреса сети можно перебирать циклом for ip in net, но если сеть большая (миллион адресов), считай свойство по формуле, а не перебором.
Банк реальных задач №10 Открыть в тренажере СмартКИМ