Как записывается ip адрес: IP-адрес компьютера — урок. Информатика, 9 класс.

Система учета IP-адресов / Хабр

В своей практической деятельности нам довольно часто приходится сталкиваться с проблемой рационального распределения блоков IP-адресов. Распределение адресов между тысячами клиентов представляет собой достаточно сложную задачу. В этой статье мы бы хотели поделиться собственным опытом ее решения.

Немного о принципах IP-адресации


Прежде чем говорить о проблемах деления адресного пространства, вспомним основные принципы IPv4-адресации. IPv4-адрес представляет собой набор из 32 бит (единиц и нулей). Человеку прочесть и запомнить двоичный IP-адрес достаточно сложно. Поэтому 32 бита разделяются на четыре байта — так называемые октеты. Чтобы облегчить понимание, все октеты записываются в десятичной форме. Каждый IPv4-адрес состоит из двух частей: первая идентифицирует сеть, а вторая — узел в сети. Такая адресация называется иерархической: первая часть адреса идентифицирует всю сеть, в которой находятся все уникальные адреса. Маршрутизаторам нужно знать лишь путь к каждой сети, а не расположение отдельных узлов.

Чтобы узлы могли определить, где находится сетевая часть, а где — адрес узла, используется маска подсети. Маска подсети присваивается узлу одновременно с IP-адресом.Она представляет собой набор из 32 бит, в котором единицы соответствуют сетевой части, а нули — адресу узла. Сегодня широкое распространение получила запись IP-адресов в так называеой префиксной, или CIDR-нотации. Маска в такой записи указывается в виде числа после косой черты. Например, маска 255.255.255.0 в двоичном виде будет выглядеть так: 11111111.11111111.11111111.00000000. Количество единиц равняется 24, а маска записывается как /24.

Проблемы ручного выделения


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

Во-вторых, необходимость выделять подсети разных размеров тоже приводит к различным трудностям.В качестве примера возможной проблемной ситуации можно привести случай, когда клиенту выделяется подсеть /27 или /28, из которой уже выделен блок /29. Можно ли как-то автоматизировать процесс выделения адресов, чтобы вообще избежать ошибок? Размышляя над этим вопросом, мы нашли свое решение, которое отлично работает благодаря хорошей визуализации.

Дерево интервалов и таблица свободных подсетей


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

Алгоритм поиска свободной подсети можно описать так. Предположим, что клиент просит выделить подсеть /27. Сначала нужно убедиться в том, что имеющийся пул по размеру больше, чем эта подсеть. (32-x), где x — префикс подсети).

Используя ранее построенное дерево интервалов, мы можем быстро определить, перекрывает ли нужная клиенту подсеть, представленная в виде интервала, ранее выделенные подсети. Подсеть 127.0.0.0/27 в нашем примере перекрывает одну выделенную подсеть /29. Затем берется интервал, следующий за ней — 127.0.0.32/27. Мы проверяем его на пересечение с другими, и он оказывается свободен. После этого он предоставляется клиенту и помечается как занятый. Вся информация о свободных подсетях наглядно отображается в виде следующей таблице (зеленым цветом обозначены свободные подсети, синим — занятые, а серым — подсети, которые содержат уже занятые подсети более мелкого размера и поэтому не могут быть использованы):

Чтобы ускорить поиск свободной подсети в пулах большого размера, можно проходить интервал циклом с разных сторон. Однако в таком случае масштабы фрагментации будут больше, и могут возникнуть проблемы с выделением крупных подсетей. Если мы нашли пересечение с подсетью большего размера (по сравнению с запрошенной клиентом), то мы можем следующий шаг цикла начать с ее конца, так как внутри этого интервала все равно отсутствуют свободные подсети.

Заключение


Предлагаемое нами решение по распределению IP-адресов делает управление адресным пространством более простым и, что немаловажно, более рациональным.

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

Читателей, не имеющих возможности комментировать посты на Хабре, приглашаем к нам в блог.

Информатика — Задание 12. Задачи для самостоятельного решения

12.1  (ege.yandex.ru-1) В терминологии сетей TCP/IP маской сети  называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. Обычно маска записывается по тем же правилам, что и IP-адрес.  Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.

По заданным  IP-адресу узла и маске  определите адрес сети.

IP –адрес узла:          217.9.191.133

