воскресенье, 8 декабря 2013 г.

CCNA/CCNP - Адресация IPv4: правила деления на подсети

Работа с адресным пространством рассматривается во многих курсах, связанных с сетями, вне зависимости от вендора и от уровня сложности курса. Лично встречал выделение этой темы в отдельный блок как в Cisco CCNA, так и в CCNP, а так же в начальных курсах от Juniper. Тема является очень важной, поэтому ей всегда уделяется много внимания. Системный администратор, сетевой инженер да и вообще любой человек, так или иначе связанный с сетями, должен чувствовать себя в этой теме максимально комфортно и не испытывать сложности в вопросах адресации и subnetting'а.

Зачем? Вот лишь несколько примеров: оптимизация адресного пространства при маршрутизации, написание Access Control Lists (ACL), ручное и автоматическое суммирование адресов, гибкое деление имеющегося адресного пространства на части.

Попробуем разобраться, что к чему.

О ЧЕМ ЗДЕСЬ НЕ РАССКАЖУТ

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

ЧТО ТАКОЕ IP АДРЕС?

Протокол IPv4 работает на третьем уровне модели OSI (L3:Network Layer). Для идентификации участников информационного обмена используется некоторая двоичная комбинация длинной 32 бита, которая и называется IP-адресом. При отправке пакета всегда используется два адреса: адрес отправителя и адрес получателя.
IP адрес имеет общую длину 32 бита, и состоит из 4х частей (октетов) по 8 бит каждый (жутчайшая математика).
Адрес можно представить как в двоичной, так и в десятичной форме (как пишут во всех учебниках: люди работают с десятичной системой счисления, машины - с двоичной. Тут все понятно). Причем перевод из двоичной в десятичную производится пооктетно: один октет - одно десятичное значение.
При записи в десятичном виде каждый октет отделяется от другого точкой. Пример:
 Все, как и было сказано выше: 4 октета, каждый представлен как в двоичном, так и в десятичном виде, при использовании десятичного вида октеты отделяются друг от друга точками. Нумерация октетов идет слева направо. Соответственно, 4й октет - младший, последний, иногда встречается понятие "нижний", но редко; 1й октет - первый, старший, "верхний".

ЧТО ТАКОЕ МАСКА СЕТИ И ДЛИНА ПРЕФИКСА?

Представим улицу. Вдоль улицы располагаются здания. У каждого здания есть свой адрес. Причем, каким-то образом когда-то люди договорились, что адрес каждого дома будет состоять из названия улицы и номера дома на этой улице. Таким образом запись "ул. Иванова, 4" означает 4й дома на улице Иванова. В записи четко видно, где граница между частью, указывающей на название улицы, а где непосредственно номер искомого нами дома.
В сетях сохраняется похожая логика. Адрес может служить:
1 - указателем сети (сетевой адрес, Network Address) - такой адрес выполняет функцию, аналогичную названию улицы.
2 - указателем на конечное устройство (адрес устройства, Host Address) - аналогично номеру дома.
3 - широковещательным адресом (Broadcast Address) - адрес, используемый для отправки сообщений в пределах сети. Для аналогии с улицей: такой адрес будет использовать разносчик листовок, который знает, что листовку надо кинуть в каждый почтовый ящик на заданной улице.

Если взять адрес из примера выше, и попробовать определить, какую функцию выполняет этот адрес, то скорее всего будет достаточно сложно это сделать. Почему? Мы не обговорили, какая часть адреса укажет нам на "улицу", а какая на "дом" (на сеть и на хост соответственно).
В качестве указателя используется маска подсети - комбинация битов равная по длине IP адресу, которая указывает, где в IP адресе сетевая, а где хостовая часть.
Маска записывается в виде последовательности из единиц и нулей, причем сначала подряд идут единицы (указание на сетевую часть), а потом идет последовательность нулей (хостовая часть).

Например:
В двоичном виде: 11111111111111111111111100000000
То же самое в десятичном виде: 255.255.255.0
Такая маска говорит о том, что первые три октета отвечают за сетевой адрес, а последний, 4й октет указывает на номер хоста в сети.

