Разборы · ЕГЭ, задание 10
Задание 10 ЕГЭ по информатике: IP-адрес и маска сети
Что проверяет задание
Задание 10 — про адресацию в сетях TCP/IP: по адресу узла и маске найти адрес сети, число адресов в сети, недостающий байт маски или посчитать адреса с заданным свойством. 1 балл.
Что нужно знать
- IP-адрес — 32 бита, записанные четырьмя числами от 0 до 255 (октетами) через точку.
- Маска в двоичной записи — сначала только единицы, потом только нули. Поэтому октет маски может быть лишь 0, 128, 192, 224, 240, 248, 252, 254 или 255.
- Адрес сети = IP-адрес AND маска — поразрядная конъюнкция: бит равен 1, только если он равен 1 и в адресе, и в маске.
- Если в маске k нулей, в сети 2k адресов. Первый из них — адрес сети, последний — широковещательный; узлам достаётся 2k − 2 адреса.
Как решать
- Октеты, где маска равна 255, переписываются из адреса без изменений; где маска 0 — становятся нулями.
- Октет, где маска «промежуточная», переведите в двоичную систему и выполните поразрядное И.
- Для задач «сколько адресов в сети удовлетворяют условию» удобен модуль
ipaddress: по объекту сети можно пройти циклом.
Пример из демоверсии 2027
Даны адрес узла 192.168.159.86 и маска 255.255.252.0. Найдите адрес сети и запишите сумму его октетов.
Решение. Первые два октета маски — 255, они переписываются: 192 и 168. Последний октет маски — 0, получаем 0. Третий: 159 = 10011111₂, 252 = 11111100₂, поразрядное И даёт 10011100₂ = 156. Адрес сети — 192.168.156.0, сумма октетов 192 + 168 + 156 + 0 = 516.
ip = [192, 168, 159, 86]
mask = [255, 255, 252, 0]
net = [a & m for a, m in zip(ip, mask)]
print(net, sum(net)) # [192, 168, 156, 0] 516
То же через модуль ipaddress. Параметр strict=False нужен, потому что мы передаём адрес узла, а не адрес сети:
from ipaddress import ip_network
net = ip_network("192.168.159.86/255.255.252.0", strict=False)
addr = net.network_address # 192.168.156.0
print(addr, sum(int(x) for x in str(addr).split(".")))
print(net.num_addresses) # 1024 адреса в этой сети
Типичные ошибки
- Выполняют ИЛИ вместо И или просто вычитают маску из адреса.
- Ошибаются при переводе в двоичную систему — проверяйте через
bin(159). - Забывают
strict=Falseи получают ошибку ValueError. - Путают число адресов в сети и число адресов узлов (на 2 меньше).
Потренироваться: задание 10 новые варианты с проверкой ответа