Модуль ipaddress

Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

IP-адресация

Интернет является сетью сетей, система IP-адресации учитывает эту структуру. Каждый компьютер в сети получает свой уникальный IP-адрес, который представляет собой 32-битный идентификатор. В большинстве случаев используется более удобная запись IP-адреса в виде четырёх разделённых точками десятичных чисел – от 0 до 255, например: 231.142.19.30.

IP-адрес состоит из двух частей, одна из которых определяет адрес сети, а вторая – адрес самого узла в этой сети. Деление адреса на части определяется маской – 32-битным числом, в двоичной записи которого сначала стоят единицы, а потом — нули, например: 255.255.224.0

Например,  

IP-адрес 1 1 1 0 0 1 1 1 . 1 0 0 0 1 1 1 0 . 0 0 0 1 0 0 1 1 . 0 0 0 1 1 1 1 0
Маска  1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 0 0 0 0 0 . 0 0 0 0 0 0 0 0

Первая часть IP-адреса, соответствующая единичным битам маски, относится к адресу сети. Вторая часть IP-адреса, соответствующая нулевым битам маски, определяет числовой адрес узла в сети. Для определения адреса сети выполняется операция поразрядной конъюнкции между IP-адресом и маской подсети.

Маску также можно представить через суммарное число единиц в маске. В нашем примере, маска 255. 255. 224.0 содержит 19 единиц (число 255 — это 8 единиц, число 224 — это три единицы). В этом случае пишут: 231.142.19.30/19.

Адрес сети — это IP-адрес, у которого в части, отведенной для адреса узла (определяемой маской подсети), все биты равны 0. Адрес сети идентифицирует саму сеть, а не какое-либо конкретное устройство в ней.

IP-адрес 1 1 1 0 0 1 1 1 . 1 0 0 0 1 1 1 0 . 0 0 0 1 0 0 1 1 . 0 0 0 1 1 1 1 0
Маска  1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 0 0 0 0 0 . 0 0 0 0 0 0 0 0
Адрес сети 1 1 1 0 0 1 1 1 . 0 0 0 0 1 1 1 0 . 0 0 0 0 0 0 0 0 . 0 0 0 0 0 0 0 0

Широковещательный адрес — это специальный IP-адрес, который используется для отправки данных всем устройствам в конкретной сети. У широковещательного адреса в части, отведенной для адреса узла, все биты равны 1. Для определения широковещательного адреса выполняется поразрядная дизъюнкция между адресом сети и инвертированной маской подсети.

Модуль ipaddress

Модуль ipaddress, доступный в стандартной библиотеке Python с версии 3.3, предназначен для удобной работы с IPv4 и IPv6 адресами и сетями. Он предоставляет функционал для их создания, модификации и выполнения операций.

Подключение модуля: from ipaddress import *

Основные функции модуля

ipaddress.ip_address (address) создает объект IP-адреса (IPv4 или IPv6) из строки или числа. Числовые адреса до 232 по умолчанию считаются IPv4, более крупные – IPv6.

ipaddress.ip_network (address, strict=True) создает объект сети (IPv4/IPv6) из строки или числа address. По умолчанию (strict=True), проверяется, что address является адресом сети (биты хоста равны нулю), иначе — ошибка. При strict=False адрес сети вычисляется автоматически.

ipaddress.broadcast_address — возвращает широковещательный адрес для сети. Пакеты, отправленные по этому адресу, должны быть получены каждым хостом в сети.

Метод hosts()  возвращает итератор всех используемых адресов в сети (без адреса сети и широковещательного адреса).

Атрибут num_addresses возвращает количество адресов в сети.  Включает все адреса в сети, как сетевой адрес, так и широковещательный адрес. Например: для сети  192.168.1.0/24,  будет ответ 256.

 

Задание 13. Организация компьютерных сетей. Адресация (демо-версия 2026)

В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и его маске. Широковещательным адресом называется специализированный адрес, в котором на месте нулей в маске стоят единицы. Адрес сети и широковещательный адрес не могут быть использованы для адресации сетевых устройств.

Сеть задана IP-адресом одного из входящих в неё узлов 191.128.66.83 и сетевой маской 255.192.0.0.

Найдите в данной сети наибольший IP-адрес, который может быть назначен компьютеру. В ответе укажите найденный IP-адрес без разделителей.

Например, если бы найденный адрес был равен 111.22.3.44, то в ответе следовало бы записать: 11122344.

Решение и ответ

from ipaddress import *
net = ip_network('191.128.66.83/255.192.0.0', False) #Находим адрес сети

 print(net[-2]) #выводим предпоследний арес в сети

Ответ:  191191255254

Задание 13. Организация компьютерных сетей. Адресация (демо-версия 2025)

В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.

Сеть задана IP-адресом 172.16.168.0 и маской сети 255.255.248.0. Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса не кратно 5?

В ответе укажите только число.

 
Решение и ответ

from ipaddress import *
net = ip_network('172.16.168.0/255.255.248.0') #находим сеть по адресу хоста и маске

k = 0

for ip in net: #перебираем адреса в сети
    ip2 = bin(int(ip))[2:] #переводим адрес в двоичный код
    if ip2.count('1') % 5 != 0: # проверяем на кратность 5 количество единиц в адресе
        k += 1

print(k)

Ответ:  1663

Задание 13. Организация компьютерных сетей. Адресация (демо-версия 2024)