Маска используется следующим образом: возьмем наш адрес и произведем побитовое умножение элементов адреса с элементами маски (помним, что 1х1=1, а 1х0=0).
Теперь мы видим, что:
1 - адрес сети ("улица") - 173.5.82.0
2 - адреса хостов ("дома") могут лежать в диапазоне от 173.5.82.1 до 173.5.82.254
3 - широковещательный адрес - это последний адрес в сети, у которого все биты в хостовой части равны единице - 173.5.82.255.

NB! Часто задаваемый вопрос: Можно ли использовать "рваную маску" (маска, в указателе на сетевую часть которой присутствует нуль)? Например, такую: 254.255.255.0 - НЕТ, в общем случае НЕЛЬЗЯ, хотя есть исключения.

Подробнее о масках можно почитать в RFC1519.

Еще один способ указания на то, какая часть является адресом сети, а какая является адресом хоста - это использование префиксов (RFC4632).
Запись в этом случае будет выглядеть следующим образом: 173.5.82.12/24, где через косую черту указывается длина префикса - количество бит, начиная с самого старшего, первого бита, которые отведены под адрес подсети.
Префикс - это адрес сети, в нашем случае - 173.5.82.0.

/24=255.255.255.0

Маска/длина префикса может быть различна. От чего это зависит? От того, какое количество хостов нам необходимо обеспечить адресами. Изначально использовали только три маски, разбив адресное пространство на три основных класса: А, B, С.
По указанным маскам можно вычислить, какое количество хостовых адресов мы можем получить. К примеру, сеть класса А имеет 24 бита, отведенные под хостовые адреса. При этом помним, что адрес, у которого на месте хостовых битов только нули - это адрес сети, а если там все единицы - то это широковещательный адрес. Оба этих адреса нельзя назначить хосту, поэтому вычитаем их из общего количества хостовых адресов. В итоге:

Класс А позволяет назначить адреса 2^24-2=16777214 хостам, сеть класса B содержит 2^16-2=65534 хостовых адреса, а сеть класса С имеет 2^8-2=254 хостовых адреса.

VARIABLE LENGTH SUBNET MASKS (VLSM) или БЕСКЛАССОВАЯ АДРЕСАЦИЯ

Чтобы вычислить количество хостовых адресов, необходимо воспользоваться формулой 2^N-2, где N - количество хостовых битов в данной подсети.
В современных сетях существуют ситуации, когда есть необходимость только в двух адресах между устройствами. Возьмем самую маленькую сеть класса С. Для строящейся сети типа "точка-точка" мы взяли только 2 адреса из сети класса С. Остальные адреса (а их осталось 252) мы использовать не можем, они просто есть на указанном участке сети типа "точка-точка". Было бы удобнее, если бы мы могли выдать то количество адресов на подсеть, которое необходимо. И не выбрасывали на ветер остальные адреса. Так появилась бесклассовая адресация или VLSM. Суть её заключается в том, что мы можем выдать на подсеть ровно столько адресов, сколько нужно (ну почти), а оставшееся адресное пространство использовать где-нибудь еще.
Проще всего объяснить на примере:

Дана сеть 192.168.0.0/24 (или маска 255.255.255.0). Сеть класса С, 254 адреса. Мы можем забрать один бит от сетевой части и отдать под адреса хостов. Тогда:

192.168.0.0/24 превратится в 192.168.0.0/23 (маска 255.255.254.0) Количество хостов:
2^9-2=510 - именно столько адресов мы можем выдать конечным устройствам.

Адрес сети: 192.168.0.0
Диапазон хостовых адресов: 192.168.0.1 - 192.168.1.254
Широковещательный адрес: 192.168.1.255

Обращаем внимание на третий и четвертый октеты:
Возьмем другой пример. Пусть дана сеть 172.16.20.0/22. Определить маску, количество и диапазон хостовых адресов и широковещательный адрес.

/22 - 22 бита отвечают за хостовый адрес. Узнать маску можно написав сначала 22 единицы, добить это до 32 бит нулями, после чего разделить на 4 октета и перевести в десятичную форму. не вдаваясь в подробности вычислений, получаем: 255.255.252.0

