26.02.2024

Задание № 13. ЕГЭ по информатике. IP-адреса и маски. Программа решения задачи на языке Python

 Задание № 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-адреса суммарное количество единиц в правых двух байтах больше трёх.

Комментариев нет:

Отправить комментарий