Протокол IP

На данный момент ИТ индустрия в основном до сих пор пользуется наработками 80-90-х готов прошлого столетия1) - большая часть инернета работает по старым правилам. Компьютер, как таковой, ничего не понимает в буквах, если ему не объянить точно и конкретно, однако в свою очередь он замечательно работает с цифрами, поэтому для идентификации оборудования в интернете было принято решение использовать IP-адреса2). На заре сетевых технологий было предложено и даже какое-то время использовалось много интересных способов идентификации оборудования в компьютерных сетях, однако особое распространение получил протокол IPv4. В данной статье о нём стоит лишь упомянуть, что в глобальном интернете (да и локальном интранете) за каждым узлом связи, будь то сервер, сетевое оборудование или ещё что-то, что умеет работать по сети, закреплено число. Как в старой доброй фиксированной телефонной связи. Более 30 лет назад был разумно сделан выбор в пользу 32-битного числа3), однако никто не мог предположить взрывного роста интернета и буквально к 2016-2018 году индустрия подошла к тому, что адресное пространство IPv4 закончилось. Чуть раньше люди уже начали думать о других протоколах и так появился IPv6. В нём много своих нововведений, он требует упредёлнной настройки сетевого оборудования, но в конечном итоге ограничение в 32 бита было расширено до 128, в надежде, что вот теперь уж точно хватит всем.

Но вернёмся к IPv4. Поскольку число с десятью позициями не очень удобно читать - была придумана специальная нотация, которая позволяет несколько проще запомнить и передать адрес, а именно - этот номер был разбит на октеты4). Таким образом вместо 2130706433 используют следующую нотацию 127.0.0.1. Каждый октет отвечает за свою группу бит. Если перевести IP-нотацию в двоичный код - можно увидеть следующее

   127  .    0   .    0   .    1
01111111.00000000.00000000.00000001

Теперь если убрать точки в двоичном представлении и перевести в десятеричное - мы полчуим искомое число 2130706433.

То же самое применительно и к относительно новому протоколу IPv6, только вместо 32 бит здесь используется 128 и некоторые хитрые удобства по сокращению адреса5) Классический локальный адрес IPv6 выглядит следующим образом fe80::, но в полном виде он выглядит как fe80:0:0:0:0:0:0:0, а если его перевести теперь в двоичный вид - мы получим достаточно большое число6)

fe80    1111111010000000 .
0       0000000000000000 .
0       0000000000000000 .
0       0000000000000000 .
0       0000000000000000 .
0       0000000000000000 .
0       0000000000000000 .
0       0000000000000000

Я разместил адрес вертикально, чтобы избежать переноса строки.

Разделение адресного пространства

Поскольку четыре миллиарда достаточно большое число - было принято решение как-то поделить его логически на более мелкие части. И здесь снова в ход пустили двоичные исчисления7), а именно такое понятие как маска. Если немного вспомнить двоичную алгебру - там есть операция логического умножения, которая ещё называется операция И8). Суть её сводится к тому, что при умножении одного двоичного числа на другое в каждой позиции в результирующем числе единица будет только в том случае, если в обоих множителях в этой позиции единица. В противном случае будет ноль. Простой пример:

10101110
11110000
--------
10100000

А теперь применяем только что полученные знания к технологии IP и получаем очень удобный инструмент сегментирования большого адресного пространства. Мы будем рассматривать только IPv4, но все, рассказанное в этом параграфе применимо и для IPv6, просто в большем масштабе9) Итак, у нас есть 32-битное число, разбитое на октеты, но в случае с маской это не особенно важно, поскольку в основном разбиение на октеты служит скорее для удобства конечного пользователя, нежели для какой-то программной цели.

Примером самой распростарнённой маски является 255.255.255.0 - которое при переводе в двоичную систему раскрывается в

11111111.11111111.11111111.00000000

Теперь взяв в руки IP-адрес и маску мы можем получить три важнейших элемента в работе IPv410) - адрес сети, широковещательный адрес и количество доступных адресов внутри данного блока11). Так же существуют и другие маски, такие как 255.255.254.0, 255.255.248.0, 255.0.0.0 и многие, многие другие. Главное, что следует запомнить - в маске подсети все включённые биты слева идут подряд и не могут прерываться. Отсюда следует, что вместо длинной нотации, указанной выше, можно использовать коротку, которая называется перфикс сети и записывается числом от 0 до 32. По сути префикс показывает количество включённых бит с левой стороны. Для маски 255.255.255.0 префиксом будет 24.

Теперь пример работы с префиксами, масками и адресами. Например у нашего компьютера в домашней сети адрес 192.168.12.5/24 - исходя из этого мы можем получить следующую информацию:

Адрес сети:

   192   .    168   .    12    .    5
11000000 . 10101000 . 00001010 . 00000101
   255   .    255   .    255   .    0
11111111 . 11111111 . 11111111 . 00000000

   192   .    168   .    12    .    0
11000000 . 10101000 . 00001010 . 00000000

Количество адресов в сети (здесь требуется отнять от общего числа адресов нашу маску):

   255   .    255   .    255   .    255
11111111 . 11111111 . 11111111 . 11111111
   255   .    255   .    255   .    0
11111111 . 11111111 . 11111111 . 00000000

    0          0          0         255
00000000 . 00000000 . 00000000 . 11111111

Широковещательным адресом является последний адрес в подсети. Вычисляется так же очень просто - адрес подсети + количество адресов в подсети. Сам широковещательный адрес служит для отправки информации на все узлы.

1)
что в целом не является чем-то плохим
2)
мы не будем сейчас углубляться в теорию по сетям, стэк модели OSI и прочие интересные вещи, просто надо принять как данность
3)
это на секундочку более 4 миллиардов номеров
4)
октет - восемь бит
5)
например можно сокращать идущие подряд пустые блоки адреса
6)
которым можно описать все звёзды в нашей вселенной и ещё останется, по заявлениям разработчиков протокола
7)
как бы это не было очевидно, но в компьютерах двоичные исчесления самое оно
8)
AND
9)
128 бит вместо 32
10)
в IPv6 некоторые элементы из списка не важнейшие, оно работает несколько иначе
11)
тут есть одна хитрость, на самом деле количество доступных для назначения IP-адресов на 2 меньше, чем описывает маска, поскольку адрес сети и широковещательный адрес исключаются