Задание № 13. ЕГЭ по информатике. IP-адреса и маски
Приведем решения некоторых задач на IP-адреса и маски на языке Python.
Задача 1
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Узлы с IP-адресами 84.77.95.123 и 84.77.96.123 находятся в одной сети. Укажите наибольшее возможное значение третьего слева байта маски этой сети. Ответ запишите в виде десятичного числа.
from ipaddress import *
for mask in range(0,33): #кол-во единиц в маске
net1 = ip_network(f'84.77.95.123/{mask}',0)
net2 = ip_network(f'84.77.96.123/{mask}',0)
if net1==net2:
print(str(net1.netmask).split('.')[2]) #3-й байт
Ответ: 192
Задача 2
Для узла с IP-адресами 84.77.95.123 третий слева байт маски равен 224. Чему равен адрес сети для этого узла. Ответ запишите в виде IP-адреса (четыре десятичных числа, разделенных точками)
from ipaddress import *
b3 = 224
mask = 16+bin(b3)[2:].count('1') #количество единиц в маске
net = ip_network(f'84.77.95.123/{mask}',0)
print(net)
Ответ: 84.77.64.0
Задача 3
Узлы с IP-адресами 84.77.95.123 и 84.77.96.123 находятся в разных сетях, маски которых одинаковы. Укажите наименьшее возможное значение третьего слева байта этой маски. Ответ запишите в виде десятичного числа.
from ipaddress import *
for mask in range(0,33): #кол-во единиц в маске
net1 = ip_network(f'84.77.95.123/{mask}',0)
net2 = ip_network(f'84.77.96.123/{mask}',0)
if net1!=net2:
print(str(net1.netmask).split('.')[2]) #3-й байт
Ответ: 224
Задача 4
Сеть задана IP-адресом 199.59.129.3 и маской сети 255.255.А.0, где А - некоторое допустимое для записи маски число.
Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не менее суммарного количества единиц в правых двух байтах. В ответе укажите только число.
from ipaddress import *
for a in range(0,9): #количество единиц в третьем байте
net = ip_network(f'199.59.129.3/{16+a}',False)
k = 0
j = 0
m = net.netmask
for ip in net:
j+=1
s = f'{ip:b}' #получили IP-адрес в виде 32-битного кода
L = s[0:16].count('1')
R = s[16:33].count('1')
if L>=R:
k+=1
if j == k:
print(m)
Ответ: 254
Задача 5
Для узла с IP-адресом 244.55.229.28 адрес сети равен 244.0.0.0. Какое наибольшее возможное количество нулей в разрядах маски?
for m in range(33):
net = ip_network(f'244.55.229.28/{m}',0)
if net.network_address == ip_address('244.0.0.0'):
print(32-m) #количество нулей в маске
Результат запуска программы
Ответ: 26
Еще одна задача, подобная пятой задаче, разобрана ранее в блоге автора Методическая копилка (Учителю информатики).
Адрес сети равен 183.192.A.0, где А — некоторое допустимое для записи адреса сети число, а маска сети 255.255.252.0. Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в правых двух байтах больше трёх.
Комментариев нет:
Отправить комментарий