Теория
Что нужно знать
В 2027 году задание 10 проверяет адресацию IPv4 и маски подсетей. В демоверсии дан адрес узла 192.168.159.86 и маска 255.255.252.0: нужно найти адрес сети и записать сумму его октетов. В банке задач формулировки шире — адрес сети, широковещательный адрес, наибольший или наименьший адрес для компьютера, количество хостов, маска по известному адресу сети, подсчёт адресов с условием на биты и неизвестный октет A. Почти всё сводится к двоичной записи четырёх октетов, поэтому теория здесь компактная: адрес, маска, побитовое И и границы блока.
Как устроено задание 10
В 2027 году задание 10 относится к разделу «Цифровая грамотность» и оценивается в 1 первичный балл. В демоверсии требуется найти адрес сети по IP узла и маске и вернуть сумму четырёх октетов этого адреса. В открытом банке встречаются и обратные задачи: по IP и адресу сети восстановить маску, найти широковещательный адрес, посчитать количество хостов или отобрать адреса по битовому условию. Во всех случаях нужно аккуратно работать с 32-битной записью.
- Ответ — число, IP-адрес по октетам или значение одного байта маски.
- Адрес сети и широковещательный адрес зарезервированы: компьютерам их не назначают.
- Формулировка «для всех IP-адресов сети» означает, что проверять нужно каждый адрес блока.
- Формулировка «для узлов» обычно исключает адрес сети и широковещательный адрес.
- Решать можно вручную по битам или программой через модуль ipaddress.
IPv4: 32 бита и четыре октета
IP-адрес IPv4 — это 32 бита, записанные четырьмя октетами через точку. Каждый октет занимает 8 бит и принимает значение от 0 до 255. В двоичной записи октет всегда содержит ровно восемь разрядов, поэтому ведущие нули не отбрасывают: 86 — это 01010110, а не 1010110.
- 192.168.159.86 = 11000000.10101000.10011111.01010110.
- Веса разрядов октета: 128, 64, 32, 16, 8, 4, 2, 1.
- 255 = 11111111, 0 = 00000000, 252 = 11111100.
- Перевод в десятичную запись: сложите веса единичных разрядов.
- В ответе октеты записываются десятичными числами через точку.
128 64 32 16 8 4 2 1255 = 11111111
Маска и префикс /n
Маска сети — 32-битное число, в котором сначала идут n единиц, а затем 32 − n нулей. Её записывают четырьмя октетами или коротко /n. Число n называется префиксом и равно количеству единиц в маске. Маска не может быть произвольной: запись 255.255.200.0 невозможна, потому что после нулей в третьем октете снова идёт единица.
- /24 = 255.255.255.0: 24 единицы и 8 нулей.
- /22 = 255.255.252.0: 22 единицы и 10 нулей.
- /26 = 255.255.255.192: 26 единиц и 6 нулей.
- Допустимые октеты маски: 0, 128, 192, 224, 240, 248, 252, 254, 255.
- Последний октет маски равен 256 − размер блока.
/n: n единиц, затем 32 − n нулейblock = 256 − mask_octet
Адрес сети: побитовое И
Адрес сети получается в результате поразрядной конъюнкции IP-адреса узла и маски. Там, где в маске стоят единицы, биты IP сохраняются; там, где стоят нули, биты обнуляются. Поэтому в адресе сети все биты хоста равны нулю, и он является первым адресом блока.
- 192 & 255 = 192, 168 & 255 = 168, 159 & 252 = 156, 86 & 0 = 0.
- 192.168.159.86 при маске 255.255.252.0 даёт сеть 192.168.156.0.
- Меняется только тот октет, в котором маска не 0 и не 255.
- Адрес сети всегда кратен размеру блока в «своём» октете.
- Проверка: побитовое И адреса сети и маски должно дать тот же адрес.
адрес сети = IP & маскаnetwork_octet = ip_octet & mask_octet
Быстрый счёт по блоку
Вручную не нужно переводить все 32 бита. Найдите октет, где маска принимает промежуточное значение, и посчитайте размер блока: block = 256 − значение этого октета маски. Затем округлите значение IP в этом октете вниз до кратного block. Остальные октеты просто копируются или обнуляются.
- Маска 255.255.252.0: block = 256 − 252 = 4.
- 159 → 156, потому что 159 = 39 · 4 + 3.
- Маска 255.255.248.0: block = 8, поэтому 228 → 224.
- Маска 255.255.255.192: block = 64, поэтому 230 → 192.
- Если октет маски равен 255, значение IP не меняется; если 0 — становится нулём.
network_octet = (ip_octet // block) * blockblock = 256 − mask_octet
Широковещательный адрес и адреса узлов
Широковещательный (broadcast) адрес — последний адрес блока: в нём все биты хоста заменены единицами. Адрес сети и широковещательный адрес зарезервированы, поэтому их не назначают компьютерам. Наименьший адрес узла — network + 1, наибольший — broadcast − 1.
- Сеть 192.168.156.0/22: broadcast 192.168.159.255.
- Первый адрес узла — 192.168.156.1, последний — 192.168.159.254.
- «Наибольший адрес, который можно назначить» — это broadcast − 1.
- «Наименьший адрес узла» — это network + 1.
- В ответе «сумма октетов» складывают ровно четыре числа.
broadcast = network + 2^(32−n) − 1first host = network + 1last host = broadcast − 1
Количество адресов и хостов
В сети 2^(32−n) адресов. Если два служебных адреса не используются, количество хостов равно 2^(32−n) − 2. Внимательно читайте формулировку: «количество IP-адресов в сети» может включать адрес сети и broadcast, а «количество компьютеров, которым можно назначить адрес» — нет.
- /22: 2^10 = 1024 адреса и 1022 хоста.
- /24: 256 адресов и 254 хоста.
- /26: 64 адреса и 62 хоста.
- /30: 4 адреса и 2 хоста.
- Хостов с нечётными номерами ровно половина: (2^(32−n) − 2) / 2.
- Для /31 и /32 стандартная формула «минус два» даёт 0 или отрицательное число; в школьных задачах такие маски почти не встречаются.
addresses = 2^(32−n)hosts = 2^(32−n) − 2odd hosts = hosts / 2
Обратная задача: маска по IP и адресу сети
Если известны IP узла и адрес сети, маску можно восстановить неоднозначно. Сравните двоичные записи. Маска может закрывать только те биты, где IP и адрес сети совпадают. Минимальный префикс определяется последней единицей адреса сети, максимальный — первым различающимся битом IP и адреса сети.
- IP 168.224.22.193 и сеть 168.224.16.0: возможны префиксы /20 и /21, наименьший — /20.
- Маска /20 — это 255.255.240.0.
- IP 130.140.241.137 и сеть 130.140.240.0: возможны /20…/23, наибольший — /23.
- Маска /23 — это 255.255.254.0.
- Число различных подходящих масок равно max − min + 1.
- Если просят один байт маски, берут соответствующий октет найденной маски.
n_min — позиция последней единицы адреса сетиn_max — позиция перед первым различием IP и адреса сетиподходящие n: n_min … n_max
Неизвестный октет A и условия на все адреса
В задачах с буквой A один октет IP или маски неизвестен. Если условие должно выполняться для всех адресов сети, проще всего перебрать A от 0 до 255, построить сеть и проверить каждый адрес. Такой перебор короткий и надёжный; вручную анализируют биты только для экономии времени.
- Для IP 154.127.A.230 и маски 255.255.255.192 максимальное A равно 192.
- Для IP 16.32.A.48 и маски 255.255.240.0 минимальное A равно 112.
- При проверке только узлов пропускайте адрес сети и широковещательный адрес.
- Условие «для всех» — это all(...), условие «существует» — any(...).
- Если A стоит в октете маски, проверяйте, что маска остаётся допустимой.
for A in range(256):all(condition(ip) for ip in network)
Подсчёт адресов по битовому условию
В задачах «сколько в сети таких IP-адресов» перебирают все адреса сети и проверяют двоичную запись. Для количества единиц достаточно count('1'). Для количества нулей и для поиска подстрок используйте 32-битную запись f'{int(ip):032b}': иначе ведущие нули будут потеряны и ответ изменится.
- Сеть 192.168.32.128/26: чётное количество единиц у 32 адресов.
- Сеть 165.44.96.0/21: три подряд идущие единицы у 1121 адреса.
- Сеть 136.36.240.16/29: подстрока 101 не встречается у 4 адресов.
- Сеть 136.108.34.160/28: подстрока 1001 не встречается у 11 адресов.
- «IP-адресов в сети» включает адрес сети и broadcast; «узлов» — исключает.
- Для проверки одного октета переводите его отдельно: f'{octet:08b}'.
f'{int(ip):032b}'binary.count('1')'111' in binary'101' not in binary
Формат ответа и проверка
В задании 10 ответ короткий, но ошибка в формате стоит балла. Проверьте, что именно просят: адрес сети или broadcast, сумму октетов или сам адрес, количество адресов или количество хостов, префикс или десятичную маску.
- Сумма октетов: 192 + 168 + 156 + 0 = 516.
- Адрес в ответе — четыре десятичных числа через точку.
- Если ответ вводят по октетам в клетки, каждое число от 0 до 255.
- Префикс /22 и маска 255.255.252.0 — разные формы записи одного числа.
- Проверьте ответ вторым способом: вручную и через ipaddress.
ip_network('192.168.159.86/255.255.252.0', strict=False)
Разбор примера
Учебный пример: адрес сети, broadcast и сумма октетов
Разберём демоверсию 2027 целиком: найдём адрес сети, широковещательный адрес и количество хостов, а затем сумму октетов адреса сети.
Демоверсия 2027: узел 192.168.159.86, маска 255.255.252.0
| Октет | IP узла | IP в двоичном виде | Маска | Адрес сети | Broadcast |
| 1 | 192 | 11000000 | 255 | 192 | 192 |
| 2 | 168 | 10101000 | 255 | 168 | 168 |
| 3 | 159 | 10011111 | 252 | 156 | 159 |
| 4 | 86 | 01010110 | 0 | 0 | 255 |
- Маска 255.255.252.0 — это /22: 22 бита адреса сети и 10 битов хоста.
- Побитовое И: 192 & 255 = 192, 168 & 255 = 168.
- В третьем октете 252 = 11111100, поэтому 159 & 252 = 10011100 = 156.
- В четвёртом октете маска 0, поэтому все биты обнуляются: 86 & 0 = 0.
- Адрес сети 192.168.156.0. Broadcast: заменяем 10 битов хоста единицами — 192.168.159.255.
- Хостов 2^10 − 2 = 1022. Сумма октетов адреса сети: 192 + 168 + 156 + 0 = 516.
Ответ516 (адрес сети 192.168.156.0, broadcast 192.168.159.255, 1022 хоста).