Введение
В этой лабораторной работе вы освоите основные навыки подсетирования IP-адресов и двоичного преобразования с использованием командной строки Linux. Используя интерактивный интерпретатор Python, вы получите практический опыт выполнения фундаментальных расчетов, лежащих в основе компьютерных сетей, переходя от теоретических знаний к практическому применению в терминальной среде.
Вы начнете с преобразования IP-адресов из привычной десятично-точечной нотации в их 32-битное двоичное представление и обратно. Затем лабораторная работа проведет вас через перевод CIDR-масок подсети в их двоичные и десятично-точечные эквиваленты. Наконец, вы примените эти навыки для определения сетевой и хостовой частей заданного IP-адреса и расчета общего количества доступных для использования хостов и подсетей в пределах определенного CIDR-блока.
Выполнение преобразований IP-адресов и масок подсети в Python
На этом этапе вы будете использовать интерактивный интерпретатор Python для выполнения нескольких ключевых сетевых преобразований. Вы научитесь преобразовывать IP-адреса между десятично-точечным и двоичным форматами, а также переводить CIDR-маски подсети в их полные двоичные и десятично-точечные представления. Все это будет сделано в одном непрерывном сеансе для оптимизации процесса.
IPv4-адрес — это 32-битное число. Чтобы сделать его читаемым для человека, он представляется в виде четырех 8-битных чисел, называемых октетами, разделенных точками (например, 192.168.1.10). Каждый из этих октетов может быть преобразован в 8-битное двоичное число.
Сначала откроем терминал и запустим интерактивный интерпретатор Python. В среде LabEx Python предустановлен. Введите
python3и нажмите Enter.python3Вы увидите новый приглашение
>>>, которое указывает, что вы находитесь внутри интерпретатора Python.Python 3.10.x (...) Type "help", "copyright", "credits" or "license" for more information. >>>
Преобразование IP-адреса из десятично-точечного в двоичный
Попрактикуемся в преобразовании одного десятичного числа в его двоичную форму. Мы будем использовать встроенную функцию Python
bin(). Например, чтобы преобразовать число192, введите следующее в приглашении Python:bin(192)Python вернет двоичное представление с префиксом
0b, указывающим, что это двоичное число.'0b11000000'Двоичный эквивалент
192—11000000.Теперь применим это к полному IP-адресу, например,
192.168.1.10. Нам нужно преобразовать каждый октет (192,168,1и10) по отдельности. Важное правило в IP-адресации заключается в том, что каждый октет должен быть представлен ровно 8 битами. Если двоичное число имеет менее 8 бит, его необходимо дополнить ведущими нулями.Преобразуем каждую часть:
- Для
192:bin(192)дает'0b11000000'. Это уже 8 бит:11000000. - Для
168:bin(168)дает'0b10101000'. Это также 8 бит:10101000. - Для
1:bin(1)дает'0b1'. Мы должны дополнить его до 8 бит:00000001. - Для
10:bin(10)дает'0b1010'. Мы должны дополнить его до 8 бит:00001010.
Объединив их, вы получите полное 32-битное двоичное представление IP-адреса
192.168.1.10:11000000.10101000.00000001.00001010- Для
Преобразование двоичного IP-адреса обратно в десятично-точечный
Теперь выполним обратную операцию. Для преобразования двоичного числа в десятичное мы будем использовать функцию Python
int(). Эта функция может принимать два аргумента: первый — число в виде строки, а второй — основание этой системы счисления. Поскольку мы преобразуем из двоичной системы (основание 2), мы всегда будем использовать2в качестве второго аргумента.Попробуем преобразовать один двоичный октет,
10101000, в десятичный.int('10101000', 2)Python выполнит преобразование и отобразит десятичный результат.
168Теперь преобразуем полный 32-битный двоичный IP-адрес из предыдущего шага:
11000000.10101000.00000001.00001010. Вам нужно будет преобразовать каждый 8-битный октет по одному.- Преобразуем первый октет:
int('11000000', 2), что дает192. - Преобразуем второй октет:
int('10101000', 2), что дает168. - Преобразуем третий октет:
int('00000001', 2), что дает1. - Преобразуем четвертый октет:
int('00001010', 2), что дает10.
Объединив эти результаты с точками, вы получите исходный десятично-точечный IP-адрес:
192.168.1.10. Это подтверждает правильность ваших преобразований в обоих направлениях.- Преобразуем первый октет:
Перевод CIDR-маски подсети в ее двоичную и десятично-точечную форму
Маска подсети — это 32-битное число, которое отличает сетевую часть IP-адреса от части хоста. CIDR (Classless Inter-Domain Routing — бесклассовая междоменная маршрутизация) — это сокращенный способ представления маски подсети.
Например, обозначение CIDR /24 означает, что первые 24 бита 32-битной маски подсети равны 1, а оставшиеся биты — 0.
Определим двоичное и десятично-точечное представление для маски подсети
/24.- Двоичное: Маска
/24имеет 24 последовательных1, за которыми следуют32 - 24 = 80. При разбиении на октеты она выглядит так:11111111.11111111.11111111.00000000
- Двоичное: Маска
Теперь преобразуем эту двоичную маску в ее десятично-точечную форму. Первый октет состоит из одних единиц,
11111111.int('11111111', 2)Результатом будет
255. Последний октет состоит из одних нулей,00000000.int('00000000', 2)Результатом будет
0. Следовательно, маска подсети/24в десятично-точечной нотации —255.255.255.0.Попробуем более сложный пример, например,
/26.- Двоичное: Маска
/26имеет 261, за которыми следуют32 - 26 = 60.11111111.11111111.11111111.11000000 - Первые три октета состоят из одних
1, что, как мы знаем, равно255. Преобразуем последний октет,11000000, в десятичное число.
int('11000000', 2)Результатом будет
192. Таким образом, маска подсети/26в десятично-точечной нотации —255.255.255.192.- Двоичное: Маска
После завершения преобразований вы можете выйти из интерпретатора Python и вернуться в обычное приглашение терминала, введя
exit()и нажав Enter.exit()
Теперь вы освоили двустороннее преобразование между десятично-точечными и двоичными IP-адресами, а также CIDR-масками подсети — это ключевой навык для любого сетевого специалиста.
Определение сетевой и хостовой частей IP-адреса
На этом этапе вы примените свои знания масок подсети для определения сетевой и хостовой частей заданного IP-адреса. Основная функция маски подсети заключается в том, чтобы сообщить компьютеру, какая часть IP-адреса идентифицирует сеть, а какая — конкретное устройство (хост) в этой сети.
Это достигается с помощью побитовой логической операции AND. Компьютер берет IP-адрес (в двоичном виде) и маску подсети (в двоичном виде) и выполняет над ними операцию AND. Результатом является сетевой адрес.
Правила для побитового AND просты:
1 AND 1 = 11 AND 0 = 00 AND 1 = 00 AND 0 = 0
По сути, результат равен 1 только в том случае, если оба соответствующих бита равны 1.
Давайте рассмотрим практический пример, чтобы увидеть это в действии. Мы определим сетевой адрес для IP-адреса 192.168.1.74 с маской подсети /26 (255.255.255.192). Вместо того чтобы делать это вручную в интерпретаторе, мы напишем небольшой скрипт на Python для выполнения расчета.
Сначала создайте новый файл скрипта Python с именем
network_calc.pyв вашем каталоге проекта с помощью редактораnano.nano ~/project/network_calc.pyВ редакторе
nanoскопируйте и вставьте следующий код Python. Этот скрипт определяет IP-адрес и маску, выполняет операциюANDдля каждого октета и выводит результат.## Define the IP address and subnet mask octets ip = [192, 168, 1, 74] mask = [255, 255, 255, 192] ## Calculate the network address using a bitwise AND network_addr = [ip[i] & mask[i] for i in range(4)] ## Format the output strings ip_str = ".".join(map(str, ip)) network_str = ".".join(map(str, network_addr)) print(f"IP Address: {ip_str}") print(f"Subnet Mask: /26 (255.255.255.192)") print(f"Network Address: {network_str}")Сохраните файл и выйдите из
nano, нажавCtrl+O, затемEnter, и наконецCtrl+X.Теперь запустите ваш скрипт из терминала.
python3 ~/project/network_calc.pyВы увидите следующий вывод, который наглядно демонстрирует результат операции
AND:IP Address: 192.168.1.74 Subnet Mask: /26 (255.255.255.192) Network Address: 192.168.1.64
Из этого вывода мы можем выделить различные части:
- Сетевая часть (Network Portion): Маска
/26указывает, что первые 26 бит являются сетевой частью. ВычисленныйNetwork Address(192.168.1.64) является идентификатором этой конкретной сети. - Хостовая часть (Host Portion): Оставшиеся
32 - 26 = 6бит являются хостовой частью. Эти 6 бит идентифицируют конкретное устройство (.74) в сети192.168.1.64.
Вы успешно использовали скрипт для поиска сетевого адреса и теперь можете концептуально различать сетевую и хостовую части IP-адреса.
Расчет доступных хостов и подсетей для заданного CIDR
На этом заключительном этапе вы научитесь выполнять два важных расчета подсетей: определение количества доступных IP-адресов хостов в подсети и выяснение того, сколько подсетей можно создать из большего сетевого блока. Эти расчеты являются основополагающими для планирования и проектирования сетей.
Вот ключевые формулы:
- Количество доступных хостов: Формула
2^n - 2, гдеn— количество хостовых битов (нули в маске подсети). Мы вычитаем 2, потому что первый адрес в подсети (где все хостовые биты равны 0) зарезервирован как сетевой адрес, а последний адрес (где все хостовые биты равны 1) зарезервирован как широковещательный адрес (Broadcast Address). Ни один из них не может быть назначен устройству. - Количество подсетей: Это рассчитывается, когда вы делите большую сеть (например,
/24) на меньшие (например,/26). Формула2^m, гдеm— количество битов, которые вы "одолжили" из исходной хостовой части для создания новой, более специфичной маски подсети.
Давайте улучшим наш скрипт network_calc.py для выполнения этих расчетов.
Сначала откройте файл
network_calc.pyснова с помощью редактораnano.nano ~/project/network_calc.pyУдалите существующее содержимое и замените его следующим кодом Python. Эта новая версия фокусируется на расчете количества хостов и подсетей на основе заданного префикса CIDR.
## Define the CIDR prefix and the base network prefix cidr_prefix = 26 base_prefix = 24 ## The original network we are subnetting from (e.g., a /24) ## --- Calculations --- ## 1. Calculate host bits host_bits = 32 - cidr_prefix ## 2. Calculate usable hosts ## The ** operator is for exponentiation (power of) if host_bits > 0: total_hosts = 2**host_bits usable_hosts = total_hosts - 2 else: total_hosts = 1 usable_hosts = 1 ## For /31 and /32, rules are different, but we simplify here ## 3. Calculate subnet bits borrowed subnet_bits = cidr_prefix - base_prefix ## 4. Calculate number of subnets if subnet_bits >= 0: num_subnets = 2**subnet_bits else: num_subnets = "N/A (Prefix is smaller than base)" ## --- Output --- print(f"--- Subnet Calculations for a /{cidr_prefix} Network ---") print(f"Host Bits: {host_bits}") print(f"Total Hosts per Subnet: 2^{host_bits} = {total_hosts}") print(f"Usable Hosts per Subnet: {total_hosts} - 2 = {usable_hosts}") print("") ## Adds a blank line for readability print(f"--- Subnetting from a /{base_prefix} Network ---") print(f"Subnet Bits Borrowed: {subnet_bits}") print(f"Number of Subnets Created: 2^{subnet_bits} = {num_subnets}")Сохраните файл и выйдите из
nano, нажавCtrl+O,EnterиCtrl+X.Запустите обновленный скрипт из вашего терминала.
python3 ~/project/network_calc.pyСкрипт теперь выведет рассчитанные значения:
--- Subnet Calculations for a /26 Network --- Host Bits: 6 Total Hosts per Subnet: 2^6 = 64 Usable Hosts per Subnet: 64 - 2 = 62 --- Subnetting from a /24 Network --- Subnet Bits Borrowed: 2 Number of Subnets Created: 2^2 = 4
Этот вывод наглядно показывает, что для сети /26 имеется 6 хостовых битов, что позволяет получить 2^6 = 64 общих адреса. После резервирования сетевого адреса и широковещательного адреса остается 62 доступных хоста. Он также показывает, что если вы начали с сети /24, вы одолжили 2 бита для создания маски /26, что приводит к 2^2 = 4 возможным подсетям.
Резюме
В этой лабораторной работе вы научились выполнять основные расчеты IP-адресов и подсетей непосредственно в терминале Linux. Вы использовали интерактивный интерпретатор Python как мощный инструмент для преобразования IP-адресов из удобочитаемого формата с десятичными точками в их 32-битный двоичный эквивалент и обратно. Это включало преобразование каждого октета по отдельности и обеспечение правильного 8-битного дополнения. Вы также отработали перевод обозначения маски подсети CIDR в ее полную двоичную форму и форму с десятичными точками.
Опираясь на эти навыки преобразования, вы применили их для выполнения основных задач сетевого анализа. Вы научились различать сетевую и хостовую части IP-адреса, используя маску подсети. Наконец, вы выполнили необходимые расчеты для определения количества доступных хостовых адресов и общего количества подсетей для сети на основе ее заданного префикса CIDR, что укрепило ваше понимание принципов подсетей IP.