Маска:                        255.255.192.0

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

A

B

C

D

E

F

G

H

0

9

16

64

128

142

192

217

 

Пример.   Пусть искомый IP-адрес  192.168.128.0, и дана таблица

A

B

C

D

E

F

G

H

128

168

255

8

127

0

17

192

В этом случае правильный ответ будет записан в виде: HBAF

12. 2  (ege.yandex.ru-2) В терминологии сетей TCP/IP маской сети  называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. Обычно маска записывается по тем же правилам, что и IP-адрес.  Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.

IP –адрес узла:               217.8.162.162

Маска:                 255.255.224.0

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

A

B

C

D

E

F

G

H

0

8

16

64

128

160

162

217

 Пример.

Пусть искомый IP-адрес  192.168.128.0, и дана таблица

A

B

C

D

E

F

G

H

128

168

255

8

127

0

17

192

В этом случае правильный ответ будет записан в виде: HBAF
12. 3 ( ege.yandex.ru-3) В терминологии сетей TCP/IP маской сети  называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. Обычно маска записывается по тем же правилам, что и IP-адрес.  Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.

IP –адрес узла:                 224.9.195.133

Маска:                              255.255.192.0

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

A

B

C

D

E

F

G

H

0

9

16

128

133

192

195

224

Пример.

Пусть искомый IP-адрес  192.168.128.0, и дана таблица

A

B

C

D

E

F

G

H

128

168

255

8

127

0

17

192

В этом случае правильный ответ будет записан в виде: HBAF

Решение Адрес сети имеет вид 224. 9.X.0, где X получается обнулением 5 младших двоичных  разрядов в числе 195 (потому, что в числе 192 = 255-63 = 255 – (26 – 1) есть 6-1 = 4 нулевых разрядов). Найдем остаток от деления 195 на 64 – это покажет, на сколько уменьшится число 195 при обнулении 5 младших разрядов. Можно поделить с остатком:

195:64 = 3 (3 ост). Можно, не деля, сообразить, что, так как 192 делится на 64, то в остатке получится 3. Таким образом, после обнуления 5 младших разрядов в числе 195 мы получим 165-3 = 3*64 = 192. То есть, X = 192.

Адрес узла сети:         224.9.192.0

Остается записать буквы вместо значений чисел, пользуясь таблицей из условия задачи.

Ответ: HBFA

Замечание. Другие варианты  решения, в том числе, записанные более  подробно рассмотрены при разборе примера задания

 

12.4 ( ege.yandex.ru-4) В терминологии сетей TCP/IP маской сети  называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. Обычно маска записывается по тем же правилам, что и IP-адрес.  Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.

IP –адрес узла:               224.12.78.162

Маска:                 255.255.224.0

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

A

B

C

D

E

F

G

H

0

12

64

128

144

160

224

230

Пример.  Пусть искомый IP-адрес  192.168.128.0, и дана таблица

A

B

C

D

E

F

G

H

128

168

255

8

127

0

17

192

В этом случае правильный ответ будет записан в виде: HBAF

Решение Адрес сети имеет вид 224. 12.X.0, где X получается обнулением 4 младших двоичных  разрядов в числе 78 (потому, что в двоичной записи числа 224 = 255-31 = 255 – (25 – 1) есть 5-1 = 4 нулевых разрядов). Найдем остаток от деления 78 на 32 – это покажет, насколько уменьшится число 78 при обнулении 4 младших разрядов. При делении получаем:   78 : 32 = 2 (14 ост), т.е. 78 = 2*32+14. Таким образом, после обнуления 4 младших разрядов в двоичной записи числа 78 мы получим 78 — 14 = 2*32 = 64. То есть, X = 64.

Адрес узла сети:         224.12.64.0

Остается записать буквы вместо значений чисел, пользуясь таблицей из условия задачи.

Ответ: GBCA

Замечание. Другие варианты  решения, в том числе, записанные более  подробно рассмотрены при разборе примера задания. Если что непонятно, полезно посмотреть сюда.

 

 

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

IP –адрес узла:               224.8.230.162

Маска:                                255.255.224.0

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

A

B

C

D

E

F

G

H

8

64

230

224

160

144

128

0

Пример.

Пусть искомый IP-адрес  192.168.128.0, и дана таблица

A

B