В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.

Сеть задана IP-адресом 192.168.32.160 и маской сети 255.255.255.240.Сколько в этой сети IP-адресов, для которых сумма единиц в двоичной записи IP-адреса чётна?

В ответе укажите только число.

Решение и ответ

from ipaddress import *
net = ip_network('192.168.32.160/255.255.255.240') #находим сеть по адресу хоста и маске

k = 0

for ip in net: #перебираем адреса в сети
    ip2 = bin(int(ip))[2:] #переводим адрес в двоичный код
    if ip2.count('1') % 2 == 0: # проверяем на четность количество единиц в адресе
        k += 1

print(k)

Ответ:  8

Задание 13. Количество IP адресов по условию

В терминологии сетей ТСР/IР маской сети называют двоичное число, которое показывает, какая часть IР-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.

Сеть задана IР-адресом 142.108.56.118 и маской сети 255.255.255.240. Сколько в этой сети IР-адресов, для которых в двоичной записи IР-адреса суммарное количество единиц в левых двух байтах меньше суммарного количества единиц в правых двух байтах?

В ответе укажите только число. 

Решение и ответ
from ipaddress import *

net = ip_network('142.108.56.118/255.255.255.240', False) #находим сеть по адресу хоста и маске

k = 0
for ip in net:
    ip2 = bin(int(ip))[2:] #переводим адрес в двоичный код
    if ip2[:16].count('1') < ip2[17:].count('1'): # проверяем чтобы в левых двух байтах было меньше единиц, чем в двух правых.
        k += 1
        print (ip2)

print(k)

Ответ:  5

Задание 13. Количество IP адресов по условию

В терминологии сетей ТСР/IР маской сети называют двоичное число, которое показывает, какая часть IР-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.

Сеть задана IР-адресом 172.16.160.0 и маской сети 255.255.240.0 Сколько в этой сети IР-адресов, для которых количество единиц в их двоичной записи кратно двум?

В ответе укажите только число. 

Решение и ответ
from ipaddress import *

net = ip_network('172.16.160.0/255.255.240.0', False) #находим сеть по адресу хоста и маске

k = 0
for ip in net:
    ip2 = bin(int(ip))[2:] #переводим адрес в двоичный код
    if ip2.count('1') % 2 == 0: # проверяем чтобы в левых двух байтах было меньше единиц, чем в двух правых.
        k += 1     

print(k)

Ответ:  2048

Задание 13. Поиск маски по адресу узла и сети

В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу самого узла в этой сети. Обычно маска записывается по тем же правилам, что и IP-адрес,  – в виде четырёх байт, причём каждый байт записывается в виде десятичного числа. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места нули. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.

Например, если IP-адрес узла равен 125.44.101.252, а маска равна 255.255.255.192, то адрес сети равен 125.44.101.192.

Для узла с IP-адресом 244.55.229.28 адрес сети равен 244.0.0.0.Каково наибольшее возможное количество нулей в разрядах маски?

Решение и ответ
from ipaddress import * 

for mask in range(1, 32): # Перебираем все возможные значения маски подсети

    net = ip_network('244.55.229.28/' + str(mask), 0)# Создаем объект сети для IP-адреса 244.55.229.28 с текущей маской

 

    if '244.0.0.0' in str(net): # Проверка: есть ли строка '244.0.0.0' в строковом представлении сети

        print(net, net.netmask)# Если условие выполняется, выводим объект сети и маску сети

Ответ:  26

Задание 13. Поиск параметра А в адресе узла

В терминологии сетей ТСР/IР маской сети называют двоичное число, которое показывает, какая часть IР-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.

Сеть задана IР-адресом 64.129.А.10, где А – некоторое допустимое для записи IР-адреса число, и маской сети 255.255.252.0. Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IР-адреса суммарное количество единиц в левых двух байтах не более суммарного количества единиц в правых двух байтах?

В ответе укажите только число. 

Решение и ответ
from ipaddress import *

for A in range(256): #перебираем возможные значения параметра А
    ok = True # флаг
    net = ip_network('64.129.'+str(A)+'.10/255.255.252.0', False) #находим сеть по адресу хоста и маске

    for ip in net:
        ip2 = bin(int(ip))[2:] #переводим адрес в двоичный код
        if ip2[:16].count('1') > ip2[17:].count('1'): # проверяем, если в левых двух байтах количество единиц в адресе было более чем в двух правых, то флаг меняем на ложь
            ok = False

    if ok: #если для всех адресов этой сети условие выполняется, то выводим А и выходим из цикла
        print(A)
        break

Ответ:  28

Задание 13. Несовпадающие адреса в двух сетях

В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.

В первом здании сеть задана IP-адресом 192.168.56.192 и маской сети 255.255.255.192. А во втором здании сеть задана IP-адресом 192.168.56.208 и маской сети 255.255.255.240.

Сколько ip-адресов не совпадут в этих сетях?

Решение и ответ
from ipaddress import *

net1 = ip_network('192.168.56.192/255.255.255.192', False) #находим адрес первой сети
net2 = ip_network('192.168.56.208/255.255.255.240', False)  #находим адрес второй сети

print (net1.num_addresses - net2.num_addresses)  #находим несовпадающие адреса, так как вторая сеть находится внутри первой

Ответ:  48

Добавить комментарий

recaptcha_invisible

© 2017 Компьютерный клуб "КОД". Все права защищены