Базовый (1 балл)
Время: 2-4 мин
Python ipaddress
ipaddress.ip_network
Все задачи №{ topic_num } в каталоге
Задание №13. Компьютерные сети, IP-адреса и маски подсетей
Тема: Модуль ipaddress, побитовая маска подсети, адрес сети и количество хостов
Определение адреса сети, количества доступных IP-адресов в подсети или значения третьего/четвертого байта маски с помощью встроенного модуля ipaddress.
1. Модуль ipaddress в Python:
ipaddress.ip_network('IP/Маска', strict=False)— создание объекта сети (параметрstrict=FalseОБЯЗАТЕЛЕН, если передаётся адрес узла!).net.network_address— адрес сети.net.num_addresses— общее количество адресов в подсети.- Допустимые байты маски подсети: 0, 128, 192, 224, 240, 248, 252, 254, 255 (в двоичной записи единицы идут строго подряд слева направо без нулей между ними!).
Разновидности и прототипы задания на экзамене
Тип 1: Определение адреса сети по IP и маске
Побитовое умножение IP-адреса на маску.
Тип 2: Подбор неизвестного байта маски
Перебор допустимых значений маски (0, 128, 192, 224, 240, 248, 252, 254, 255).
Тип 3: Подсчет IP-адресов с условием на количество единиц/нулей
Перебор всех хостов в сети через `net.hosts()` или `net`.
Боевой шаблон решения на Python
Запустить код в онлайн-песочнице# === Боевой шаблон Задания №13 на Python ===
from ipaddress import ip_network
# Пример 1: Поиск адреса сети
net = ip_network('192.168.32.145/255.255.240.0', strict=False)
print("Адрес сети:", net.network_address)
# Пример 2: Подбор маски
# Даны IP-адрес узла и адрес сети, найти допустимый 3-й байт маски:
valid_mask_bytes = [0, 128, 192, 224, 240, 248, 252, 254, 255]
for b3 in valid_mask_bytes:
mask = f"255.255.{b3}.0"
net = ip_network(f"192.168.120.45/{mask}", strict=False)
if str(net.network_address) == "192.168.112.0":
print("Подходящий 3-й байт маски:", b3)
# Пример 3: Подсчет адресов с условием на двоичные единицы:
net = ip_network('112.160.0.0/255.240.0.0', strict=False)
count = 0
for ip in net:
# Переводим IP в двоичную строку:
ip_bin = "".join(f"{int(octet):08b}" for octet in str(ip).split('.'))
if ip_bin.count('1') > ip_bin.count('0'):
count += 1
print("Количество подходящих IP:", count)
Анти-примеры (Типичные ошибки vs Как делать правильно)
Как делать НЕ надо:
Ошибка: Забыть strict=False при создании сети
ip_network('192.168.1.5/24') упадет с ValueError: has host bits set!
Как делать ПРАВИЛЬНО:
Правильно: ВСЕГДА указывать strict=False: ip_network('192.168.1.5/24', strict=False)
ГРОБ
ГРОБ №13: Сеть содержит 2^16 адресов, цикл `for ip in net` работает медленно
Сеть с маской /12 содержит 1 048 576 адресов — перебор каждого адреса займет 30 секунд.
Как обойти ловушку: Анализируйте изменяемую часть адреса отдельно: перебирайте только изменяемые байты хоста.
Лайфхаки и подводные камни на экзамене:
- При переводе октета IP в двоичный вид используйте `f'{int(octet):08b}'`, чтобы сохранить ведущие нули (ровно 8 бит на байт!).