Раздел: Это нужно знать

Сетевые IPv4 адреса и маски

IP-адрес — это сетевой адрес узла в компьютерной сети. Под «узлом» можно понимать не только компьютер, но и любое другое устройство, которое может иметь IP-адрес — например, маршрутизатор или принтер.
В данной статье я расскажу об IP-адресах, их классификации, о масках подсетей и их использовании.

На данный момент используется два типа IP-адресов: IPv4 и IPv6. В данной статье мы будем говорить об IPv4; для IPv6 посвящена отдельная статья.

IPv4-адрес узла (для сокращения далее — просто IP) состоит из четырёх октетов, разделённых точками. например:

192.168.1.1

В двоичной системе этот адрес будет выглядеть так:

11000000.10101000.00000001.00000001

(О том, как переводить числа из одной системы в другую, см. соответствующую статью; также вы можете это сделать с помощью стандартного калькулятора в Windows в режиме «Programmer»)
Собственно, двоичное число не может начинаться с нуля (если это не сам ноль), но в нашей статье мы будем указывать нули впереди числа для наглядности.

Итак, IP-адрес содержит четыре числа по 8 бит (т.е. по 8 цифр в двоичной системе), общий размер IP-адреса 4х8=32 бита.
Как видите, IP-адрес в общем случае может быть в промежутке от 0.0.0.0 до 255.255.255.255, т.е. в каждом из октетов число может изменяться от 0 до 255, что в двоичной системе будет от 0 (или, если писать наглядно, от 00000000) до 11111111.

Логически, IP-адрес состоит из двух частей: адрес сети, к которой принадлежит этот узел, и непосредственно адрес самого компьютера.
Маской подсети (subnet mask) назвыается битовая маска, определяющая, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. Например, чтобы определить, в какой (под)сети находится узел с адресом 192.168.1.1 и маской подсети 255.255.0.0 нужно побитово (то есть не ко всему числу, а к каждому биту(т.е. цифре) — отдельно) применить операцию «логического и» («AND») к маске подсети и IP-адрему компьютера в двоичной системе. Результатом и будет адрес (под)сети:

11000000.10101000.00000001.00000001 - адрес узла (192.168.1.1)
11111111.11111111.00000000.00000000 - маска подсети (255.255.0.0)
11000000.10101000.00000000.00000000 - сеть, в которой находится узел (192.168.0.0)

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

Теперь, пару слов о том, что такое «сети» и «под-сети». Собственно, никакой топологической разницы между этими понятиями нет, и порой подсеть называют сетью. Я бы сказал, что сеть — это логическое пространство IP-адресов, которое содержит «дочерние» сети (то есть, подсети) и не содержит «родительских» сетей. Например, мы разворачиваем сеть 10.0.0.0, которая содержит в себе подсети
10.1.0.0,
10.2.0.0,
10.3.0.0 итд, причём каждая из подсетей может содержать свои подсети, например:
подсеть 10.1.0.0 может содержать подсети
10.1.1.0,
10.1.2.0,
10.1.3.0, итд.
Выглядеть это будет так:

По IP-адресу в десятичном виде лишь в некоторых случаях можно определить, что этот IP-адрес является адресом сети(подсети), а не узла. В этом случае последний октет, последние два или последние три октета будут оканчиваться на ноль.
Как правило, при создании сетей и их делении на подсети, указывают следующие маски:
255.0.0.0,
255.255.0.0,
255.255.255.0
Эти маски однозначно определяют, какие октеты относятся к адресу сети, а какие — к адресам узлов. В нашем последнем примере, логично предположить, что
сеть с адресом 10.0.0.0 будет иметь маску 255.0.0.0
сети с адресами 10.1.0.0, 10.2.0.0, 10.3.0.0 будут иметь маску 255.255.0.0,
сети с адресами 10.1.1.0, 10.1.2.0, 10.1.3.0 будут иметь маску 255.255.255.0.
Это самый простой случай разделения сетей на подсети.
Без маски, мы не узнаем, какая часть адреса относится к адресу сети, а какая — к адресу узла в этой сети. например, сеть с адресом 10.1.0.0 может иметь маску 255.255.0.0, или 255.255.255.0.
Изначально адресация в сетях TCP/IP осуществлялась на основе классов: первые биты определяли класс сети, а по классу сети можно было сказать — сколько бит было отведено под номер сети и номер узла. Всего существовало 5 классов:

Класс D — Адреса для многоадресной рассылки, класс Е — зарезервирован «кем-то для чего-то» и адреса из этого класса не используются.

IP адреса могут быть публичные(«белые», «общедоступные» итд.) — Public,
и приватные(«серые», «частные», «фейковые», итд.) — Private.
Использование «серых» адресов связано с построением сетей, не видимых в общем пространстве интернета. В пределах одной сети(или подсети) не должно быть узлов с одинаковым IP-адресом. Например, в сети Интернет, чтобы найти чей-то компьютер, или зайти к кому-то на сайт используется уникальный IP-адрес, однозначно идентифицирующий данный ресурс.

В каждом из классов сетей, выделили диапазон «серых» адресов, которые не видны в интернете:

В этой схеме мы видим методы доставки пакетов в сетях:
Unicast - от одного отправителя одному получателю;
Broadcast - от одного узла всему сегменту, или всей сети;
Возможно, вы уже заметили в таблице, описывающей классы сети, что адреса хостов заканчиваются на число «254». Это связано с тем, что адрес, заканчивающийся на «255» (т.е. имеющий все единицы в части адреса узла в IP-адресе) является бродкастом. Этот адрес используется для массовой рассылки пакетов всему сегменту или всей сети и не может быть назначен компьютеру, так же как и адрес сети.
Multicast - многоадресная доставка. Промежуточный вариант между Юникастом и Бродкастом: доставка группе компьютеров, имеющих общий диапазон адресов.

Так же, в этой  схеме, опущена сеть класса А 127.0.0.0, поскольку она тоже давным давно «кем-то и для чего-то» зарезервирована и не используется, как и сети из класса Е.

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

В чем заключается неэффективность классовой адресации?

В том, что мы можем получить всего:
128 сетей класса А, в каждой из которых будет (2^8)*(2^8)*(2^8)=256*256*256=16 777 216 адресов класса А;
(191-127)*256= 16384 сетей класса В, в каждой из которых будет (2^8)*(2^8)=65536 адресов класса В;
(224-192)*256*256=2097152 сетей класса С, в каждой из которых может быть по 2^8=256 адресов;
(240-224)*256*256*256=268435456 адресов многоадресной рассылки (класс D);
(248-240)*256*256*256=134217728 адресов в зарезервированном пространстве Е.

С помощью бесклассовой адресации (т.е. с помощью использования маски) мы можем делить сети на подсети как угодно мелко и чётко. Для этого, определимся сначала с понятием маски CIDR.

Итак, бесклассовая адресация, или CIDR (англ. Classless InterDomain Routing) — это метод IP-адресации, позволяющий гибко управлять пространством IP-адресов, не используя жёсткие рамки классовой адресации.

Запись маски в виде 192.168.1.1 /16 означает, что первые шестнадцать бит данного IP-адреса относятся к адресу сети, а последние, оставшиеся биты (которых будет тоже 16) — к адресу узла в этой сети:
11000000.10101000.00000001.00000001 - адрес узла (192.168.1.1)
11111111.11111111.00000000.00000000 - маска (255.255.0.0)
11000000.10101000.00000000.00000000 - адрес сети, в которой находится узел (192.168.0.0)

Такой способ записи маски (число после слеша) называется записью маски в нотации CIDR (маской в сайдровой нотации).
Как видите, первые шестнадцать бит(цифр) маски — это единицы, определяющие часть адреса сети. Применение классовой адресации позволяло использовать IP-адреса аналогично тому, как мы могли бы использовать маски /8, /16, и /24 (т.е. 255.0.0.0, 255.255.0.0, и 255.255.255.0).
Используя бесклассовую адресацию, мы можем сколь угодно гибко указать, какое число бит относится к адресу сети, а какое- к адресу узла. Например:

192.168.1.1 /9 означает, что в IP-адресе
11000000.10101000.00000001.00000001 (192.168.1.1)
первые девять бит - это адрес сети, т.е.
11111111.10000000.00000000.00000000 (маска 255.128.0.0)
Значит сеть, в которой находится этот узел будет иметь адрес
11000000.10000000.00000000.00000000 (192.128.0.0)

192.64.1.1 /9 означает, что в IP-адресе
11000000.01000000.00000001.00000001 (192.64.1.1)
первые девять бит — это адрес сети, т.е.
11111111.10000000.00000000.00000000 (маска 255.128.0.0)
Значит сеть, в которой находится этот узел будет иметь адрес
11000000.00000000.00000000.00000000 (192.0.0.0)

192.164.26.250 /26 означает, что в IP-адресе
11000000.10100100.00011010.11111010 (192.164.26.250)
первые 25 бит — это адрес сети, т.е.
11111111.11111111.11111111.11000000 (маска 255.255.255.192)
Значит сеть, в которой находится этот узел будет иметь адрес
11000000.10100100.00011010.11000000 (192.164.26.192)

На каждый из октет может приходиться всего 8 различных масок, начиная от 10000000 и заканчивая 11111111. Для каждого октета можно представить таблицу значений этих чисел:


Зная IP-адрес и маску можно определить не только адрес (под)сети, в которой расположен узел, но и адрес broadcast, а так же адреса первого и последнего узла в сети.
Например: Узел 192.168.20.26 /29

11000000.10101000.00010100.00011010 - адрес узла (192.168.20.26)
11111111.11111111.11111111.11111000 - маска подсети (255.255.255.248)
11000000.10101000.00010100.00011000 - адрес (под)сети 192.168.20.24
Маска /29 говорит о том, что первые 29 бит относятся к адресу (под)сети, а оставшиеся три - к адресам узлов. Адрес, состоящий из всех нулей в области, относящейся к адресам узлов - это адрес (под)сети. Следовательно первый адрес узла в сети будет больше на 1 разряд, чем адрес (под)сети:
11000000.10101000.00010100.00011001 (192.168.20.25)
Как правило, первый адрес из (под)сети присваивают шлюзам.
Так же возможные адреса узлов в этой (под)сети:
11000000.10101000.00010100.00011010 (192.168.20.26)
11000000.10101000.00010100.00011011 (192.168.20.27)
11000000.10101000.00010100.00011100 (192.168.20.28)
11000000.10101000.00010100.00011101 (192.168.20.29)
11000000.10101000.00010100.00011110 (192.168.20.30) - Адрес последнего узла в этой (под)сети
11000000.10101000.00010100.00011111 (192.168.20.31) - бродкастный (широковещательный) адрес.

В интернете можно найти программы, выполняющие аналогичный расчёт. Например, Advanced IP Calculator

Вот, собственно и всё.

Комментировать

Комментарии

семнадцать + семь =

  1. Здравствуйте,
    хотя это и написано в 2010г, но и тогда это было не совсем так.

    Цитата:
    «Адрес сети в бинарном виде всегда оканчивается на ноль, адрес узла — на единицу.»
    — это не так, думаю что сейчас вы и сами это понимаете.

    Ну, и зачем забивать головы людей понятием класса сети? Им тоже в 21 веке никто не пользуется.

  2. @Гаврила ,
    Вы правы, с адресом сети — ошибка, спасибо.

    Зачем забивать людям головы про классы — тоже не понимаю, такова «современная» программа образования. В государственных ВУЗах Москвы ещё и windows 98 проходят.

  3. Может на практике это сейчас не применяется, но в ВУЗах сейчас именно это проходят.
    Спасибо большое за материал!