Количество хостовых адресов мы можем определить по формуле, указанной выше. Число хостовых бит равно 10 (длина адреса - длина префикса: 32-22=10). Следовательно, количество хостовых адресов равно 1022 (за вычетом широковещательного и сетевого адресов).

Широковещательный адрес - адрес, у которого в хостовой части все биты имеют значение единицы. Для наглядности посмотрим на рисунок с изображением 3го и 4го октетов:
Сетевая часть не меняется, мы не можем ей манипулировать. Изменять можно только хостовую часть. Итак, широковещательный адрес мы получим, если все хостовые биты примут значения единиц:
И адрес имеет вид 172.16.23.255.
Диапазон хостовых адресов: 172.16.20.1 - 172.16.23.254

А что, если вместо одной большой сети у нас есть много маленьких? Как обеспечить такую сеть адресами? Для этого и придумали деление на подсети (не знаю, как лучше перевести понятие subnetting).
Допустим, у нас есть адресное пространство - сеть класса С: 192.168.35.0/24. И есть две физические сети, в которых по 120 машин. Нам необходимо разделить это адресное пространство так, чтобы каждой физической сетке досталось адресов ровно столько, сколько нужно, или хотя бы с минимальным количеством лишних, неиспользованных адресов.

Для начала ответим на вопрос, сколько хостовых битов должно быть в наших подсетях? Попробуем взять 7 бит: 2^7-2=126 адресов. Если возьмем 6, то количество хостовых адресов в подсети будет уже равно 62, что не достаточно для наших целей. Итак, нам нужно 7 хостовых битов. Следовательно, мы можем передвинуть границу сети класса C вправо, забрав один бит из хостовой области в сетевую. Этим битом мы можем управлять, как нам захочется. Ну... Вариантов-то не много, а точнее - два: либо он будет равен 0, либо 1. Отсюда мы получаем две сети:
Первая сеть: 192.168.35.0/25
                       Диапазон адресов: 192.168.35.1 - 192.168.35.126
                       Широковещательный адрес: 192.168.35.127
 Вторая сеть: 192.168.35.128/25
                     Диапазон адресов: 192.168.35.129 - 192.168.35.254
                     Широковещательный адрес: 192.168.35.255
Итог: у нас есть две сети, отвечающие нашим нуждам, которые к тому же имеют по 6 дополнительных адресов про запас.

Допустим, концепция резко изменилась, и нам потребовалось срочно вместо одной сети со 120 хостами получить 3 сети по 20 хостов. Возьмем полученную в предыдущем случае сеть 192.168.35.0/25 и разделим её так же, как поступали ранее с большой сетью

Необходимое количество хостовых бит, обеспечивающих наши потребности, равно 5 (2^5-2=30 хостовых адресов). Меньше не получится (4 бита дают лишь 14 хостовых адреса). Поэтому сдвигаем на два бита вправо границу между сетевой и хостовой частью: длина префикса становится равной /27. Посмотрим, какие сети у нас получились:
Зеленым выделены биты, которые мы можем менять. У нас получилось 4 дополнительные сети, в каждой имеется по 30 сетевых адресов.

Первая сеть: 192.168.35.0/27
                       Диапазон адресов: 192.168.35.1 - 192.168.35.30
                       Широковещательный адрес: 192.168.35.31
 Вторая сеть: 192.168.35.32/27
                     Диапазон адресов: 192.168.35.33 - 192.168.35.62
                     Широковещательный адрес: 192.168.35.63
 Третья сеть: 192.168.35.64/27
                     Диапазон адресов: 192.168.35.65 - 192.168.35.94
                     Широковещательный адрес: 192.168.35.95
 Четвертая сеть: 192.168.35.96/27
                     Диапазон адресов: 192.168.35.97 - 192.168.126
                     Широковещательный адрес: 192.168.35.127
По условию задачи мы можем выдать 3 подсети нашим физическим сетям, которые требуют 20 адресов каждая (в запасе останется 10 хостовых адресов), и остается одна сеть, которую мы можем отдать под иные нужды целиком или разбив на более мелкие подсети.