C

D

E

F

G

H

128

168

255

8

127

0

17

192

В этом случае правильный ответ будет записан в виде: HBAF

Решение Адрес сети имеет вид 224. 8.X.0, где X получается обнулением 4 младших двоичных  разрядов в числе 230 (потому, что в двоичной записи числа 224 = 255-31 = 255 – (25 – 1) есть 5-1 = 4 нулевых разрядов). Найдем остаток от деления 230 на 32 – это покажет, насколько уменьшится число 230 при обнулении 4 младших разрядов. При делении получаем:   230 : 32 = 7 (6 ост), т.е. 230 = 7*32+6. Таким образом, после обнуления 4 младших разрядов в двоичной записи числа 230 мы получим 230 — 6 = 7*32 = 224. То есть, X = 224.

Проверка
224 = 128+64+32 = 27 + 26 + 25                            = 1110 00002
230 = 224+6 = 224+4+2 = 27 + 26 + 25+ 22 + 21 =  1110 01102

Выполним поразрядную конъюнкцию:

1110 00002
1110 01102
———————
1110 00002 =  224

Адрес узла сети:         224. 8.224.0

Остается записать буквы вместо значений чисел, пользуясь таблицей из условия задачи.

Ответ: DADH

Замечание. Найти остаток от деления 230 на 32 можно найти и без выполнения деления. Достаточно заметить, что (1) 224 делится на 32 и (2) 230 – 224 = 6 < 32. Поэтому остаток от деления 230 на 32 равен 6, а X = 224.

Другие варианты  решения, в том числе, записанные более  подробно рассмотрены при разборе примера задания. Если что непонятно, полезно посмотреть сюда.

 

Введение в модуль ipaddress — документация по Python 3.11.4

автор

Питер Муди

автор

Ник Коглан

Обзор

Этот документ представляет собой краткое введение в
модуль ipaddress . Он предназначен в первую очередь для пользователей, которые не
уже знакомы с терминологией IP-сетей, но также могут быть полезны
сетевым инженерам, которым нужен обзор того, как IP-адрес
представляет концепции адресации IP-сети.

Создание адресных/сетевых/интерфейсных объектов

Поскольку ipaddress — это модуль для проверки и управления IP-адресами,
Первое, что вам нужно сделать, это создать несколько объектов. Вы можете использовать
IP-адрес для создания объектов из строк и целых чисел.

Примечание по версиям IP

Для читателей, не особо знакомых с IP-адресацией,
важно знать, что Интернет-протокол (IP) в настоящее время находится в процессе
перехода от версии 4 протокола к версии 6. Этот переход
происходит в основном из-за того, что версия 4 протокола не обеспечивает достаточно
адреса для удовлетворения потребностей всего мира, особенно с учетом
увеличение количества устройств с прямым подключением к Интернету.

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

IP-адреса узлов

Адреса, часто называемые «адресами хоста», являются основной единицей измерения.
при работе с IP-адресацией. Самый простой способ создания адресов
использовать ipaddress.ip_address() заводская функция, которая автоматически
определяет, создавать ли адрес IPv4 или IPv6 на основе переданного
значение:

 >>> ipaddress.ip_address('192.0.2.1')
IPv4-адрес('192.0.2.1')
>>> ipaddress.ip_address('2001:DB8::1')
IPv6-адрес('2001:db8::1')
 

Адреса также могут быть созданы непосредственно из целых чисел. Ценности, которые будут
умещаться в пределах 32 бит, предполагается, что это IPv4-адреса:

 >>> ipaddress.ip_address(3221225985)
IPv4-адрес('192.0.2.1')
>>> ipaddress.ip_address(42540766411282592856

4951653826561) IPv6-адрес('2001:db8::1')

Чтобы принудительно использовать адреса IPv4 или IPv6, соответствующие классы могут быть
вызывается напрямую. Это особенно полезно для принудительного создания IPv6.
адреса для небольших целых чисел:

 >>> ipaddress.ip_address(1)
IPv4-адрес('0.0.0.1')
>>> ipaddress.IPv4Address(1)
IPv4-адрес('0.0.0.1')
>>> ipaddress.IPv6Address(1)
IPv6-адрес('::1')
 

Определение сетей

