Решение заданий 13 ЕГЭ. Организация компьютерных сетей и адресация.

ЕГЭ информатика 13 задание

URL адрес

URL — это адрес веб-страницы или файла в интернете.

Он состоит из нескольких частей:

  1. Протокол, например, http или ftp.
  2. Знаки ://, которые отделяют протокол от остальной части адреса.
  3. Доменное имя или IP-адрес сайта.
  4. Каталог на сервере, где находится файл.
  5. Имя файла.

В URL принято использовать прямой слеш (/ вместо обратного слэша «\») для разделения каталогов.

Пример URL: http://www.example.com/about/us.html

Здесь желтым выделен протокол, фиолетовым — доменное имя сайта, голубым — каталог на сайте и серым — имя файла.

Примеры заданий

Задание 1. Идентификатор некоторого ресурса сети Интернет имеет следующий вид:

http://www.ftp.ru/index.html
Какая часть этого идентификатора указывает на протокол, используемый для передачи ресурса? Выпишите нужную часть.

Решение

Протокол, используемый для передачи ресурса, указывается в начале идентификатора URL. В данном случае это протокол HTTP.

Задание 2. Доступ к файлу ftp.net , находящемуся на сервере txt.org, осуществляется по протоколу http. В таблице фрагменты адреса файла закодированы буквами от А до Ж. Запишите последовательность этих букв, кодирующую адрес указанного файла в сети Интернет.

A .net
Б ftp
В ://
Г http
Д /
Е .org
Ж txt
Решение

Для составления адреса файла на сервере txt.org с использованием протокола HTTP и кодирования буквами от А до Ж, последовательность будет следующей:

Г (http) + В (://) +  Ж (txt)+ Е (org)+Д (/) +Б (ftp) +A (.net)    = http://txt.org/ftp.net.

Таким образом, адрес файла будет выглядеть как http://txt.org/ftp.net.

IP адрес

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

Это как номер телефона, только для компьютеров.

IP-адрес компьютера состоит из четырех чисел, которые разделяются точками.

Каждое из этих чисел может быть от 0 до 255, например: 192.168.85.210. Такое представление связано с тем, что IP адрес — это 32-битное число, то есть число длиной 4 байта. И точки — разделяют байты числа.

Подсеть, адрес подсети и маска подсети

Адрес подсети и маска подсети — это термины, связанные с IP-адресами устройств в сети Интернет. Они помогают определить, какие устройства находятся в одной подсети.

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

Шлюз по умолчанию — это устройство, которое обеспечивает соединение между сетью и интернетом.

Маска подсети — это число, которое определяет диапазон IP-адресов, доступных для использования в подсети. Она помогает определить, какие устройства находятся в одной подсети.

 

Например, если у нас есть подсеть с IP-адресами от 192.168.1.1 до 192.168.1.254, то маска подсети будет 255.255.255.0. Это означает, что все IP-адреса в этой подсети начинаются с 192.168.1.x. Адрес такой сети — 192.168.1.0

Как рассчитать адрес подсети, зная IP адрес одного из устройств и маску сети?

Для расчёта адреса подсети, зная IP адрес одного из устройств и маску сети, выполните следующие шаги:

  1. Преобразуйте IP-адрес и маску сети в двоичную систему счисления: Как правило, IP-адрес и маска сети представлены в десятичной системе счисления. Преобразуйте каждый из них в двоичную систему.
  2. Примените маску сети к IP-адресу: Выполните логическое «И» (AND) между двоичными представлениями IP-адреса и маски сети. Это означает, что для каждой пары битов в IP-адресе и маске сети, результирующий бит будет равен 1, только если оба исходных бита равны 1. Это позволит вам определить адрес подсети.
  3. Преобразуйте обратно в десятичную систему: После выполнения операции «И» преобразуйте полученное двоичное значение обратно в десятичную систему счисления. Это будет адресом подсети.

Пример:

Пусть у вас есть IP-адрес: 192.168.1.25 и маска подсети: 255.255.255.0.

  1. Преобразуйте их в двоичную систему:IP-адрес: 11000000.10101000.00000001.00011001 Маска подсети: 11111111.11111111.11111111.00000000
  2. Выполните побитовую операцию «И» между двоичными представлениями:11000000.10101000.00000001.00000000
  3. Преобразуйте полученное значение обратно в десятичную систему: Адрес подсети: 192.168.1.0

Таким образом, адрес подсети для данного примера равен 192.168.1.0.

Реализация расчета адреса сети с помощью модуля ipaddress Python

Модуль ipaddress в Python предоставляет удобные инструменты для работы с IP-адресами и сетями, включая вычисление адреса подсети.

Напишем функцию, с помощью которой можно вычислить IP адрес сети, зная маску и адрес устройства.

Эта функция calculate_subnet_address принимает строку, представляющую IP-адрес, и строку, представляющую маску сети, и возвращает строку, представляющую адрес подсети. Функция также обрабатывает исключения, которые могут возникнуть при неправильном формате входных данных.

import ipaddress

def calculate_subnet_address(ip_address_str, subnet_mask_str):
    try:
        # Преобразование IP-адреса и маски сети в объекты ipaddress.IPv4Address и ipaddress.IPv4Network
        ip_address = ipaddress.IPv4Address(ip_address_str)
        subnet_mask = ipaddress.IPv4Address(subnet_mask_str)

        # Вычисление адреса подсети
        network_address = ipaddress.IPv4Address(int(ip_address) & int(subnet_mask.network_address))

        return str(network_address)
    except Exception as e:
        return str(e)

# Пример использования функции
ip_address_str = "192.168.1.25"
subnet_mask_str = "255.255.255.0"

subnet_address = calculate_subnet_address(ip_address_str, subnet_mask_str)
print("Адрес подсети:", subnet_address)

Описание программы

  1. Сначала импортируется модуль ipaddress, который предоставляет возможности для работы с IP-адресами и сетями.
  2. В функции calculate_subnet_address(ip_address_str, subnet_mask_str) принимаются две строки: ip_address_str — IP-адрес устройства и subnet_mask_str — маска сети.
  3. Внутри функции:a. ipaddress.IPv4Address(ip_address_str) — строка ip_address_str преобразуется в объект IPv4Address, который представляет IP-адрес устройства.b. ipaddress.IPv4Address(subnet_mask_str) — строка subnet_mask_str преобразуется в объект IPv4Address, который представляет маску подсети.c. int(ip_address) и int(subnet_mask.network_address) — IP-адрес и адрес сети преобразуются в целочисленное представление для выполнения побитовой операции «И».d. int(ip_address) & int(subnet_mask.network_address) — выполняется операция «И» между целочисленными представлениями IP-адреса и адреса сети, что приводит к вычислению адреса подсети.e. ipaddress.IPv4Address(...) — целочисленный результат вычисления адреса подсети преобразуется обратно в объект IPv4Address.f. return str(network_address) — адрес подсети преобразуется в строку и возвращается из функции.
  4. Далее следует пример использования функции, где задается IP-адрес ip_address_str (например, «192.168.1.25») и маска сети subnet_mask_str (например, «255.255.255.0»). Функция calculate_subnet_address вызывается с этими значениями.
  5. Результат выполнения функции выводится на экран, и в результате кода будет выведен адрес подсети, который был вычислен на основе заданных IP-адреса и маски сети.

Общее назначение этого кода — преобразовать IP-адрес устройства и маску сети в адрес подсети, используя модуль ipaddress в Python.

Задание 3. Маской подсети называется 32-разрядное двоичное число, которое определяет, какая часть IP-адреса компьютера относится к адресу сети, а какая часть IP-адреса определяет адрес компьютера в подсети. В маске подсети старшие биты, отведенные в IP-адресе компьютера для адреса сети, имеют значение 1; младшие биты, отведенные в IP-адресе компьютера для адреса компьютера в подсети, имеют значение 0.

Если маска подсети 255.255.255.224 и IP-адрес компьютера в сети 162.198.0.157, то порядковый номер компьютера в сети равен_____

Решение

Алгоритм решения:

  1. Используем модуль ipaddress Python
  2. Создаем два объекта типа IPv4Address, передавая на вход конструктора, IP адреса устройства и маски в текстовом формате.
  3. Делаем побитовую конъюнкцию преобразованных в int объектов маски и IP адреса.
  4. Вычисляем, таким образом, адрес подсети.
  5. Вычитаем из числовых значений (преобразованных преобразованных в int объектов ) IP адреса устройства значение адреса сети.
  6. Получаем порядковый номер устройства в сети.
import ipaddress

# Задаем IP-адрес устройства и маску подсети в текстовом формате
ip_address_str = "162.198.0.157"
subnet_mask_str = "255.255.255.224"

# Создаем объекты IPv4Address для IP-адреса и маски подсети
ip_address = ipaddress.IPv4Address(ip_address_str)
subnet_mask = ipaddress.IPv4Address(subnet_mask_str)

# Вычисляем адрес подсети
network_address = ipaddress.IPv4Address(int(ip_address) & int(subnet_mask))

# Вычисляем порядковый номер устройства в сети
ordinal_number = int(ip_address) - int(network_address)

# Выводим порядковый номер устройства
print(f"Порядковый номер устройства в сети: {ordinal_number}")

Ответ: 29.

Примечание: Важно учитывать, что в этом алгоритме порядковый номер начинается с адреса, следующего за адресом сети (шлюзом). То есть, если результат равен 1, это означает, что IP-адрес устройства — это адрес шлюза.

Создание объекта типа «сеть» в ipaddress

Часто, бывает необходимо создать объект типа «сеть» или IPv4Network. Он пригодится, если нужно вычислить количество компьютеров в сети или вычислить маску подсети.

Чтобы создать данный объект, необходимо использовать адрес подсети плюс префикс подсети или маску.

Что такое префикс подсети?

Длина префикса маски подсети, также называемая «префиксом» или «префиксной длиной», представляет собой количество битов в маске подсети, устанавливающих адрес сети, тогда как оставшиеся биты в адресе определяют адреса устройств в этой сети. Длина префикса обозначается числом после косой черты в формате «IP-адрес/длина_префикса» (например, «192.168.1.0/24»).

Вот несколько примеров для лучшего понимания:

  1. Длина префикса 24 бита (IPv4 маска /24):
    • IP-адрес: 192.168.1.0
    • Длина префикса: 24 бита
    • Маска подсети: 255.255.255.0
    • Этот адрес сети включает в себя все устройства в диапазоне от 192.168.1.0 до 192.168.1.255. Последний байт (8 битов) используется для адресов устройств.
  2. Длина префикса 16 бит (IPv4 маска /16):
    • IP-адрес: 192.168.0.0
    • Длина префикса: 16 битов
    • Маска подсети: 255.255.0.0
    • Этот адрес сети включает в себя все устройства в диапазоне от 192.168.0.0 до 192.168.255.255. Последние два байта (16 битов) используются для адресов устройств.
  3. Длина префикса 28 бит (IPv4 маска /28):
    • IP-адрес: 192.168.1.16
    • Длина префикса: 28 битов
    • Маска подсети: 255.255.255.240
    • Этот адрес сети включает в себя устройства в диапазоне от 192.168.1.16 до 192.168.1.31. Последний байт (8 битов) разбит на более мелкие подсети с 4 адресами в каждой.

Длина префикса определяет количество адресов устройств в сети и степень сегментации сети. Более короткий префикс дает больше адресов для устройств, но меньше сегментации сети, в то время как более длинный префикс ограничивает количество адресов и обеспечивает большую сегментацию. Выбор длины префикса зависит от требований к сети и количества устройств, которые должны быть включены в сеть.

Задание 4. В терминологии сетей TCP/IP маской подсети называется 32-разрядное двоичное число, определяющее, какие именно разряды IP-адреса компьютера являются общими для всей подсети – в этих разрядах маски стоит 1. Обычно маски записываются в виде четверки десятичных чисел — по тем же правилам, что и IP-адреса. Для некоторой подсети используется маска 255.255.254.0. Сколько различных адресов компьютеров теоретически допускает эта маска, если два адреса (адрес сети и широковещательный) не используют?

Решение

Для определения количества различных адресов компьютеров, которые допускает данная маска подсети, вы можете использовать модуль ipaddress в Python. Маска 255.255.254.0 в двоичной записи будет выглядеть как 11111111.11111111.11111110.00000000.

Чтобы узнать, сколько адресов доступно, вы можете вычислить 2 в степени количества нулей в двоичной маске минус 2 (потому что два адреса — адрес сети и широковещательный адрес — не используются для устройств).

Второй способ — использовать объект IPv4Network:

  1. Создаем сеть, используя произвольный IP адрес и данную маску полсети.
  2. Используя метод hosts, получаем все IP адреса устройств сети.
  3. С помощью функции len(), считаем их количество и вычитаем 2.
import ipaddress

# Задаем маску подсети
subnet_mask_str = "255.255.254.0"

# Создаем объект IPv4Network на основе маски подсети
network = ipaddress.IPv4Network(f"192.168.0.0/{subnet_mask_str}", strict=False)

# Вычисляем количество доступных адресов для устройств
available_addresses = len(list(network.hosts()))

# Выводим количество доступных адресов
print(f"Количество доступных адресов для устройств: {available_addresses}")

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

Например, если IP-адрес узла равен 231.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 231.32.240.0.

Для узла с IP-адресом 98.162.71.94 адрес сети равен 98.162.71.64. Чему равно наименьшее количество возможных адресов в этой сети?

Примечание. Адрес сети и широковещательный адрес необходимо учитывать при подсчёте.

Решение
  1. Мы импортируем необходимый модуль ipaddress.
  2. Задаем IP-адрес узла pc_ip и адрес сети net_ip в строковом формате.
  3. Затем мы создаем объект IPv4Address из pc_ip и объект IPv4Network из net_ip.
  4. Мы начинаем цикл, который перебирает возможные длины маски от 31 до 1 в обратном порядке.
  5. Внутри цикла мы пытаемся создать объект IPv4Network с текущей длиной маски и адресом сети, и проверяем, входит ли IP-адрес узла в эту сеть. Если входит, то это означает, что мы нашли наибольшую маску, и мы выводим количество доступных адресов в этой сети с использованием net.num_addresses.
  6. Мы используем конструкцию try/except, чтобы обработать исключения, которые могут возникнуть при попытке создать объект IPv4Network с недопустимой маской.
from ipaddress import *
pc_ip = '98.162.71.94'
ip = IPv4Address(pc_ip)
net_ip = '98.162.71.64'
for i in range(31,0,-1):
    try:
        net = IPv4Network(net_ip+'/'+str(i))
        if ip in net:
            print(net.num_addresses)
            break
    except:
        pass

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

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

Решение

Для решения этой задачи с использованием модуля ipaddress в Python, вы можете создать объект IPv4Network с заданным IP-адресом сети и маской сети, а затем перебрать все адреса в этой сети, подсчитывая количество единиц в их двоичной записи и проверяя, является ли это число четным.

import ipaddress

# Задаем IP-адрес сети и маску сети
network_ip = "192.168.32.160"
subnet_mask = "255.255.255.240"

# Создаем объект IPv4Network
network = ipaddress.IPv4Network(f"{network_ip}/{subnet_mask}", strict=False)

# Счетчик для подсчета адресов, для которых сумма единиц в двоичной записи четна
count = 0

# Перебираем все адреса в сети
for ip in network:
    binary_ip = bin(int(ip))  # Преобразуем IP-адрес в двоичную строку
    ones_count = binary_ip.count('1')  # Подсчитываем количество единиц
    if ones_count % 2 == 0:  # Проверяем, является ли количество единиц четным
        count += 1

# Выводим количество адресов, для которых сумма единиц в двоичной записи четна
print(f"Количество IP-адресов с четной суммой единиц: {count}")

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

Важное замечание. В условии задачи, нет четкого указания: считать или нет адрес сети и широковещательный адрес. Если считать не нужно, то необходимо вычесть 2 или воспользоваться методом network.hosts(), который позволяет получить все возможные допустимые IP устройств сети.

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

A B C D E F G H
170 168 160 135 132 16 12 0
Решение

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


from ipaddress import *
pc_ip = '135.12.166.217'
mask_str = '255.255.248.0'
ip = IPv4Address(pc_ip)
net_ip = '98.162.71.64'
for i in range(0,167):
    try:
        net = IPv4Network('135.12.'+str(i)+'.0/'+mask_str)
        if ip in net:
            print(str(net[0]))
            break
    except:
        pass

Задание 8. Для узла с IP-адресом 132.214.141.28 адрес сети равен 132.214.141.0. Укажите наибольшее возможное значение последнего (самого правого) байта маски этой сети. Ответ запишите в виде десятичного числа.

Решение

Создаем все возможные варианты подсетей и ищем подходящие. Затем получаем маски подсетей и последний байт сохраняем в список masks. Максимальный элемент печатаем.

  1. Сначала мы импортируем необходимый модуль ipaddress.
  2. Задаем IP-адрес узла pc_ip и адрес сети net_ip в текстовом формате.
  3. Создаем пустой список masks, в котором мы будем хранить значения последнего (самого правого) байта маски подсети для разных масок.
  4. Затем мы запускаем цикл for, который перебирает возможные длины масок в обратном порядке, начиная с 31 (максимальной длины маски) и заканчивая 1.
  5. Внутри цикла мы пытаемся создать объект IPv4Network с текущей маской и адресом сети, а затем проверяем, входит ли IP-адрес узла в эту сеть.
  6. Если IP-адрес входит в сеть, мы добавляем значение последнего байта маски подсети в список masks.
  7. После завершения цикла мы используем функцию max(masks), чтобы найти наибольшее значение в списке masks, которое представляет самый правый байт маски подсети.
from ipaddress import *
pc_ip = '132.214.141.28'
ip = IPv4Address(pc_ip)
net_ip = '132.214.141.0'
masks = []
for i in range(31,0,-1):
    try:
        net = IPv4Network(net_ip+'/'+str(i))
        if ip in net:
            masks.append(int(str(net.netmask)[str(net.netmask).rfind('.')+1:]))
    except:
        pass
print(max(masks))  

Таким образом, код находит наибольшее возможное значение последнего (самого правого) байта маски подсети для заданного IP-адреса узла и адреса сети.

Задание 9. Для узла с IP-адресом 119.167.58.77 адрес сети равен 119.167.32.0. Чему равно наименьшее возможное значение третьего слева байта маски? Ответ запишите в виде десятичного числа.

Решение
from ipaddress import *
pc_ip = '119.167.58.77'
ip = IPv4Address(pc_ip)
net_ip = '119.167.32.0'
masks = []
for i in range(31,0,-1):
    try:
        net = IPv4Network(net_ip+'/'+str(i))
        if ip in net:
            masks.append(int(str(net.netmask).split('.')[2]))
    except:
        pass
print(min(masks))   
  1. В начале программы импортируется модуль ipaddress для работы с IP-адресами и сетями.
  2. Задаются следующие переменные:
    • pc_ip — строка, представляющая IP-адрес узла '119.167.58.77'.
    • ip — объект IPv4Address, созданный на основе pc_ip, представляющий IP-адрес узла.
    • net_ip — строка, представляющая адрес сети '119.167.32.0'.
    • masks — это пустой список, в который будут добавляться значения последнего байта маски подсети для разных масок.
  3. Далее начинается цикл for, который перебирает возможные длины масок в обратном порядке, начиная с 31 (максимальной длины маски) и заканчивая 1.
  4. Внутри цикла выполняется следующее:
    • Пробуем создать объект IPv4Network с текущей маской и адресом сети, например, '119.167.32.0/31'.
    • Проверяем, входит ли IP-адрес ip в данную сеть с помощью проверки if ip in net.
    • Если IP-адрес входит в сеть, мы получаем объект net с этой маской, а затем извлекаем последний байт маски подсети.
    • Значение байтов маски подсети (netmask) извлекается с помощью int(str(net.netmask).split('.')[2]), что позволяет получить значение 3-го байта маски.
  5. Значения последних байтов маски подсети, для которых IP-адрес узла входит в сеть, добавляются в список masks.
  6. После завершения цикла мы используем print(min(masks)), чтобы вывести минимальное значение из списка masks.
Понравилась статья? Поделиться с друзьями:
Школа Виктора Комлева
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.