На прошлом уроке 13.1 мы разобрали всю теоретическую часть, связанную с понятиями IP- адрес узла, IP-сети, маска подсети. Поэтому термины заданий вам уже должны быть понятны. На этом уроке решим все типы возможных задач, которые могут встретиться на ЕГЭ в задании 13 по этой теме. Также узнаем немного интересной истории об интернет: о главных судьбоносных событиях в становлении интернет; о людях, кто создал всё, благодаря чему состоялся современный мир информационных технологий.
Практикум №9
Задание №1. 11 класс ЕГЭ Зад.13
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу узла сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Сеть задана IP-адресом 253.112.169.12 и маской сети 255.255.254.0. Сколько в этой сети IP-адресов, для которых в двоичной записи IP- адреса суммарное количество единиц в правых двух байтах не менее суммарного количества единиц в левых двух байтах. В ответе укажите только число.
Вот такое условие с предисловием будет приблизительно на ЕГЭ. Понимаем, что за 8 мин регламента ЕГЭ с задачей не справиться, поэтому пишем программу.
Решение: 1) в задачах на определение адресов сети используем самую популярную библиотеку, точнее модуль библиотеки Python, которую в принципе не сложно запомнить, так как она соответствует цели ipaddress; поэтому стандартно from ipaddress import* подключаем модуль в первой строке программы; 2) если что-то подсчитывается, то нужен счётчик, поэтому обнуляем k 3) теперь нам надо сформировать рабочие реальные адреса в данной сети и вот здесь незаменима функция ip_network, которая формирует массив всех возможных адресов для данной сети в виде строк в формате, например, 253.112.169.70.
В параметрах функции указываются всегда сначала адрес узла и через правый слэш маска в разных формах (строки как ip-адрес или профиксно в виде кол-ва единиц), а в конце после запятой 0. Обращаю внимание, всё прописывается в строке (с кавычками), т.к. результат – строка. Почему 0 в конце? 0 (нестрогое соответствие) указывает на то, что функция не будет проверять маску на соответствие стандартам, т.е. в этом случае не будет вызвано исключение и программа не завершится аварийно; неправильные биты адреса обнулятся и будет создан ip как объект сети.
Для данной маски сеть будет 253.112.0.0. с учетом третьего байта 169 возможны два варианта третьего байта в маске: 254 и 255 для данной сети и для четвёртого байта возможны 255 адресов под восемь бит;
Массив адресов назвали net, можно присвоить любое имя переменной массиву, не обязательно net;
4) в четвёртой строке перебираем в цикле for все полученные адреса в виде строк; переменной ip присваиваем текущий элемент массива net;
5) в пятой строке: так как нам надо посчитать кол-во единиц, то переводим строки в двоичные числа int(ip) – перевод в число; bin(int(ip)) – перевод в бинарное число, Для того, чтобы получить двоичное представление ip-адреса, исходную строку (ip) надо перевести в число, затем полученное число представить в двоичном коде.
Внимательно, два момента: так как при переводе в двоичное число образуется строка с бинарным префиксом – 0b, используем slice() – срез, убирая два символа слева [2:]; из предыдущих практикумом это уже должно быть вам известно.
Новый метод zfill() используется для заполнения строки слева незначащими нулями до кол-ва, указанного в параметрах; поскольку адрес занимает 32 бита (4 байта), дополняем его до 32 символов нулями. Почему это необходимо? Потому что при переводе числа функцией bin() в двоичное число незначащие нули в адресе не указываются, а нам надо строго по 16 бит разделить двоичную строку на две части, чтобы подсчитать в каждой кол-во единиц; Результатом в 5 строке будет строка bip – двоичное представление ip-адреса.
6)в 6 строке остаётся подсчитать единицы с использованием уже известных вам срезов и метода count() и операции отношений в условном операторе if
Вот такое простое решение самого простого типового 13 задания ЕГЭ. Описала подробно все ключевые моменты, поэтому в следующих заданиях на них останавливаться не будем. Для данного базового типа задания может быть много разных сравнительных вариантов в бинарных адресах. Может быть условие на поиск кратного 2 и 3 и т.д. количества 0 или 1, или условие, где есть 2 единицы, стоящие рядом иди адрес заканчивается на 111 и т.д. Все это просто работа с срезами и строками, помните, что бинарный адрес – это строка и не забывайте отделять признак бинарности 0b и дополнять при необходимости строку до полной длины - 32 символов.
Теперь усложним задание, с учётом неизвестных в ip-узле, и маске.
Задание №2. 11 класс ЕГЭ Зад.13
Сеть задана IP-адресом 64.129.A.10, где A – некоторое допустимое для записи IP- адреса число и маской сети 255.255.252.0. Определите минимальное значение A, для которого для всех IP-адресов этой сети в двоичной записи IP- адреса суммарное количество единиц в левых двух байтах не более суммарного количества единиц в правых двух байтах. В ответе укажите только число.
Решение: 1) первая строка понятна, смотрим строку 2: в ip- адресе A - переменная, которая может принимать значения от 0 до 255 включительно ( подробно об организации адресов рассказано на предыдущем уроке https://dzen.ru/a/Z5fsYlNogVzNHkzA ), поэтому мы можем организовать цикл для переменной A в диапазоне от 0 до 256 с учетом того, что последнее значение числового отрезка не считывается; 2) 3 строка со счётчиком понятна; а в 4 строке появляется новые элементы.
Внимание! Новый инструмент f- строк в Python. Форматирование в Python очень динамично видоизменялось от одной редакции к другой. Наибольшую популярность имеют метод форматирования - format() и инструмент – f-строка. Первый используется чаще при выводе на печать, а f- строка практически везде. Внутри f-строки можно обращаться к переменным, используя фигурные скобки, а также выполнять разные операции, функции и подставлять их результаты в данную строку. Синтаксис применения очень простой – ставится перед строкой f, а строка как обычно берётся в кавычки.
Т.о. при помощи f – строки задаём адрес и маску с переменной A, которой присваиваем в цикле for (2 строка) значения от 0 до 255.
3) строки 4-8 аналогичны предыдущей задаче и должны быть понятны.
Мы получаем сеть и все возможные адреса для данной сети и проверяем их на условие количества единиц в частях бинарного адреса узла и затем накапливаем подходящие в счётчик k. Но по условию задания вам надо, чтобы для всех IP-адресов этой сети в двоичной записи IP- адреса выполнялось условие на кол-во единиц. Как найти кол-во узлов всего для данной сети? 4) в 9 строке используем функцию библиотеки ipaddress - num_addresses (внимательно на конце es), которая используется как метод к текущей сети net.
После выполнения цикла по каждой сети (net) проверяем полученное значение счётчика k на равенство общему кол-ву узлов сети. При выполнении условия можно завершить цикл оператором break (прерывание цикла), так как надо найти наименьшее A.
Задание №3 11 класс ЕГЭ Зад.13
Сеть задана IP-адресом 199.59.129.3, и маской сети 255.255.A.0, где A – некоторое допустимое для записи маски число. Определите минимальное значение A, для которого для всех IP-адресов этой сети в двоичной записи IP- адреса суммарное количество единиц в левых двух байтах не менее суммарного количества единиц в правых двух байтах. В ответе укажите только число..
Решение: программа для данного задания практически такая же за исключением блока try: except (дословно пробовать - кроме). Это довольно многофункциональная конструкция для обработки исключений.
Внимание, новая конструкция!
В этой конструкции блок try содержит код, который может вызвать исключительную ситуацию. Если исключительная ситуация возникает, то управление передается блоку except, где исключение обрабатывается. Есть две опции в данной конструкции.
Блок else как опция содержит код, который будет выполнен, если в блоке try не возникает исключительной ситуации.
Блок finally также опционален и содержит код, который будет выполнен в любом случае после выполнения блока try и except.
Но в нашем случае мы используем блок без опций, так как неподходящие значения байта маски мы просто пропускаем и продолжаем цикл дальше. Для продолжения работы при исключении, когда маска не может иметь данное значение при заданном ip, используем либо раss, либо continue в блоке except.
Pass в Python – это оператор-заглушка. В блоках try-except pass позволяет игнорировать исключения и при этом не влиять на ход выполнения программы; поэтому цикл продолжится дальше, если мы используем pass.
Оператор continue в Python пропускает текущую итерацию цикла и переходит к следующей, что в принципе аналогично except: pass, поэтому можно использовать в данном случае в except любой из этих операторов.
Почему при использовании переменной A в ip – адресе не возникает исключительных ситуаций, а в масках возникает, ведь в параметрах функции ip_network 0 по-прежнему прописан. Потому что маска является определяющей для сети. Если адрес неверен, маска обнуляет неверные единицы в нули. Но если сама маска неизвестна, то здесь коррекций не будет и возможны нереальные адреса, поэтому надо предусмотреть выходы, пропуская данные комбинации узлов и масок при помощи блока исключений.
Поскольку маски могут быть заданы в разных форматах: как ip- адрес или количеством единиц (посфиксно), рассмотрим задание, где используется переменная в маске другого формата.
Задание №4 11 класс ЕГЭ Зад.13
Для узла с IP-адресом 175.122.80.13, адрес подсети равен 175.122.80.0. Сколько существует различных возможных значений маски, если известно, что в этой сети не меньше 60 узлов.
Решение: I данное задание можно решить и вручную, но сначала рассмотрим программный вариант; 1) так как переменная – вся маска, а не какой-то её байт, то используем запись маски в формате количества единиц; после слэша, отделяющего ip-адрес от маски, указываем переменную для маски; маска может иметь от 0 до 32 бит, значит от 0 до 32 единиц; поэтому во 2 строке используем цикл for для перебора вариантов маски до 33, так как вы уже знаете, что на интервале цикла последнее значение не считывается, а является признаком конца;
2) в 3 строке используем форматирование f-строкой, но в фигурных скобках прописываем имя переменной маски (любое имя латиницей); 3) в 4 строке используя функцию num_addresses для проверки условия на количество устройств в сети более 60; если условие выполняется, выводим значение сети и кол-во устройств.
А теперь анализируем полученный результат. Так как нам надо найти, сколько вариантов масок может быть в подсети 175.122.80.0, то находим подсеть в выводе результата и считаем количество полученных масок. Ответ: 7.
Решение: II решаем ручным способом, помня материал предыдущего урока https://dzen.ru/a/Z5fsYlNogVzNHkzA Если в условии требуется не менее 60 устройств, то маска должна содержать не менее 6 нулей (2^6=64), т.е. впереди должны быть теоретически единицы от 0 до 26, а потом 6 нулей. Проверим, сколько единиц может быть в маске при данных сети и подсети с помощью побитной конъюнкции, так же как и в случае с маской при определении сети. Так как первые два байта не изменились, то маска включает 16 единиц. Теперь рассмотрим 3 и 4 байты сети 80 и 13 и подсети 80 и 0, в двоичном представлении 80 -1010000 ; 13 – 00001101 для побитной конъюнкции.
o * сеть 10100000 00001101
o маска 11100000 00000000
o п/сеть 10100000 00000000
первые 3 единицы и последние 6 нулей в маске мы не изменяем, так как это условие задания и маска обязана в 3 байте иметь 3 первых единицы, а начиная с шестого бита четвёртого байта нули; всего нулей: резервных под варианты маски остаётся 5+2=7 нулей, т.е. 7 вариантов маски; саму подсеть не включаем в маску; считаем только резервные нули.
1. 11110000 00000000
2. 11111000 00000000
3. 11111100 00000000
4. 11111110 00000000
5. 11111111 00000000
6. 11111111 10000000
7. 11111111 11000000
Вот такое простое решение для данного типа задач. Мы практически разобрали все типы возможных заданий, где эффективнее программный метод, а на предыдущем уроке по этой теме раскрыли все возможные ручные задания на анализ байтов масок и сетей.
Надеюсь, с моей подачи вы покорите 13 на ЕГЭ!
Так постепенно мы с вами осваиваем алгоритмику и программирование на нашем курсе ликбеза, идя по темам, и к концу курса вы не заметите, как легко овладеете Python и сможете написать программу любой сложности. Проверено!
В завершение урока поговорим ещё о роли масок в it-мире для общего понимания темы. До появления масок все было довольно неуклюже в интернет. Ранее существовала, так называемая, классовая адресация как архитектура сети. Всё адресное пространство протокола IP делилось на 5 классов и принадлежность определялась первыми битами адреса. Тип A - большие сети, B – средние, С – небольшие. Бесклассовая адресация – метод гибкой адресации за счёт переменной длины маски подсети от 0 до 32 бит, а при классовой адресации давалась фиксированная длина в зависимости от класса 8, 16, 24 бита (A, B, С). Таким образом с переменной маской удобно управлять подсистемами разного размера. Так, например, для любого пользователя можно рассчитать сумму адресов для оптимизации работы сети. Но время не стоит на месте и информационные потоки требуют дальнейших ускорений. Поэтому вскоре будущее за архитектурой RINA, где маски управляют самим процессом оправки. Вообще интернет технологии – самые динамичные в мире процессы. А ведь всё начиналось совсем недавно. В ответ на запуск нашего спутника в 1957 году, американское минобороны создало технологию DARPA. Современные дроны и GPS вышли из этой же технологии. Первая сеть называлась ARPANET, а первое слово, которое передалось по сети протоколом на 640 км – было Login. Это было в 1969 году – это дата считается основанием интернет. Затем научная сфера усовершенствовала интернет и приоритет оборона передала науке, а сеть стала называться NSFNET Привычные нам web-сайты появились спустя 22 года, в 1991 году, благодаря британскому компьютерщику Тиму Бернерс-Ли, который придумал унифицированный ресурс URL- указатель web-ресурсов. Его считают создателем www. А двигатель интернет - протоколы IP и TCP (о них всё подробно на прошлом уроке) создали два студента Винт Сёрф и Роберт Кан еще раньше, в 1983 году. Это гениальное изобретение обеспечило универсальность передачи данных в сетях и по сей день. У нас интернет появился в 1994 году, всего 30 лет назад, когда был зарегистрирован первый домен. Кто же управляет всем этим чудом? Удивительно, но у интернет нет прямых управленцев. Есть организации по управлению архитектурой, присвоению адресов. экспертный совет. Это небольшой исторический экскурс для представления о том, как начиналось то, что стало осью нашей жизни!
Все мои статьи – результат большой аналитической и физической работы в помощь тем, кто хочет понять и быть успешным. Поэтому благодарна за любую поддержку: лайки, комментарии, донаты:
До следующих уроков в школе Дзен!