Адреса узлов обычно группируются в IP-сети, поэтому
IP-адрес позволяет создавать, проверять и управлять сетью.
определения. Сетевые IP-объекты создаются из строк, определяющих
диапазон адресов хостов, которые являются частью этой сети. Самая простая форма
для этой информации используется пара «сетевой адрес/сетевой префикс», где
префикс определяет количество начальных битов, которые сравниваются для определения
является ли адрес частью сети и сетевой адрес
определяет ожидаемое значение этих битов.

Что касается адресов, то предусмотрена заводская функция, определяющая правильный
IP-версия автоматически:

 >>> ipaddress.ip_network('192.0.2.0/24')
Сеть IPv4('192.0.2.0/24')
>>> ipaddress.ip_network('2001:db8::0/96')
Сеть IPv6('2001:db8::/96')
 

Сетевые объекты не могут иметь установленные биты хоста. Практический эффект от этого
в том, что 192.0.2.1/24 не описывает сеть. Такие определения
называются интерфейсными объектами, поскольку нотация ip-on-a-network
обычно используется для описания сетевых интерфейсов компьютера в данной сети
и описаны далее в следующем разделе.

По умолчанию попытка создать сетевой объект с установленными битами хоста приведет к
в результате возникает ошибка ValueError . Просить, чтобы
дополнительные биты вместо этого обнуляются, флаг strict=False может
передать конструктору:

 >>> ipaddress.ip_network('192.0.2.1/24')
Traceback (последний последний вызов):
   ...
ValueError: 192.0.2.1/24 имеет установленные биты хоста
>>> ipaddress.ip_network('192.0.2.1/24', strict=False)
Сеть IPv4('192.0.2.0/24')
 

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

 >>> ipaddress. ip_network(3221225984)
Сеть IPv4('192.0.2.0/32')
>>> ipaddress.ip_network(42540766411282592856

4951653826560) Сеть IPv6('2001:db8::/128')

Как и в случае с адресами, создание определенного типа сети может быть принудительным.
путем прямого вызова конструктора класса вместо использования фабрики
функция.

Хост-интерфейсы

Как упоминалось выше, если вам нужно описать адрес на определенном
сети, ни адреса, ни сетевых классов недостаточно.
Обозначения типа 192.0.2.1/24 обычно используются сетевыми инженерами и
люди, которые пишут инструменты для брандмауэров и маршрутизаторов как сокращение от «хост-сервер».
192.0.2.1 в сети 192.0.2.0/24 », Соответственно ipaddress
предоставляет набор гибридных классов, которые связывают адрес с определенным
сеть. Интерфейс для создания идентичен интерфейсу для определения сети.
объекты, за исключением того, что адресная часть не ограничена сетью
адрес.

 >>> ipaddress. ip_interface('192.0.2.1/24')
IPv4Интерфейс('192.0.2.1/24')
>>> ipaddress.ip_interface('2001:db8::1/96')
IPv6Interface('2001:db8::1/96')
 

Принимаются целочисленные входные данные (как в сетях) и использование определенного IP-адреса.
version можно принудительно вызвать, напрямую вызвав соответствующий конструктор.

Проверка адресных/сетевых/интерфейсных объектов

Вы потрудились создать IPv(4|6)(Адрес|Сеть|Интерфейс)
объект, поэтому вы, вероятно, хотите получить информацию о нем. IP-адрес
пытается сделать это простым и интуитивно понятным.

Извлечение версии IP:

 >>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> addr6 = ipaddress.ip_address('2001:db8::1')
>>> адрес6.версия
6
>>> адрес4.версия
4
 

Получение сети с интерфейса:

 >>> host4 = ipaddress.ip_interface('192.0.2.1/24')
>>> хост4.сеть
Сеть IPv4('192.0.2.0/24')
>>> host6 = ipaddress.ip_interface('2001:db8::1/96')
>>> host6.network
Сеть IPv6('2001:db8::/96')
 

Определение количества отдельных адресов в сети:

 >>> net4 = ipaddress. ip_network('192.0.2.0/24')
>>> net4.num_addresses
256
>>> net6 = ipaddress.ip_network('2001:db8::0/96')
>>> net6.num_addresses
4294967296
 

Перебор «полезных» адресов в сети:

 >>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> для x в net4.hosts():
