Несмотря на то, что задание на IP-адресацию в ЕГЭ уже не первый год, оно вызывает затруднения у большого количества школьников. В связи с этим решил сделать "памятку" по основным видам задач.
Теоретическая справка
Компьютерам, серверам и роутерам в интернете нужно понимать, куда отправлять данные, чтобы они не потерялись во всемирной паутине по пути с какого-нибудь американского хранилища «Ютуба» в браузер школьника Димы в Новокузнецке. Один из помощников в этом деле — IP-адрес.
IP-адрес (Internet Protocol address) — уникальные цифровые координаты, которые присваиваются любому устройству в сети.
Каждое из чисел в адресе — это восьмизначное двоичное число или октет.
Оно может принимать значения от 00000000 до 11111111, что соответствует от 0 до 255 в десятичной системе счисления — то есть 256 разных значений.
С помощью функции ip_address() можно создать объект – IP-адрес. В качестве аргумента функции мы указываем строку, в которой записано значение IP-адреса. Обратите внимание, что функция ip_address() возвращает не просто строку, а объект типа ipaddress.IPv4Address.
Маски ЕГЭ информатика 13 задание
На самом деле IP-адрес — это чуть больше, чем просто набор чисел. Он всегда состоит из двух частей: номера хоста (устройства: компьютера, телевизора, телефона, стиральной машины и любого другого гаджета, подключенного к интернету) и номера сети.
Маска подсети — это 32-битное число, указывающее, какая часть IP-адреса относится к сети, а какая — к устройствам (хостам), находящимся в этой сети.
Рассмотрим следующую задачу:
Она очень просто решается аналитически. Количество адресов, находящихся в сети, соответствует числу 2, возведенному в степень количества нулей в маске. Видим, что здесь 12 нулей в маске, значит в сети 2**12 = 4096 адресов.
Однако в задаче требуется узнать, какое ЕЩЕ количество устройств можно подключить. И здесь мы переходим к одному из ключевых моментов теории по теме, запомнив который, вы будете решать успешно практически все задачи:
Устройствам в сети можно присваивать любые свободные IP-адреса, кроме первого и последнего. Первый адрес — это адрес сети, а последний адрес — широковещательный адрес. Напомню, что широковещательный адрес используется в том случае, когда надо передать информацию всем узлам в сети.
Тогда из 4096 мы вычитаем 1 адрес сети, 1 широковещательный адрес, адреса 2 ноутбуков, 3 мобильных телефонов, 1 планшета и 1 smart-горшка с кактусом. Получаем ответ 4087 адресов.
13 задание ЕГЭ информатика на питоне
Теперь рассмотрим решение этой же задачи с помощью библиотеки ipaddress языка программирования Python.
Для начала надо создать сеть. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Получаем тот же самый ответ: 4087.
На примере этой же сети рассмотрим несколько базовых формулировок задач и кодов для вывода их решений.
То есть метод num_addresses возвращает общее количество адресов в сети. А если нужно посчитать количество адресов, удовлетворяющих некоторому условию, то делается перебор адресов в сети. Рассмотрим на примере все той же сети.
Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса не кратно 3?
Сколько в этой сети IP-адресов, для которых количество единиц и нулей в двоичной записи IP-адреса одинаково?
Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса кратно 4, а сами адреса в двоичном виде заканчиваются на 101?
Сколько в этой сети IP-адресов, которые оканчиваются на два одинаковых бита?
Ну ладно-ладно, всё не так страшно. Надеюсь, вы запомнили, что каждая сеть включает в себя:
- адрес сети
- адреса узлов (синонимы: хостов, устройств)
- широковещательный адрес
Адрес сети — это net[0].
Широковещательный адрес — это net[-1].
Все остальные адреса находятся между ними, то есть net[1], net[2], net[3], net[4], net[5], net[6], net[7] и т.д.
Если нужно проверять условие среди всех IP-адресов, то мы делаем перебор for ip in net.
Если нужно проверять условие среди IP-адресов узлов, то мы делаем перебор for ip in net.hosts().
Рассмотрим несколько примеров.
Сколько в этой сети IP-адресов узлов, для которых в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не превышает суммарного количества единиц в правых двух байтах?
Сколько в этой сети IP-адресов узлов, в двоичной записи которых содержатся четыре подряд идущих нуля?
На ЕГЭ 2024 номер 13 был представлен заданием на подсчет количества адресов в сети, отвечающих определенному условию. Такие номера мы только что подробно рассмотрели. Может ли быть на ЕГЭ по информатике 2025 что-то другое? Может.
Давайте рассмотрим возможные формулировки. Для этого снова вспомним про маску.
Маска может быть представлена в двух видах:
- Количество единиц, входящих в маску
- Десятичный вид
Если 255.255.240.0 перевести в двоичный 32-битовый вид и посчитать количество единиц, то получится 20. Это количество мы видим и при выводе непосредственно сети net.
Переходим к задачам.
Создать сеть без маски нельзя. Никак. Поэтому если маска в условии не задана, то ее нужно перебирать в цикле. И раз маску можно задавать количеством единиц, то именно это и будем перебирать. Максимальное количество бит в маске - 32, поэтому перебор будем ставить до 33, так как правая сторона в range не учитывается.
Для узла с IP адресом 148.165.199.5 адрес сети равен 148.165.192.0. Найдите наибольшее возможное количество единиц в двоичной записи маски подсети.
Найдите наименьшее возможное количество нулей в двоичной записи маски подсети.
Найдите наибольшее возможное значение третьего слева байта маски.
Найдите количество возможных значений маски.
Шаблон 13 задание ЕГЭ информатика: возможен ли?
Если понять разницу между всеми IP-адресами/IP-адресами узлов, то решение задач 13 из ЕГЭ по информатике на Python с помощью модуля ipaddress становятся весьма шаблонным.
Несколько каркасов кодов при должном понимании легко изменяются под любой условие любого типажа задачи.
В прошлом году уже делал разбор отдельных задач, также рекомендую ознакомиться.