№ 10581 (Уровень: Средний)
**(Л. Шастин)** В терминологии сетей TCP/IP маска сети – это двоичное число, меньшее 232; в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места нули.
Маска определяет, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу самого узла в этой сети.
Обычно маска записывается по тем же правилам, что и IP-адрес – в виде четырёх байт, причём каждый байт записывается в виде десятичного числа.
Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Для узла c IP-адресом 175.122.80.13 адрес подсети равен 175.122.80.0.
Сколько существует различных возможных значений маски, если известно, что в этой сети не менее 28 узлов?
Ответ запишите в виде десятичного числа.
Комментарии к коду решения:
from ipaddress import *
- импортирует все объекты из модуляipaddress
. Модульipaddress
предоставляет возможности для работы с IPv4/IPv6 адресами и сетями.for mask in range(32+1):
- циклfor
проходит по диапазону чисел от 0 до 32 включительно. Каждое число в этом диапазоне сохраняется в переменнойmask
.net = ip_network(f'175.122.80.13/{mask}', 0)
- функцияip_network
принимает строковое представление IP-адреса и маски подсети и возвращает объект IPv4Network или IPv6Network, который представляет сеть, определенную этим адресом и маской. В данном случае передается адрес 175.122.80.13 и маска подсети, которая определяется в ходе цикла. Второй параметр функцииip_network
обозначает строгую ли будет проверка на валидность сети, в данном случае проверка отключена (0).print(net)
- вывод на экран результата работы функцииip_network
, то есть IP-адреса и маски подсети.Таким образом, код осуществляет вывод на экран всех возможных сетей, которые могут быть получены с помощью IP-адреса 175.122.80.13 и масок подсети в диапазоне от 0 до 32 включительно.
# Количество единиц в маске подсети указывает, сколько битов адреса IP отведено для сети,
# а оставшиеся биты - для узлов.
# Для вычисления количества возможных значений маски подсети можно использовать следующую формулу: 2**n - 2
from ipaddress import *
for mask in range(32+1):
net = ip_network(f'175.122.80.13/{mask}', 0) # IP-адрес узла & mask = адрес сети (подсети)
print(net)
# Формула поиска узлов для подсети: 2**n - 2, где n - кол-во битов для узлов
# 175.122.80.0/20 32 - 20 = 12 (битов для узлов) 2**12 - 2 = 4094 - подходит
# 175.122.80.0/21
# 175.122.80.0/22
# 175.122.80.0/23
# 175.122.80.0/24
# 175.122.80.0/25
# 175.122.80.0/26
# 175.122.80.0/27 32 - 27 = 5 (битов для узлов) 2**5 - 2 = 30 - подходит
# 175.122.80.0/28 32 - 28 = 4 (битов для узлов) 2** 4 - 2 = 14 - не подходит, так как узлов менее 28
# Ответ: 8
**Присоединяйтесь и готовьтесь с нами: t.me/informatika_kege_itpy**