... печать (х)
192.0.2.1
192.0.2.2
192.0.2.3
192.0.2.4
...
192.0.2.252
192.0.2.253
192.0.2.254
 

Получение сетевой маски (т.е. установка битов, соответствующих сетевому префиксу) или
маска хоста (любые биты, которые не являются частью сетевой маски):

 >>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> net4.сетевая маска
IPv4-адрес('255.255.255.0')
>>> net4.hostmask
IPv4-адрес('0.0.0.255')
>>> net6 = ipaddress.ip_network('2001:db8::0/96')
>>> net6.сетевая маска
IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::')
>>> net6.hostmask
IPv6-адрес('::ffff:ffff')
 

Распаковка или сжатие адреса:

 >>> addr6.exploded
'2001:0db8:0000:0000:0000:0000:0000:0001'
>>> addr6.сжатый
'2001:db8::1'
>>> net6. взорвался
'2001:0db8:0000:0000:0000:0000:0000:0000/96'
>>> net6.сжатый
'2001:db8::/96'
 

Хотя IPv4 не поддерживает расширение или сжатие, связанные объекты
по-прежнему предоставлять соответствующие свойства, чтобы код, не зависящий от версии, мог
легко убедиться, что для IPv6 используется самая краткая или самая подробная форма
адреса, по-прежнему корректно обрабатывая адреса IPv4.

Сети как списки адресов

Иногда полезно рассматривать сети как списки. Это значит, что можно
индексировать их так:

 >>> сеть4[1]
IPv4-адрес('192.0.2.1')
>>> сеть4[-1]
IPv4-адрес('192.0.2.255')
>>> сеть6[1]
IPv6-адрес('2001:db8::1')
>>> сеть6[-1]
IPv6-адрес('2001:db8::ffff:ffff')
 

Это также означает, что сетевые объекты поддаются использованию списка
Синтаксис проверки членства выглядит следующим образом:

 если адрес в сети:
    # сделай что-нибудь
 

Тестирование сдерживания выполняется эффективно на основе сетевого префикса:

 >>> addr4 = ipaddress. ip_address('192.0.2.1')
>>> addr4 в ipaddress.ip_network('192.0.2.0/24')
Истинный
>>> addr4 в ipaddress.ip_network('192.0.3.0/24')
ЛОЖЬ
 

Сравнения

ipaddress предоставляет несколько простых, надеюсь, интуитивно понятных способов сравнения
объектов, где это имеет смысл:

 >>> ipaddress.ip_address('192.0.2.1') ​​< ipaddress.ip_address('192.0.2.2')
Истинный
 

Исключение TypeError возникает при попытке сравнить объекты
разные версии или разные типы.

Использование IP-адресов с другими модулями

Другие модули, использующие IP-адреса (такие как сокет ), обычно не будут
принимать объекты из этого модуля напрямую. Вместо этого их нужно принуждать к
целое число или строка, которую примет другой модуль:

 >>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> ул(адрес4)
«192.0.2.1»
>>> интервал (адрес4)
3221225985
 

Получение дополнительных сведений при сбое создания экземпляра

При создании адресных/сетевых/интерфейсных объектов с использованием независимого от версии
заводские функции, о любых ошибках будет сообщено как ValueError с
общее сообщение об ошибке, в котором просто говорится, что переданное значение не было
распознается как объект этого типа. Отсутствие конкретной ошибки
потому что необходимо знать, является ли значение предполагаемым IPv4
или IPv6, чтобы предоставить более подробную информацию о том, почему он был отклонен.

Для поддержки случаев использования, когда полезно иметь доступ к этому дополнительному
детали, конструкторы отдельных классов фактически поднимают
ValueError подклассы ipaddress.AddressValueError и
ipaddress.NetmaskValueError , чтобы точно указать, какая часть
определение не удалось правильно проанализировать.

Сообщения об ошибках становятся значительно более подробными при использовании
конструкторы класса напрямую. Например:

 >>> ipaddress.ip_address("192.168.0.256")
Traceback (последний последний вызов):
  ...
ValueError: «192.168.0.256» не является адресом IPv4 или IPv6.
>>> ipaddress.IPv4Address("192.168.0.256")
Traceback (последний последний вызов):
  ...
ipaddress.AddressValueError: октет 256 (> 255) не разрешен в «192. 168.0.256»
>>> ipaddress.ip_network("192.168.0.1/64")
Traceback (последний последний вызов):
  ...