Действия в общем случае при необходимости разбиения адресного пространства на подсети:
1. Определяем, сколько подсетей нам потребуется.
2. Определяем, сколько хостов будет в каждой из подсетей.
3. Выбираем некоторую начальную сеть, деление которой мы и будем производить.
4. Расставляем требуемые сети в порядке убывания количества хостов в них.
5. Начинаем деление на подсети: сначала выделяем адреса для сети с наибольшим количеством хостов, после идем по списку, дробя адресное пространство на более мелкие части.

Для проверки этого алгоритма попробуем решить задачу из курса CCNA Exploration.

Для проектирования сети мы решили взять сеть класса В. Используем адресный блок 172.16.0.0/16.  Нам требуется обеспечить адресами 7 сетей со следующими требованиями:

1st сеть содержит 512 хостов;
2nd сеть содержит 12 хостов;
3rd сеть содержит 28 хостов;
4th сеть содержит 6 хостов;
5th, 6th, 7th - сети типа "point-to-point", требуют по 2 адреса каждая.

Видим, что наибольшее количество хостов в подсети равно 512. Выделим адреса для этой сети.
Расчеты показывают, что мы должны оставить в хостовой части 10 бит, иначе нам не хватит адресного пространства ( 2^10-2=1022 - 510 адресов будут не использованы, но если взять меньшее количество бит, например, 9, то нам не хватит 2х адресов. Что ж, бывают и такие огорчения, но ничего не поделать).

Значит, получаем сети с длиной префикса /22. Из выданного нам блока таких сетей будет 64 (начальная длина префикса 16, мы используем под сетевые адреса еще 6 бит из хостовой части, следовательно, количество получаемых сетей 2^6=64):

172.16.0.0/22
172.16.4.0/22
172.16.8.0/22
172.16.12.0/22
172.16.16.0/22
. . . . . . . . . . .
172.16.252.0/22

Одну из этих сетей забираем для сети 1. Пусть это будет сеть 172.16.0.0/22. Остается еще 63 сеть, которую мы можем использовать по своему усмотрению.
Приступим к следующим подсетям. По количество хостов следующей у нас является сеть 3 - 28 требуемых адресов. Возьмем любую из тех оставшихся сетей, и разделим её. Допустим, возьмем сеть 172.16.4.0/22.
Получим 32 сети, но с маской 255.255.255.224:

172.16.4.0/27
172.16.4.32/27
172.16.4.64/27
172.16.4.96/27
..................
172.16.7.224/27

Опять возьмем первый диапазон из списка и назначим его сети №3.

Далее сеть №2 - 12 хостов. Возьмем диапазон 172.16.4.32/27 и снова разделим. Необходимо оставить 4 бита под хосты. Получаем сети с длиной префикса /28:

172.16.4.32/28
172.16.4.48/28 - т.к. мы задействовали всего один дополнительный бит от хостовой части, то получили лишь две сети при делении. Но этого нам вполне достаточно.

Используем первый диапазон для сети №2, а второй разделим так, чтобы получить нужное количество хостовых адресов для 4й сети:

172.16.4.48/29 - отдаем сети №4
172.16.4.56/29 - это диапазон разобьем между сетями 5,6,7.

Здесь получилось интересно: всего для этих трех сетей требуется 2 адреса в каждой подсети. А это 2 бита в хостовой части. Но сеть 172.16.4.56/29 может быть разделена только на 2 подсети с длиной префикса /30. Что делать? Ничего страшного. Мы оставим эту сетку для каких-нибудь иных целей, а для решения последней части мы возьмем еще одну сеть /27, и разобьем её на множество сетей /30, а если точнее - на 8 таких сетей:

172.16.4.64/30
172.16.4.68/30
172.16.4.72/30
........................
172.16.4.92/30

Первые три подсети мы отдадим соответственно 5,6 и 7 сетям.

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

В запасе у нас осталось:

60 сетей с маской 255.255.252.0 (/22)
29 сетей с маской 255.255.255.224 (/27)
 1 сеть с маской    255.255.255.248 (/29)
5 сетей с маской   255.255.255.252 (/30)

 

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

Отправить комментарий