Задание 13. (А. Кабанов, 2024)
Задание 13. (А. Кабанов, 2024)
Команда | Описание |
---|---|
from ipaddress import * | подключение модуля для работы с IP-адресами |
ip = ip_address('192.168.0.4') | функция позволяет получить объект класса IPv4Address |
1) f'{ip:b}' 2) bin(int(ip))[2:] | получение двоичного значения IP-адреса |
1) net = ip_network('198.165.128.0/255.255.254.0') 2) net = ip_network('198.165.128.0/23') | функция позволяет получить все IP-адреса, относящиеся к данной сети. В первой позиции записывается IP-сети, после слэша - маска в полном или сокращённом виде. Запись в сокращённом виде - число единиц в маске. |
net = ip_network('198.165.129.98/23', 0) | функция позволяет получить IP-сети по IP-узла и маске. В первой позиции - IP-узла, после слэша - маска в полном или скращённом виде. Второй параметр 0 или strict=False или True - обязателен при получении IP-сети. Значение в виде '98.165.128.0/23' |
net.network_address | метод позволяет выделить IP-адрес без маски. Значение в виде '98.165.128.0' |
net.netmask | метод позволяет получить маску сети в виде '255.255.254.0' |
net.num_addresses | метод позволяет вычислить количество IP-адресов в сети (для заданных IP-сети и маски) с учетом адреса сети и широковещательного адреса |
net.hosts() | метод позволяет получить адреса IP-узлов (хостов) в данной сети (без адреса сети и широковещательного адреса) |
len(list(net.hosts())) | вычисление количества IP-узлов (хостов) в сети |
int(ip_address('198.165.129.98')) - int(ip_address('198.165.128.0')) | вычисляет номер устройства в сети. Формула: IPузла - IPсети. Значение в виде: 354 |
Для некоторой подсети используется маска 255.255.252.0. Сколько различных адресов компьютеров допускает эта маска?
Примечание. На практике два из возможных адресов не используются для адресации узлов сети: адрес сети, в котором все биты, отсекаемые маской, равны 0, и широковещательный адрес, в котором все эти биты равны 1.
1022
Вариант 1 (ручное решение М. Савоськин):
найдём количество адресов соответствующих маске 255.255.252.0: 256*(256 – 252) = 1024 поскольку из них 2 адреса не используются (адрес сети и широковещательный адрес) для узлов сети остается 1024 – 2 = 1022 адреса Ответ: 1022
Вариант 2 (ручное решение):
фактически тут нужно найти какое количество N бит в маске нулевое, и тогда количество вариантов, которые можно закодировать с помощью N бит равно 2N каждая часть IP-адреса (всего 4 части) занимает 8 бит поскольку младшая часть маски 255.255.252.0 нулевая, 8 бит уже свободны третья часть маски 252 = 255 – 3 = 111111002 содержит 2 нулевых бита общее число нулевых битов N = 10, число свободных адресов 2N = 1024 поскольку из них 2 адреса не используются (адрес сети и широковещательный адрес) для узлов сети остается 1024 – 2 = 1022 адреса Ответ: 1022
Вариант 3 (программное решение):
from ipaddress import * net = ip_network('0.0.0.0/255.255.252.0') print(len(list(net.hosts())))
Вариант 4 (программное решение):
from ipaddress import * net = ip_network('0.0.0.0/255.255.252.0', 0) print(len(list(net)) - 2)
Если маска подсети 255.255.240.0 и IP-адрес компьютера в сети 162.198.75.44, то чему равен номер компьютера в сети?
2860
Вариант 1 (программное решение)):
from ipaddress import * net_ip = ip_network('162.198.75.44/255.255.240.0', 0).network_address print(int(ip_address('162.198.75.44')) - int(net_ip)) Ответ: 2860
Вариант 2 (программное решение)):
from ipaddress import * net = ip_network('162.198.75.44/255.255.240.0', 0) ip = ip_address('162.198.75.44') print(int(ip) - int(net[0])) Ответ: 2860
Вариант 3 (ручное решение):
определим количество нулей в маске сети, для этого переведем в двоичную систему счисления третий байт маски: 240 = 111100002 т.к. четвертый байт маски состоит из восьми нулей, то за адрес компьютера в сети отвечают последние 12 битов выделим из адреса компьютера последние 12 битов, для этого переведем в двоичный вид третий и четвертый байты адреса: 75 = 010010112 44 = 001011002 возьмем последние 12 битов и переведем в 10-ю систему счисления: 1011 001011002 = 2860 Ответ: 2860
По заданным IP-адресу узла сети и маске определите адрес сети:
IP-адрес: 10.8.248.131, Маска: 255.255.224.0
10.8.224.0
Вариант 1 (программное решение)):
from ipaddress import * print(ip_network('10.8.248.131/255.255.224.0', 0).network_address) Ответ: 10.8.224.0
Вариант 2 (программное решение)):
from ipaddress import * print(ip_network('10.8.248.131/255.255.224.0', 0)[0]) Ответ: 10.8.224.0
Вариант 3 (ручное решение):
IP-сети = IP-узла & Маска где & - поразрядная конъюнкция т.к. в маске первые два байта состоят из 8 единиц каждый, то в адресе сети первые два байта будут равны: 10 & 255 = 10 - первый байт 8 & 255 = 8 - второй байт четвертый байт маски состоит из 8 нулей, поэтому получим четвертый байт адреса сети: 131 & 0 = 0 для нахождение третьего байта адреса сети переведем третьи байты адреса узла и маски в двоичный вид и выполним поразрядную конъюнкцию: & 11111000 11100000 -------- 11100000 переведем третий байт адреса сети в десятичную систему счисления, получим: 111000002 = 224 Ответ: 10.8.224.0
Для узла с IP-адресом 124.128.112.142 адрес сети равен 124.128.64.0. Чему равен третий слева байт маски? Ответ запишите в виде десятичного числа.
192
Вариант 1 (программное решение)):
from ipaddress import * ip_net = ip_address('124.128.64.0') for mask in range(30, 1, -1): net = ip_network(f'124.128.112.142/{mask}', 0) net_ip = net.network_address if net_ip == ip_net: print(net.netmask) break Ответ: 192
Вариант 2 (программное решение)):
from ipaddress import * for mask in range(30, 1, -1): net = ip_network(f'124.128.112.142/{mask}', 0) if str(net[0]) == '124.128.64.0': print(net.netmask) break Ответ: 192
Вариант 3 (ручное решение):
IP-сети = IP-узла & Маска где & - поразрядная конъюнкция для нахождения третьего байта маски переведем в двоичную систему третьи байты IP-узла и IP-сети и, выполняя поразрядную конъюнкцию, подберем значения третьего байта маски: & 01110000 - 3-й байт IP-узла _1______ - 3-й байт маски -------- 01000000 - 3-й байт IP-сети из анализа данной операции делаем вывод, что единица в байте маски обязательно должна стоять во втором слева разряде, а значит и до неё тоже обязаны стоять единицы (по терминологии сетей), таким образом получаем: 11000000 переведем третий байт маски в десятичную систему счисления, получим: 110000002 = 192 Ответ: 192
Два узла, находящиеся в одной сети, имеют IP-адреса 118.222.130.140 и 118.222.201.140. Укажите наибольшее возможное значение третьего слева байта маски сети. Ответ запишите в виде десятичного числа.
128
Вариант 1 (программное решение)):
from ipaddress import * for mask in range(30, 0, -1): net1 = ip_network(f'118.222.130.140/{mask}', 0) net2 = ip_network(f'118.222.201.140/{mask}', 0) ip1 = ip_address('118.222.130.140') ip2 = ip_address('118.222.201.140') if net1[0] == net2[0]: if net1[0] < ip1 < net1[-1]: if net2[0] < ip2 < net2[-1]: print(net1.netmask) break Ответ: 128
Вариант 2 (программное решение)):
from ipaddress import * for mask in range(30, 0, -1): net1 = ip_network(f'118.222.130.140/{mask}', 0) net1_ip = net1.network_address net2_ip = ip_network(f'118.222.201.140/{mask}', 0).network_address if net1_ip == net2_ip: print(str(net1.netmask).split('.')[-2]) break Ответ: 128
Вариант 3 (ручное решение):
IP-сети = IP-узла & Маска где & - поразрядная конъюнкция для нахождения третьего байта маски переведем в двоичную систему третьи байты первого и второго IP-узлов и, выполняя поразрядную конъюнкцию, подберем значения третьего байта маски. Задача - добавить максимальное количество единиц в третий байт маски, но при этом получаемые IP-сети должны совпадать. Поставим единицу в старшем разряде маски: & 10000010 - 3-й байт 1-го IP-узла & 11001001 - 3-й байт 2-го IP-узла 10000000 - 3-й байт маски 10000000 - 3-й байт маски -------- -------- 10000000 - 3-й байт IP-сети 10000000 - 3-й байт IP-сети 3-и байты сети получаются одинаковыми. Поставим ещё одну единицу во втором старшем разряде маски: & 10000010 - 3-й байт 1-го IP-узла & 11001001 - 3-й байт 2-го IP-узла 11000000 - 3-й байт маски 11000000 - 3-й байт маски -------- -------- 10000000 - 3-й байт IP-сети 11000000 - 3-й байт IP-сети 3-и байты сети получаются разными, значит такая маска не подходит. переведем третий байт подходящей маски в десятичную систему счисления, получим: 100000002 = 128 Ответ: 128
Для узла с IP-адресом 71.192.0.12 адрес сети равен 71.192.0.0. Для скольких различных значений маски это возможно?
19
Вариант 1 (программное решение)):
from ipaddress import * cnt = 0 for mask in range(30, 0, -1): if str(ip_network(f'71.192.0.12/{mask}', 0)[0]) == '71.192.0.0': cnt += 1 print(cnt) Ответ: 19
Вариант 2 (программное решение)):
from ipaddress import * cnt = 0 ip_net = ip_address('71.192.0.0') for mask in range(31): net = ip_network(f'71.192.0.12/{mask}', 0).network_address if net == ip_net: cnt += 1 print(cnt) Ответ: 19
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Сеть задана IP-адресом 192.168.32.160 и маской сети 255.255.255.240. Сколько в этой сети IP-адресов, для которых сумма единиц в двоичной записи IP-адреса чётна?
В ответе укажите только число
8
Вариант 1 (ручное решение):
IP-адрес 192.168.32.160 представим в двоичном виде: 11000000.10101000.00100000.10100000 количество единиц в IP-адресе сети - 8 Количество двоичных разрядов, позволяющих сформировать адрес узла в сети, соответсвуют количеству нолей в маске сети. Т.к. числу 255 в двоичном виде соответствуют 8 единиц, то ноли появляются только в младшем разряде маски. Представим число 240 в двоичном виде: 11110000, т.е. за формирование адресов узов отвечают только четыре младших разряда. Учитывая, что общее количество единиц в IP-адресах узлов должно быть чётным, а 8 единиц уже присутствуют в неизменяемой части адреса, соответствующей адресу сети, то подходят следующие количества единиц в изменяемой части: 0, 2 и 4. Выпишем все подходящие варианты: 0000 0011 0101 0110 1001 1010 1100 1111 Итого: 8
Вариант 2 - лучший (А. Кабанов):
from ipaddress import * #получаем список всех адресов сети в соответствии с маской #чтобы вывести все адреса, можно использовать list(net) #если просто вывести print(net), получим: 192.168.32.160/28 #где 192.168.32.160 - IP-адрес сети, а 28 - префикс маски, #т.е. короткая запись, указывающая количество единичных разрядов #в маске (количество единиц) net = ip_network('192.168.32.160/255.255.255.240') k = 0 #перебираем все возможные адреса узлов, переводя их в двоичный #код, при этом получаем 32-разрядное двоичное число, и вычисляем #кодичество единиц в каждом IP-адресе узла for ip in net: if f'{ip:b}'.count('1') % 2 == 0: k += 1 print(k)
Вариант 3:
from ipaddress import * net = ip_network('192.168.32.160/255.255.255.240', 0) print(sum(f'{ip:b}'.count('1') % 2 == 0 for ip in net))
В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места – нули. Обычно маска записывается по тем же правилам, что и IP-адрес, – в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске. Например, если IP-адрес узла равен 131.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 131.32.240.0.
Для узла с IP адресом 202.134.37.172 адрес сети равен 202.134.0.0. Найдите наибольшее возможное количество нулей в двоичной записи маски подсети.
17
Вариант 1 (ручное решение):
Запишем IP адрес и адрес сети в двоичном виде. Подберём значения в маске так, чтобы выполнялась поразрядная конъюнкция. IP 11001010.10000110.00100101.10101100 Mask 11111111.1111111*.**000000.00000000 Net 11001010.10000110.00000000.00000000 Наибольшее количество нулей в маске - 17
Вариант 2:
from ipaddress import * mx = 0 for mask in range(30, 0, -1): net = ip_network(f'202.134.37.172/{mask}', 0) if str(net[0]) == '202.134.0.0': mx = max(mx, 32-mask) print(mx)
Вариант 3:
from ipaddress import * for mask in range(33): try: net = ip_network(f'202.134.0.0/{mask}') if ip_address('202.134.37.172') in net: print(32 - mask) except: ...
В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места – нули. Обычно маска записывается по тем же правилам, что и IP-адрес, – в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске. Например, если IP-адрес узла равен 131.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 131.32.240.0.
Для узла с IP адресом 67.37.129.140 адрес сети равен 67.37.128.0. Найдите наименьшее возможное количество единиц в двоичной записи маски подсети.
17
Вариант 1 (ручное решение):
Запишем IP адрес и адрес сети в двоичном виде. Подберём значения в маске так, чтобы выполнялась поразрядная конъюнкция. IP 01000011.00100101.10000001.10001100 Mask 11111111.11111111.1******0.00000000 Net 01000011.00100101.10000000.00000000 Наименьшее количество единиц в маске - 17
Вариант 2:
from ipaddress import * mn = 10**20 for mask in range(30, 0, -1): net = ip_network(f'67.37.129.140/{mask}', 0) if str(net[0]) == '67.37.128.0': mn = min(mn, mask) print(mn)
Вариант 3:
from ipaddress import * for mask in range(33): try: net = ip_network(f'67.37.128.0/{mask}') if ip_address('67.37.129.140') in net: print(mask) break except: ...
В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места – нули. Обычно маска записывается по тем же правилам, что и IP-адрес, – в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске. Например, если IP-адрес узла равен 131.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 131.32.240.0.
По заданным IP-адресу узла и маске определите адрес сети: IP-адрес: 202.135.46.121 Маска: 255.255.252.0
202.135.44.0
Вариант 1 (ручное решение):
Запишем IP адрес и маску сети в двоичном виде. Найдём адрес сети используя поразрядную конъюнкцию. IP 11001010.10000111.00101110.01111001 Mask 11111111.11111111.11111100.00000000 Net 11001010.10000111.00101100.00000000 Переведём полученный значения в десятичный вид и запишем ответ: 202.135.44.0
Вариант 2:
from ipaddress import * print(ip_network('202.135.46.12/255.255.252.0', 0)[0])
Вариант 3:
from ipaddress import * print(ip_network('202.135.46.12/255.255.252.0', 0).network_address)
Вариант 4:
ip = [202, 135, 46, 121] mask = [255, 255, 252, 0] ip_net = [] for i in range(4): ip_net.append(str(ip[i] & mask[i])) print('.'.join(ip_net))
В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места – нули. Обычно маска записывается по тем же правилам, что и IP-адрес, – в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске. Например, если IP-адрес узла равен 131.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 131.32.240.0.
Для узла с IP адресом 172.22.107.169 адрес сети равен 172.22.106.0. Чему равно значение третьего слева байта маски? Ответ запишите в виде десятичного числа.
254
Вариант 1 (ручное решение):
Запишем третий байт IP адреса и адреса сети в двоичном виде. Подберём значения в маске так, чтобы выполнялась поразрядная конъюнкция. IP 01101011 Mask 11111110 Net 01101010 Переведём полученное значение в десятичный вид и запишем ответ: 254
Вариант 2:
from ipaddress import * for mask in range(30, 0, -1): net = ip_network(f'172.22.107.169/{mask}', 0) if str(net[0]) == '172.22.106.0': print(net.netmask) break
Вариант 3:
from ipaddress import * for mask in range(33): net = ip_network(f'172.22.107.169/{mask}', 0) if net.network_address == ip_address('172.22.106.0'): print(net.netmask)
Вариант 4:
from ipaddress import * for mask in range(33): try: net = ip_network(f'172.22.106.0/{mask}') if ip_address('172.22.107.169') in net: print(net.netmask) except: ...
Вариант 5:
for i in range(9): byte = int('1' * i + '0' * (8 - i), 2) if 107 & byte == 106: print(byte)
В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места – нули. Обычно маска записывается по тем же правилам, что и IP-адрес, – в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске. Например, если IP-адрес узла равен 131.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 131.32.240.0.
Для узла с IP адресом 197.93.106.215 адрес сети равен 197.93.104.0. Для скольких различных значений маски это возможно?
2
Вариант 1 (ручное решение):
Запишем IP адрес и адрес сети в двоичном виде. Подберём значения в маске так, чтобы выполнялась поразрядная конъюнкция. IP 11000101.01011101.01101010.11010111 Mask 11111111.11111111.11111*00.00000000 Net 11000101.01011101.01101000.00000000 В маске может быть от 21 до 22 единиц.
Вариант 2:
from ipaddress import * cnt = 0 for mask in range(30, 0, -1): net = ip_network(f'197.93.106.215/{mask}', 0) if str(net[0]) == '197.93.104.0': cnt += 1 print(cnt)
Вариант 3:
from ipaddress import * for mask in range(33): try: net = ip_network(f'197.93.104.0/{mask}') if ip_address('197.93.106.215') in net: print(net.netmask) except: pass
В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места – нули. Обычно маска записывается по тем же правилам, что и IP-адрес, – в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске. Например, если IP-адрес узла равен 131.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 131.32.240.0.
Для узла с IP адресом 124.36.75.79 адрес сети равен 124.36.72.0. Чему равно наибольшее возможное значение третьего слева байта маски? Ответ запишите в виде десятичного числа.
252
Вариант 1 (ручное решение):
Запишем третий байт IP адреса и адреса сети в двоичном виде. Подберём значения в маске так, чтобы выполнялась поразрядная конъюнкция. IP 01001011 Mask 11111*00 Net 01001000 Максимальный третий байт маски тогда примет вид 11111100. Переведём полученное значение в десятичный вид и запишем ответ.
Вариант 2:
from ipaddress import * for mask in range(30, 0, -1): net = ip_network(f'124.36.75.79/{mask}', 0) if str(net[0]) == '124.36.72.0': print(net.netmask) break
Вариант 3:
from ipaddress import * for mask in range(32): net = ip_network(f'124.36.75.79/{mask}', 0) if net.network_address == ip_address('124.36.72.0'): print(net.netmask)
Вариант 4:
for i in range(9): byte = int('1' * i + '0' * (8 - i), 2) if 75 & byte == 72: print(byte)
В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места – нули. Обычно маска записывается по тем же правилам, что и IP-адрес, – в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске. Например, если IP-адрес узла равен 131.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 131.32.240.0.
Для узла с IP адресом 208.102.210.222 адрес сети равен 208.102.208.0. Найдите наименьшее возможное количество единиц в двоичной записи маски подсети.
20
Вариант 1 (ручное решение):
Запишем IP адрес и адрес сети в двоичном виде. Подберём значения в маске так, чтобы выполнялась поразрядная конъюнкция. IP 11010000.01100110.11010010.11011110 Mask 11111111.11111111.1111**00.00000000 Net 11010000.01100110.11010000.00000000 Наименьшее количество единиц в маске - 20
Вариант 2:
from ipaddress import * for mask in range(30, 0, -1): net = ip_network(f'208.102.210.222/{mask}', 0) if str(net[0]) == '208.102.208.0': print(mask)
Вариант 3:
from ipaddress import * for mask in range(33): try: net = ip_network(f'208.102.208.0/{mask}') if ip_address('208.102.210.222') in net: print(mask); break except: ...
Вариант 4:
from ipaddress import * for mask in range(33): net = ip_network(f'208.102.210.222/{mask}', 0) if net.network_address == ip_address('208.102.208.0'): print(f'{net.netmask:b}'.count('1'))
Два узла, находящиеся в разных подсетях, имеют IP-адреса 118.187.59.255 и 118.187.65.115. В масках обеих подсетей одинаковое количество единиц. Укажите наибольшее возможное количество единиц в масках этих подсетей. Учтите, что два адреса в любой подсети зарезервированы: адрес всей подсети и широковещательный адрес.
21
Вариант 1 (ручное решение):
Вариант 2:
from ipaddress import * for mask in range(30, 0, -1): ip1 = ip_address('118.187.59.255') ip2 = ip_address('118.187.65.115') net1 = ip_network(f'118.187.59.255/{mask}', 0) net2 = ip_network(f'118.187.65.115/{mask}', 0) if net1[0] != net2[0]: if net1[0] < ip1 < net1[-1]: if net2[0] < ip2 < net2[-1]: print(mask) break
Вариант 3:
from ipaddress import * for mask in range(33): ip1 = ip_address('118.187.59.255') ip2 = ip_address('118.187.65.115') net1 = ip_network(f'{ip1}/{mask}', 0).network_address net2 = ip_network(f'{ip2}/{mask}', 0).network_address if net1 != net2: if len(set(f'{int(ip1) - int(net1):0{32-mask}b}')) != 1: if len(set(f'{int(ip2) - int(net2):0{32-mask}b}')) != 1: print(mask)
Вариант 4:
def fn(s): mask = [] for i in range(0, len(s), 8): mask.append(int(s[i:i + 8], 2)) return mask def g(ip, k): ips = '' for i in range(4): ips += f'{ip[i]:08b}' return ips[-k:] != '0' * k and ips[-k:] != '1' * k ip1 = [118, 187, 59, 255] ip2 = [118, 187, 65, 115] for i in range(30, 0, -1): try: mask = fn('1' * i + '0' * (32 - i)) ip_net1 = []; ip_net2 = [] for j in range(4): ip_net1.append(ip1[j] & mask[j]) ip_net2.append(ip2[j] & mask[j]) if ip_net1 != ip_net2 and g(ip1, 32 - i) and g(ip2, 32 - i): print(i); break except: ...
Два узла, находящиеся в разных подсетях, имеют IP-адреса 191.131.175.201 и 191.131.160.170. В масках обеих подсетей одинаковое количество единиц. Укажите наименьшее возможное значение третьего слева байта этой маски. Ответ запишите в виде десятичного числа.
248
Вариант 1 (ручное решение):
Видео от А. Кабанова
Вариант 2:
from ipaddress import * for mask in range(30, 0, -1): ip1 = ip_address('191.131.175.201') ip2 = ip_address('191.131.160.170') net1 = ip_network(f'191.131.175.201/{mask}', 0) net2 = ip_network(f'191.131.160.170/{mask}', 0) if net1[0] != net2[0]: if net1[0] < ip1 < net1[-1]: if net2[0] < ip2 < net2[-1]: print(net1.netmask)
В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места — нули. Обычно маска записывается по тем же правилам, что и IP-адрес, — в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске. Например, если IP-адрес узла равен 131.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 131.32.240.0.
Для узла с IP адресом 198.165.129.98 адрес сети равен 198.165.128.0. Найдите наибольшее возможное количество единиц в двоичной записи маски подсети.
23
Вариант 1 (ручное решение):
Видео от А. КабановаВариант 2:
from ipaddress import * for mask in range(30, 0, -1): if str(ip_network(f'198.165.129.98/{mask}',0)[0]) == '198.165.128.0': print(mask); break
Вариант 3:
from ipaddress import * for mask in range(33): try: if ip_address('198.165.129.98') in ip_network(f'198.165.128.0/{mask}'): mx = mask except: pass print(mx)
Для узла с IP-aдpeсом 125.28.160.73 адрес подсети равен 125.28.160.0. Сколько существует различных возможных значений третьего слева байта маски, если известно, что в этой сети не менее 500 узлов? Ответ запишите в виде десятичного числа.
5
Вариант 1 (ручное решение):
Видео от А. КабановаВариант 2:
from ipaddress import * cnt = 0 for mask in range(30, 0, -1): net = ip_network(f'125.28.160.73/{mask}', 0) if str(net[0]) == '125.28.160.0' and len(list(net)) - 2 >= 500: cnt += 1 print(cnt)
Вариант 3:
from ipaddress import * k = 0 for b in range(256): try: net = list(ip_network(f'125.28.160.0/255.255.{b}.0')) if len(net) >= 500 and ip_address('125.28.160.73') in net: k += 1 except: ... print(k)
Результат: 5
Вариант 4:
from ipaddress import * for mask in range(33): try: net = ip_network(f'125.28.160.0/{mask}') if net.num_addresses >= 500 and ip_address('125.28.160.73') in net: print(net.netmask) except: ...
Результат:
255.255.224.0 255.255.240.0 255.255.248.0 255.255.252.0 255.255.254.0
Вариант 5 (А. Кабанов):
from ipaddress import * ip = ip_address('125.28.160.73') for mask in range(33): try: net = ip_network(f'125.28.160.0/{mask}') if ip in net and len(list(net)) >= 500: print(net.netmask) except: ...
Результат:
255.255.224.0 255.255.240.0 255.255.248.0 255.255.252.0 255.255.254.0
Вариант 6 (Л. Шастин):
from ipaddress import * for mask in range(33): net = ip_network(f'125.28.160.73/{mask}', 0) adres = str(net.network_address) if adres == '125.28.160.0' and len(list(net.hosts())) >= 500: print(net.netmask)
Результат:
255.255.224.0 255.255.240.0 255.255.248.0 255.255.252.0 255.255.254.0
(К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 192.168.248.176 и маской сети 255.255.255.240.
Сколько в этой сети IP-адресов, для которых количество единиц и нулей в двоичной записи IP-адреса одинаково?
В ответе укажите только число.
4
Вариант 1:
from ipaddress import * net = ip_network('192.168.248.176/255.255.255.240', 0) print(sum(f'{ip:b}'.count('1') == 16 for ip in net))
Вариант 2:
from ipaddress import * net = ip_network('192.168.248.176/255.255.255.240') k = 0 for ip in net: if f'{ip:b}'.count('1') == 16: k += 1 print(k)
(К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 192.168.248.176 и маской сети 255.255.255.240.
Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса больше, чем количество нулей?
В ответе укажите только число.
1
from ipaddress import * net = ip_network('192.168.248.176/255.255.255.240') k = 0 for ip in net: if f'{ip:b}'.count('1') > 16: k += 1 print(k)
(К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 158.132.161.128 и маской сети 255.255.255.128.
Сколько в этой сети IP-адресов, которые в двоичной записи IP-адреса оканчиваются единицей?
В ответе укажите только число.
64
Вариант 1:
from ipaddress import * net = ip_network('158.132.161.128/255.255.255.128', 0) print(sum(f'{ip:b}'[-1] == '1' for ip in net))
Вариант 2:
from ipaddress import * net = ip_network('158.132.161.128/255.255.255.128') k = 0 for ip in net: if int(ip) % 2 != 0: k += 1 print(k)
(К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 211.48.136.64 и маской сети 255.255.255.224.
Сколько в этой сети IP-адресов, которые в двоичной записи IP-адреса оканчиваются двумя единицами?
В ответе укажите только число.
8
Вариант 1:
from ipaddress import * net = ip_network('211.48.136.64/255.255.255.224', 0) print(sum(f'{ip:b}'[-2:] == '11' for ip in net))
Вариант 2:
from ipaddress import * net = ip_network('211.48.136.64/255.255.255.224') k = 0 for ip in net: if f'{ip:b}'[-2:] == '11': k += 1 print(k)
(К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Сеть задана IP-адресом 202.75.38.176 и маской сети 255.255.255.240. Сколько в этой сети IP-адресов, у которых в двоичной записи IP-адреса никакие три единицы или три нуля не стоят рядом?
В ответе укажите только число.
5
Вариант 1 (ручное решение):
Видео от А. КабановаВариант 2:
from ipaddress import * net = ip_network('202.75.38.176/255.255.255.240', 0) print(sum('000' not in f'{ip:b}' and '111' not in f'{ip:b}' for ip in net))
Вариант 3:
from ipaddress import * k = 0 net = ip_network('202.75.38.176/255.255.255.240', 0) for ip in net: ip2 = f'{ip:b}' if '111' not in ip2 and '000' not in ip2: k += 1 print(k)
Результат: 5
(К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 202.75.38.160 и маской сети 255.255.255.240.
Сколько в этой сети IP-адресов, у которых в двоичной записи IP-адреса имеется сочетание трех подряд идущих единиц?
В ответе укажите только число.
3
from ipaddress import * net = ip_network('202.75.38.160/255.255.255.240') k = 0 for ip in net: ip = f'{ip:b}' if '111' in ip: k += 1 print(k)
(К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 184.178.54.144 и маской сети 255.255.255.240.
Сколько в этой сети IP-адресов, у которых в двоичной записи IP-адреса имеется сочетание трех подряд идущих единиц?
В ответе укажите только число.
16
from ipaddress import * net = ip_network('184.178.54.144/255.255.255.240') k = 0 for ip in net: ip = f'{ip:b}' if '111' in ip: k += 1 print(k)
(К. Багдасарян) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 202.75.38.152 и маской сети 255.255.255.248.
Сколько в этой сети IP-адресов, у которых в двоичной записи IP-адреса имеется сочетание трех подряд идущих единиц?
В ответе укажите только число.
4
from ipaddress import * net = ip_network('202.75.38.152/255.255.255.248') k = 0 for ip in net: ip = f'{ip:b}' if '111' in ip: k += 1 print(k)
(А. Минак) В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Некоторая сеть имеет маску 255.255.128.0.
Сколько в этой сети IP-адресов, для которых числовое значение четырёхбайтного IP-адреса кратно четырём?
8192
Вариант 1:
from itertools import * from ipaddress import * #вычисляем количество нулевых разрядов в маске, #которые отвечают за нумерацию устройств в сети k0 = f"{ip_address('255.255.128.0'):b}".count('0') #т.к. нулевой номер, т.е. все нули в разрядах, отвечающих за адреса, #выдает ошибку при получении остатка от деления, #учитываем это значение при инициализации, т.е. k = 1 k = 1 for i in product('01', repeat = k0): if '1' in i and int(''.join(i), 2) % 4 == 0: k += 1 print(k)
Вариант 2 (А. Кабанов):
from ipaddress import * net = ip_network('0.0.0.0/255.255.128.0') k = 0 for ip in net: if int(ip) % 4 == 0: k += 1 print(k)
В терминалогии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Сеть задана IP-адресом 192.168.32.160 и маской сети 255.255.255.240. Сколько в этой сети IP-адресов, для которых сумма единиц в двоичной записи IP-адреса чётна?
В ответе укажите только число.
8
Вариант 1 (ручное решение):
IP-адрес 192.168.32.160 представим в двоичном виде: 11000000.10101000.00100000.10100000 количество единиц в IP-адресе сети - 8 Количество двоичных разрядов, позволяющих сформировать адрес узла в сети, соответсвуют количеству нолей в маске сети. Т.к. числу 255 в двоичном виде соответствуют 8 единиц, то ноли появляются только в младшем разряде маски. Представим число 240 в двоичном виде: 11110000, т.е. за формирование адресов узов отвечают только четыре младших разряда. Учитывая, что общее количество единиц в IP-адресах узлов должно быть чётным, а 8 единиц уже присутствуют в неизменяемой части адреса, соответствующей адресу сети, то подходят следующие количества единиц в изменяемой части: 0, 2 и 4. Выпишем все подходящие варианты: 0000 0011 0101 0110 1001 1010 1100 1111 Итого: 8
Вариант 2 - лучший (А. Кабанов):
from ipaddress import * #получаем список всех адресов сети в соответствии с маской #чтобы вывести все адреса, можно использовать list(net) #если просто вывести print(net), получим: 192.168.32.160/28 #где 192.168.32.160 - IP-адрес сети, а 28 - префикс маски, #т.е. короткая запись, указывающая количество единичных разрядов #в маске (количество единиц) net = ip_network('192.168.32.160/255.255.255.240') k = 0 #перебираем все возможные адреса узлов, переводя их в двоичный #код, при этом получаем 32-разрядное двоичное число, и вычисляем #кодичество единиц в каждом IP-адресе узла for ip in net: if f'{ip:b}'.count('1') % 2 == 0: k += 1 print(k)
В терминалогии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Сеть задана IP-адресом 142.108.56.118 и маской сети 255.255.255.240. Сколько в этой сети IP-адресов, для которых в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах меньше суммарного количества единиц в правых двух байтах?
В ответе укажите только число.
5
k = 0 from ipaddress import * net = ip_network('142.108.56.118/255.255.255.240', 0) for ip in net: ip2 = f'{ip:b}' if ip2[:16].count('1') < ip2[16:].count('1'): k += 1 print(k)
Сеть задана IP-адресом 106.184.0.0 и маской сети 255.248.0.0. Сколько в этой сети IP-адресов, для которых сумма единиц в двоичной записи IP-адреса не кратна 2?
262144
from ipaddress import * net = ip_network('106.184.0.0/255.248.0.0') cnt = 0 for ip in net: if f'{ip:b}'.count('1') % 2 != 0: cnt += 1 print(cnt)
Сеть задана IP-адресом 172.16.128.0 и маской сети 255.255.192.0. Сколько в этой сети IP-адресов, для которых сумма единиц в двоичной записи IP-адреса не кратна 2?
8192
from ipaddress import * net = ip_network('172.16.128.0/255.255.192.0') cnt = 0 for ip in net: if f'{ip:b}'.count('1') % 2 != 0: cnt += 1 print(cnt)
Сеть задана IP-адресом 112.160.0.0 и сетевой маской 255.240.0.0. Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса не кратно 3?
699050
from ipaddress import * net = ip_network('112.160.0.0/255.240.0.0') cnt = 0 for ip in net: if f'{ip:b}'.count('1') % 3 != 0: cnt += 1 print(cnt)
Сеть задана IP-адресом 112.160.0.0 и сетевой маской 255.240.0.0. Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса кратно 5?
215766
from ipaddress import * net = ip_network('112.160.0.0/255.240.0.0') cnt = 0 for ip in net: if f'{ip:b}'.count('1') % 5 == 0: cnt += 1 print(cnt)
Сеть задана IP-адресом 115.198.0.0 и маской сети 255.254.0.0. Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса кратно 5?
24786
from ipaddress import * net = ip_network('115.198.0.0/255.254.0.0') cnt = 0 for ip in net: if f'{ip:b}'.count('1') % 5 == 0: cnt += 1 print(cnt)
Сеть задана IP-адресом 172.16.168.0 и маской сети 255.255.248.0. Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса не кратно 5?
1663
from ipaddress import * net = ip_network('172.16.168.0/255.255.248.0') cnt = 0 for ip in net: if f'{ip:b}'.count('1') % 5 != 0: cnt += 1 print(cnt)
Узел с IP-адресом 156.38.155.174 принадлежит подсети, в которой 45 адресов, двоичная запись которых содержит 12 единиц. Сколько единиц в двоичной записи маски этой подсети?
22
from ipaddress import * for mask in range(30, 0, -1): net = ip_network(f'156.38.155.174/{mask}', 0) ip = ip_address('156.38.155.174') if net[0] < ip < net[-1]: if sum(f'{ip:b}'.count('1')==12 for ip in net) == 45: print(mask) break
Узел с IP-адресом 193.18.135.201 принадлежит подсети, в которой 105 адресов, двоичная запись которых содержит 19 единиц. Сколько нулей в двоичной записи маски этой подсети?
15
from ipaddress import * for mask in range(30, 0, -1): net = ip_network(f'193.18.135.201/{mask}', 0) ip = ip_address('193.18.135.201') if net[0] < ip < net[-1]: if sum(f'{ip:b}'.count('1')==19 for ip in net) == 105: print(32-mask) break
Узлы с IP-адресами 163.135.196.55 и 163.135.210.181 принадлежат одной сети. Какое наименьшее количество IP-адресов, в двоичной записи которых ровно 21 единица, может содержаться в этой сети?
78
from ipaddress import * for mask in range(30, 0, -1): net1 = ip_network(f'163.135.196.55/{mask}', 0) net2 = ip_network(f'163.135.210.181/{mask}', 0) ip1 = ip_address('163.135.196.55') ip2 = ip_address('163.135.210.181') if net1[0] == net2[0] and net1[0] < ip1 < net1[-1] and net1[0] < ip2 < net1[-1]: cnt = sum(f'{ip:b}'.count('1')==21 for ip in net1) print(cnt) break
Сеть задана IP-адресом одного из входящих в неё узлов 218.194.82.148 и сетевой маской 255.255.255.192. Найдите наибольший IP-адрес в данной сети, который может быть назначен компьютеру. В ответе укажите найденный IP-адрес без разделителей. Например, если бы найденный адрес был равен 111.22.3.44, то в ответе следовало бы записать 11122344.
21819482190
Вариант 1:
from ipaddress import * net = ip_network('218.194.82.148/255.255.255.192', 0) print(''.join(str(max(ip for ip in net.hosts())).split('.')))
Вариант 2:
from ipaddress import * net = ip_network('218.194.82.148/255.255.255.192', 0) print(str(net[-2]).replace('.',''))
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Широковещательным адресом называется специализированный адрес, в котором на месте нулей в маске стоят единицы. Адрес сети и широковещательный адрес не могут быть использованы для адресации сетевых устройств.
Сеть задана IP-адресом одного из входящих в неё узлов 143.168.72.213 и сетевой маской 255.255.255.240.
Определите наибольший IP-адрес данной сети, который может быть присвоен компьютеру. В ответе укажите найденный IP-адрес без разделителей.
Например, если бы найденный адрес был равен 111.22.3.44, то в ответе следовало бы записать 11122344.
14316872222
from ipaddress import * print(str(ip_network('143.168.72.213/255.255.255.240', 0)[-2]).replace('.',''))
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Широковещательным адресом называется специализированный адрес, в котором на месте нулей в маске стоят единицы. Адрес сети и широковещательный адрес не могут быть использованы для адресации сетевых устройств.
Сеть задана IP-адресом одного из входящих в неё узлов 11.92.135.56 и сетевой маской 255.224.0.0.
Найдите в данной сети наибольший IP-адрес, который может быть назначен компьютеру. В ответе укажите найденный IP-адрес без разделителей.
Например, если бы найденный адрес был равен 111.22.3.44, то в ответе следовало бы записать 11122344.
1195255254
from ipaddress import * net = ip_network('11.92.135.56/255.224.0.0', 0) print(str(net[-2]).replace('.',''))