ValueError: «192.168.0.1/64» не является сетью IPv4 или IPv6.
>>> ipaddress.IPv4Network("192.168.0.1/64")
Traceback (последний последний вызов):
  ...
ipaddress.NetmaskValueError: «64» не является допустимой сетевой маской
 

Тем не менее, оба особых исключения модуля имеют ValueError как их
родительский класс, поэтому, если вас не интересует конкретный тип ошибки,
вы все еще можете написать код, подобный следующему:

 попытка:
    сеть = ipaddress.IPv4Network(адрес)
кроме ValueError:
    print('адрес/сетевая маска недействительны для IPv4:', адрес)
 

Преобразование IP-адресов в двоичные

Системы счисления для выражения чисел имеют основу. База определяет количество уникальных цифр в системе. Мы, люди, используем base-10 десятичная система, которая указывает, что существует только десять уникальных цифр, от 0 до 9. Комбинация этих десяти цифр создает все другие возможные числа.

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

  • 0 = Выкл.
  • 1 = Вкл.

Все остальные двоичные числа создаются с использованием этих двух цифр.

IP-адрес

IP-адрес представляет собой 32-разрядное двоичное число, разделенное на четыре октета, как показано на рисунке 1 ниже.

Рисунок 1. Пример IP-адреса

Маршрутизаторы и коммутаторы видят такие IP-адреса:

  110000.10101000.00000001.00101101  

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

  192.168.1.45  

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

Двоичная математика

В этом уроке мы изучим технику, называемую методом позиционной записи . В двоичных числах каждый последующий бит в группе представляет собой степень двойки, а значения возрастают справа налево. Следовательно, самый правый бит представляет 2 0 , второй самый правый бит представляет 2 1 и т. д., как показано в таблице ниже. Каждый последующий бит слева представляет удвоенное значение. Значение каждой цифры в двоичном числе определяется ее позицией в таблице. Сумма всех этих значений столбца для каждой цифры дает десятичное представление двоичного числа.

902 72 128
Значения каждого бита в октете
8-й бит 7-й бит 6-й бит 5-й бит 4-й бит 3-й бит 2-й бит 1-й бит
2 9024 1 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0
64 32 16 8 4 2 1

Двоичный код в десятичный

Используя эту логику, мы можем легко вычислить десятичное представление двоичного числа, например, 11100011. Мы просто включаем соответствующие биты и вычисляем значение десятичных значений.

902 72 0

Двоичный номер 11100011
8-й бит (128) 7-й бит (64) 6-й бит (32) 5-й бит (16) 4-й бит (8) 3-й бит (4 ) 2-й бит (2) 1-й бит (1)
1 1 1 0 0 1 1

Таблица выше показывает, что биты со значениями 128, 64, 32, 2 и 1 включены. Как упоминалось ранее, вычисление значения двоичного числа означает, что суммирует все значения битов «включено». Таким образом, для двоичного значения в таблице, 11100011, мы сложим вместе 128+64+32+2+1, чтобы получить число 9.0193 227 .

 11100011 = 227 

Следующая анимация показывает несколько примеров преобразования двоичных чисел в десятичные с использованием мощности двух таблиц.

Рисунок 2. Примеры преобразования двоичных чисел в десятичные

Преобразование десятичных чисел в двоичные

Преобразование десятичных чисел в двоичные использует ту же логику. Мы начинаем с десятичного числа, которое хотим преобразовать, и ищем наибольшее значение столбца, которое входит в десятичное число. Затем мы вычитаем значение столбца из исходного числа и повторяем процесс, пока исходное число не станет равным нулю. Рисунок 3 иллюстрирует процесс графически.

Рисунок 3. Преобразование IP-адреса в двоичный

Теперь давайте сделаем еще несколько упражнений, чтобы освоить эту концепцию.

Примеры

На следующем рисунке показано, как мы преобразуем десятичное число 244 в двоичное.

Рисунок 4. Преобразование десятичного числа 244 в двоичное

На следующем рисунке показано, как мы преобразуем десятичное число 55 в двоичное.

Рисунок 5. Преобразование десятичного числа 244 в двоичное

На следующем рисунке показано, как мы преобразуем десятичное число 4 в двоичное.