Задание № 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 = bin(int(ip))[2:] #получили IP-адрес в виде десятичного целого числа и перевели это число в двоичный код
if len(s)<32: s = (32-len(s)) * '0' + s #доводим разрядность до 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. Какое наибольшее возможное количество нулей в разрядах маски?
from ipaddress import *
for a in range(0,33):
net = ip_network(f'244.55.229.28/{a}',False)
s = str(net).split('/')
if s[0]=='244.0.0.0':
print(net.netmask)
"""больше 0 в той маске, в которой больше байтов, равных 0,
и чем меньше старший(ие) байт(ы), в выводе это первая маска,
252 = 11111100 (2 нуля) + 3*8 в младших байтах, всего 26)"""
Результат запуска программы
Ответ: 26
Еще одна задача, подобная пятой задаче, разобрана ранее в блоге автора Методическая копилка (Учителю информатики).
Адрес сети равен 183.192.A.0, где А — некоторое допустимое для записи адреса сети число, а маска сети 255.255.252.0. Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в правых двух байтах больше трёх.
Комментариев нет:
Отправить комментарий