Компьютерные сети
Задание 10 ЕГЭ по информатике: IP-адреса и маски сети — разбор и примеры
Задание 10 посвящено адресации в компьютерных сетях по протоколу IPv4. По IP-адресу узла и маске сети нужно найти адрес сети, количество адресов в сети или количество адресов с особым свойством, а в обратных задачах — подобрать маску, при которой два узла окажутся в одной сети. Всё сводится к двоичной записи 32-битных чисел и поразрядной конъюнкции, а на экзамене любую такую задачу можно проверить коротким перебором на Python.
С 2027 года задача про маски сети стоит в варианте под номером 10 (до этого — 13); прежнее задание 10 (поиск слова в текстовом документе) из экзамена убрано.
Что проверяет задание
- знание устройства IPv4-адреса: 4 байта, записанные десятичными числами 0–255 через точку;
- понимание маски сети: сначала идут единицы, затем нули; единицы отмечают часть адреса, общую для всей сети;
- умение вычислять адрес сети как поразрядную конъюнкцию IP-адреса и маски;
- умение считать количество адресов в сети: 2 в степени «число нулей в маске».
Основные понятия
Маска 255.255.240.0 в двоичном виде — это 20 единиц и 12 нулей; кратко её записывают как /20 (длина префикса). Адрес сети получается, если в IP-адресе обнулить все биты, которым в маске соответствуют нули. Адрес, у которого все биты узла равны единице, называется широковещательным. Если в задаче сказано, что адрес сети и широковещательный адрес узлам не выдаются, то узлов в сети на 2 меньше, чем адресов.
Полезно помнить возможные значения байта маски: 0, 128, 192, 224, 240, 248, 252, 254, 255. Других значений у байта маски не бывает.
Типичные формулировки
- «По IP-адресу узла и маске определите адрес сети; в ответе укажите третий байт адреса сети».
- «Сколько различных адресов (или узлов) содержит сеть с данной маской?»
- «Два узла находятся в одной сети. Какое наименьшее количество адресов может быть в этой сети?» или «какое наибольшее количество единиц может быть в маске?»
- «Сколько адресов этой сети имеют в двоичной записи количество единиц, кратное трём?» — частый вариант последних лет, рассчитанный на программу.
Пошаговый метод
- Переведите в двоичный вид только те байты, где маска не равна 255 и не равна 0. Байт маски 255 копирует байт адреса, 0 — обнуляет.
- Выполните поразрядную конъюнкцию в «переходном» байте: бит адреса сети равен 1, только если оба бита равны 1.
- Посчитайте нули маски k: адресов в сети
2**k, узлов —2**k - 2, если об этом сказано. - Для двух узлов найдите первый слева бит, в котором адреса различаются: маска не может закрывать этот бит, поэтому её длина не больше номера позиции перед ним.
- Для подсчёта адресов с условием переберите все адреса сети программой.
Разбор примера 1
Узел имеет IP-адрес 172.19.141.77, маска сети 255.255.240.0. Найдите адрес сети, количество адресов в ней и количество адресов, в двоичной записи которых число единиц кратно 3.
Адрес сети. Первые два байта маски — 255, поэтому они переходят без изменений: 172.19. Последний байт маски 0, значит, последний байт адреса сети 0. Третий байт: 141 = 10001101, 240 = 11110000, конъюнкция 10000000 = 128. Адрес сети: 172.19.128.0.
Количество адресов. В маске 4 + 8 = 12 нулей, значит, адресов 2**12 = 4096.
Адреса с условием. У всех адресов сети общая часть — первые 20 бит: 172 = 10101100 (4 единицы), 19 = 00010011 (3 единицы), начало третьего байта 1000 (1 единица), всего 8 единиц. Оставшиеся 12 бит произвольны. Сумма 8 + k делится на 3, когда число единиц k среди 12 свободных бит равно 1, 4, 7 или 10. Число способов: 12 + 495 + 792 + 66 = 1365.
Ответы: 172.19.128.0; 4096; 1365.
Разбор примера 2
Узлы с IP-адресами 10.40.97.18 и 10.40.103.200 находятся в одной сети. Какое наименьшее количество адресов может содержать эта сеть?
Чем больше единиц в маске, тем меньше адресов. Первые два байта адресов совпадают. Сравним третьи байты: 97 = 01100001, 103 = 01100111. Первые пять бит совпадают (01100), шестой уже различается. Значит, маска может закрывать не больше 16 + 5 = 21 бита, наибольшая длина префикса — /21. Нулей в такой маске 32 − 21 = 11, адресов 2**11 = 2048.
Ответ: 2048.
Код на Python
Модуль ipaddress из стандартной библиотеки умеет вычислять адрес сети и перебирать все её адреса.
from ipaddress import ip_address, ip_interface
# пример 1
net = ip_interface('172.19.141.77/255.255.240.0').network
print(net.network_address, net.num_addresses) # 172.19.128.0 4096
print(sum(1 for ip in net if bin(int(ip)).count('1') % 3 == 0)) # 1365
# пример 2: перебор длины маски
a = int(ip_address('10.40.97.18'))
b = int(ip_address('10.40.103.200'))
best = 0
for p in range(33):
mask = (2**32 - 1) ^ (2**(32 - p) - 1)
if a & mask == b & mask:
best = p
print(2**(32 - best)) # 2048Запись ip_interface('адрес/маска') принимает маску как в виде 255.255.240.0, так и в виде длины префикса /20. Итерация по объекту сети перебирает все адреса, включая адрес сети и широковещательный; если их нужно исключить, используйте net.hosts().
Частые ошибки
- Путают адрес сети и адрес узла: в ответ нужен результат конъюнкции, а не исходный адрес.
- Ошибаются при переводе в двоичную систему: всегда записывайте байт восемью битами, добавляя ведущие нули.
- Забывают про «−2» или, наоборот, вычитают 2, когда спрашивают количество адресов, а не узлов.
- Берут недопустимое значение байта маски, например 250: маска — это всегда единицы, затем нули.
- В задачах про два узла ищут наименьшую маску вместо наибольшей — внимательно читайте, что минимизируется: адреса или единицы в маске.
Потренируйтесь
Решите несколько задач разных типов: задания № 10 в банке. Сначала решите вручную, затем проверьте программой. Подробнее о двоичной записи адресов — в статье «IP-адреса и маски сети». Следующее задание — задание 11.