На практике может возникнуть необходимость в разделении существующей IP-сети на подсети. На просторах глобальной сети можно найти достаточно большое число различных IP-калькуляторов, которые помогут с решениями подобных задач. Самостоятельное решение задач занимает достаточно много времени, но позволяет выполнить их более точно, исходя из задания или существующей потребности. Попробуем в данной статье рассмотреть алгоритм разделения заданной сети на подсети путем построения IP-дерева.
Определение параметров сети по известному IP-адресу узла и префиксу описано в статье
Пример. Пусть дана сеть 10.0.0.0. Необходимо разбить данную сеть на подсети. В каждой подсети планируется использовать следующее количество узлов:
1 сеть - 3 узла;
2 сеть - 25 узлов;
3 сеть - 62 узла;
4 сеть - 120 узлов;
5 сеть - 250 узлов;
6 сеть - 400 узлов;
7 сеть - 1017 узлов.
Необходимо понимать, что в данном случае такие понятия как сеть и подсеть идентичны. То есть IP-подсеть обладает всеми параметрами сети и ее можно также рассматривать как отдельную сеть.
Ход решения.
Переведем заданный номер сети в двоичный код и определимся с номерами бит. Предлагаю нумеровать биты в IP-адресе справа налево, чтобы работать с меньшими цифрами (Можно нумеровать и слева направо, ошибки не будет).
Для решения задачи необходимо построить дерево IP-адресов. Оно строится произвольным образом, с соблюдением определенных правил. Следует учитывать, что используется двоичный код, поэтому все числа являются степенями двойки (то есть 2, 4, 8, 16, 32 и так далее). Для начала можно сложить все то количество узлов, для которых необходимо составить IP-адресацию.
3+25+62+120+250+400+1017=1877
Ближайшее большее число степени двойки это 2048 (два в одиннадцатой степени - 2^11). Это число можно поделить на два значения по 1024 каждый (2^10). При этом одиннадцатый бит будет принимать значения либо ноль, либо один. Нарисуем получившееся начало дерева. Не имеет значения какой бит (верхний или нижний) примет нулевое значение. Желательно при создании дерева определится, чтобы было одинаково, например, все верхние биты равны нулю, а все нижние единицы (как в данном рисунке).
Таким образом продолжаем делить каждую ячейку до необходимых значений. Здесь нужно пояснить, что пытаемся решить задачу с минимально необходимым выделением адресов. То есть, если нужно выделить сеть на 62 узла, например, то нужно выбрать ячейку на 64 адреса. Можно выбрать и 128 адресов, но тогда будет избыточное значение незадействованных адресов. Также нужно понимать, что в любой сети (большой или маленькой) два IP-адреса являются служебными и их нельзя назначать в качестве IP-адресов узлов. Это самый первый адрес, который является номером сети и самый последний адрес – широковещательный адрес сети. То есть если нужно выделить сеть, например, для 63 узлов, то ячейки на 64 адреса будет недостаточно, нужно выбирать ячейку на 128 адресов.
Также необходимо по мере деления адресного пространства назначать определенные ячейки в качестве сетей. Самое большое количество адресов требуется для седьмой сети (1017 адресов), для этой сети необходимо выделить ячейку в 1024 адреса. Выберем для этого верхнюю ячейку (хотя можно и нижнюю, не имеет значение).
Таким образом верхняя ячейка получается полностью задействована для адресации седьмой сети в 1017 адресов. То, что часть адресов останется свободной не имеет значение. Их все равно уже нельзя использовать в других сетях. Далее делим только нижнюю ячейку в 1024 адреса, так как она осталась свободной. Не забываем на линии перехода подписывать номера бит и их значения. Соответственно между 1024 и 512 уже будет находится десятый бит. Для шестой сети нужно 400 адресов, ближайшая наибольшая ячейка это 512. Выберем нижнюю для адресации шестой сети.
Продолжаем делить оставшуюся часть адресного пространства в 512 адресов по тому же принципу, что и раньше. Подписываем номера бит и выделяем адресное пространство для пятой сети в 250 адресов.
Для удобства восприятия желательно рисовать таким образом, чтобы ячейки с одинаковым количеством адресов (например, 256) находились на одной вертикальной линии. Делим оставшуюся ячейку в 256 адресов на две части и определяем место для четвертой сети в 120 адресов.
Продолжая подобным образом находим места на дереве для третьей, второй и первой сети.
Таким образом, были определены места для всех заданных сетей. Одно важное замечание. Если по каким-либо причинам не хватило место для всех сетей, то нужно продолжить дерево влево, то есть увеличить адресное пространство в два раза, задействовав уже 4096 адресов. Пример приведен на рисунке
Теперь необходимо исходя из построенного дерева определить адресные параметры для каждой сети: номер сети, префикс и маску сети, широковещательный адрес сети. А также диапазон и количество адресов, которые будут назначаться в качестве IP-адресов узлов.
Алгоритм решения можно представить следующим образом:
1. Определение границы сети.
2. Определение номера сети.
3. Определение маски (префикса) сети.
4. Определение широковещательного адреса сети.
5. Определение диапазона и количества адресов.
Рассмотрим на примере первой сети для трех узлов. Для этой сети выбрано адресное пространство на 8 узлов.
1. Определение границы сети. Речь идет об определении границы в IP-адресе между номером сети и номером узла (хоста). Для этого необходимо найти по дереву IP-адресов (рисунок №2) номер бита, который является последним для данной подсети (это четвертый бит), соответственно граница проходит между четвертым и нижележащим (третьим) битом.
2. Определение номера сети. Для этого значения бит справа от границы сети заполняем нулями (это биты 3, 2 и 1). Для заполнения значения бит слева от границы используем дерево IP-адресов (рисунок №2). Нужно передвигаться от выбранной ячейки (8 адресов) по ветвям дерева к вершине и записывать значения бит. Четвертый бит равен нулю, пятый бит – единице, шестой – единице, седьмой – нулю и так далее. До одиннадцатого бита, который равен единице. Когда дерево закончилось, то значения бит необходимо переписать исходя из первоначально заданной сети (рисунок 1). Получаем следующую запись:
Теперь переводим номер подсети в десятичную систему: 10.0.4.176.
Перемещение от ячейки в 8 адресов до вершины дерева представлено на следующем рисунке
3. Определение маски (префикса) сети. Маска – второй параметр сети, поэтому его записываем отдельно. Для определения маски необходимо все биты, находящиеся слева от границы, заполнить единицами, а справа – нулями:
Переводим маску подсети в десятичную систему: 255.255.255.248. Префикс — это еще один вид записи маски, он указывает количество бит в IP-адресе отведенных под номер сети. В данном случае это количество единиц в двоичном коде маске (то есть префикс равен 29).
4. Определение широковещательного адреса сети. Широковещательный адрес сети – это самый последний адрес в данной сети. Для его определения переписываем биты относящиеся к адресу сети (рисунок 3) без изменения, а биты относящиеся к адресу узла (справа от границы сети) заменяем на единицы:
Переводим широковещательный адрес в десятичную систему счисления: 10.0.4.183.
5. Определение диапазона и количества адресов. Для того чтобы вычислить адрес первого узла в подсети, необходимо к номеру подсети прибавить единицу (10.0.4.177), а для того чтобы определить адрес последнего узла, - от широковещательного узла подсети отнять единицу (10.0.4.182). Получаем следующий диапазон адресов узлов: 10.0.4.177 – 10.0.4.182. Таким образом, максимальное количество адресов в подсети 10.0.4.176 с маской 255.255.255.248 составляет 6. Данное количество адресов достаточно для того, чтобы в подсети разместить 3 узла.
Все вышеизложенные рассуждения можно пропустить и записать все решение в компактной форме:
Номер подсети и префикс: 10.0.4.176/29
Маска подсети: 255.255.255.248
Широковещательный адрес: 10.0.4.183
Адрес первого узла: 10.0.4.177
Адрес последнего узла: 10.0.4.182
Диапазон адресов: с 10.0.4.177 до 10.0.4.182
Количество IP-адресов для адресации узлов: 6
Для более точного понимания перечислим эти шесть адресов:
10.0.4.177, 10.0.4.178, 10.0.4.179, 10.0.4.180, 10.0.4.181, 10.0.4.182
Еще раз обращаю внимание, что понятие сеть и подсеть почти одинаковы, так как каждая из них имеет полный набор параметров. В данном случае рассматривается деление большой сети на несколько более мелких (по количеству узлов в сети).
Для определения IP-адресации подсетей с 25, 62 и 120 узлами повторяем все те же действия, что описаны выше.
Могут возникнуть трудности для определения параметров сети с общим количеством адресов 512 и выше. Рассмотрим пример решения для шестой сети, в которой необходимо выделить адресацию на 400 узлов и для которой выделена ячейка на 512 адресов (рисунок 2). Алгоритм решения такой же, но из-за того, что граница проходит через третий байт, вычисления немного усложняются.
Следуя вышеуказанному алгоритму получаем:
Номер подсети и префикс: 10.0.6.0/23
Маска подсети: 255.255.254.0
Широковещательный адрес: 10.0.7.255
Адрес первого узла: 10.0.6.1
Адрес последнего узла: 10.0.7.254
Диапазон адресов: с 10.0.6.1 до 10.0.7.254
Количество IP-адресов для адресации узлов: 510
Если префикс сети составляет 23 и менее, то диапазон адресов можно разложить на составные части, в зависимости от изменений третьего байта. То есть
10.0.6.1 – 10.0.6.255 это 255 адресов
10.0.7.0 – 10.0.7.254 это 255 адресов
Итого 255+255=510 адресов
Для седьмой сети (на 1017 узлов) определяем аналогичным образом:
Номер подсети и префикс: 10.0.0.0/22
Маска подсети: 255.255.252.0
Широковещательный адрес: 10.0.3.255
Адрес первого узла: 10.0.0.1
Адрес последнего узла: 10.0.3.254
Диапазон адресов: с 10.0.0.1 до 10.0.3.254
Количество IP-адресов для адресации узлов: 1022
Для определения количества адресов разложим на четыре поддиапазона:
10.0.0.1 – 10.0.0.255 это 255 адресов
10.0.1.0 – 10.0.1.255 это 256 адресов
10.0.2.0 – 10.0.2.255 это 256 адресов
10.0.3.0 – 10.0.3.254 это 255 адресов
255+256+256+255=1022
Номер одной подсети может совпасть с номером первоначально заданной сети. Это допустимо, но только для одной подсети.