При подготовке к CCIE RS Written есть тема, которая посвящена маскам подсети, и прочему.
Я напишу небольшую заметку о том как разбивать сети на подсети, как суммировать их, как найти адреса сети и широковещательных адресов и так далее.
Нахождение адреса сети, широковещательного адреса, первого и последнего допустимых адресов, которые могут быть назначены хостам.
Допустим нам дан некий IP адрес, с маской подсети, например 152.21.121.37 /26, нам необходимо найти адрес сети и широковещательный адрес, а так же первый и последний адреса которые можно присвоить хосту.
Алгоритм действий такой:
Префикс 26 нам говорит о том, что с последнего октета, под сеть выделено 2 бита, и на хосты у нас осталось 6 бит (64 хоста).
Представим этот префикс в двоичном виде и далее переведем последний октет в IP адресе в двоичную систему (нет смысла переводить весь IP адрес в бинарку)
/26 — 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 0 0 0 0 0 0
x.x.x.37 — x x x x x x x x . x x x x x x x x . x x x x x x x x . 0 0 1 0 0 1 0 1
Теперь можем определить адрес сети.
Для этого проведем линию по нашему префиксу. Теперь это будет выглядеть так.
/26 — 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 | 0 0 0 0 0 0
x.x.x.37 — x x x x x x x x . x x x x x x x x . x x x x x x x x . 0 0 | 1 0 0 1 0 1
И выпишем значения которые могут быть минимальным (все биты равны нулю) и максимальное (когда все биты равны единицы) в хостовой части.
это соответственно — 0 0 0 0 0 0 — что в 10-ной системе равно «0» и 1 1 1 1 1 1 что в 10-ой системе равно 63
Значит адрес нашей сети равен: 152.21.121.0.
Широковещательный адрес: 152.21.121.63
Соответственно первый IP адрес, который можно назначить хосту: 152.21.121.1
Последний IP адрес, который можно назначить хосту: 152.21.121.62
Нахождение IP адреса по номеру подсети и номеру хоста.
Не представляю особо где может понадобиться, но тем не менее 🙂
Дана сеть, скажем 49.0.0.0, которая поделена маской /25 на множество подсетей.
Необходимо найти IP адрес, если известно что он принадлежит 429 подсети и имеет номер 41.
Итак приступим:
49.0.0.0 согласно классификации сетей принадлежит классу А, следовательно префикс такой сети равен /8, Запишем его в бинарном виде.
8/ — 1 1 1 1 1 1 1 1 . 0 0 0 0 0 0 0 0 . 0 0 0 0 0 0 0 0 . 0 0 0 0 0 0 0 0
Представим префикс /25 так же в бинарном виде:
/25 — 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 0 0 0 0 0 0 0
Так как разрешено использовать для подсети все единицы и нули, то из требуемой подсети 429 вычитаем 1. Получаем 428, это число нам нужно представить в бинарном ввиде, на том месте где у нас «единички» в подсети.
428 — 0 0 0 0 0 0 0 0 . 0 0 0 0 0 0 0 0 . 1 1 0 1 0 1 1 0 . 0 0 0 0 0 0 0 0
Представим в бинарном виде 41 (номер нашего искомого хоста в нужной подсети).
41 — 0 0 1 0 1 0 0 0
Что у нас получилось?
49.0.1 1 0 1 0 1 1 0 . 0 0 1 0 1 0 0 1
Переведем весь адрес в десятичный вид:
49.0.214.41
Суммирование сетей.
Суммирование сетей очень важно уметь делать, ибо применяется в маршрутизации повсеместно, а именно там, где нам нужно объединить кучу сетей, в одну, тоесть иными словами «суммировать».
Давайте также разберемся на примере.
Дано:
Сети адреса которых:
* 140.176.2.128 / 25
* 140.176.3.0 / 25
* 140.176.3.192 / 26
* 140.176.3.128 / 26
* 140.176.2.0 / 25
Необходимо заменить все эти подсети — одной, которая будет объеденять все вышеуказанные, с наименьшей потерей адресов. Можно конечно не сильно присматриваясь сделать так: 140.176.0.0 /16 , да, это будет работать, но это грубое суммирование и не корректное.
Для правильного суммирования нам необходимо опять же поработать с бинарными числами, а именно перевести изменяемые части адреса в двоичный код.
В данном примере 140.176. является статичной, поэтому ее трогать не будем, будем переводить последние два октета:
2.128 / 25 — 0 0 0 0 0 0 1 0 . 1 0 0 0 0 0 0 0
3.0 / 25 — 0 0 0 0 0 0 1 1 . 0 0 0 0 0 0 0 0
3.192 / 26 — 0 0 0 0 0 0 1 1 . 1 1 0 0 0 0 0 0
3.128 / 26 — 0 0 0 0 0 0 1 1 . 1 0 0 0 0 0 0 0
2.0 / 25 — 0 0 0 0 0 0 1 0 . 0 0 0 0 0 0 0 0
Далее нам необходимо найти неизменяемые не в одной подсети значения, я отметил их жирным.
Таким образом получается что префикс новой сумированной сети будет: /23
Полностью суммированная сеть будет выглядеть так: 140.176.2.0/23
Разбиение сети на подсети.
Например, есть у нас сеть класса С, 192.168.0.0 / 24
Нам необходимо разбить эту сеть на две одинаковые подсети.
Разбиение осуществляется путем заимствования бита из поля, которое предназначено для хоста, в поле которое предназначено для маски.
Наша основная сеть имеет префикс 24 бита, мы добавляем к нему 1, и получаем новый префикс /25
Так как мы взяли всего один бит, следовательно и сетей у нас может быть только две (бит может принимать значение 1 или 0).
В каждой такой сети есть 128 адреса (2 в 7 степени (32 — 25 = 7 ) ).
Итак у нас получилось две подсети с адресами:
192.168.0.0 — 192.168.0.127 /25 (Доступные адреса для хостов: 192.168.0.1 — 192.168.0.126)
192.168.0.128 — 192.168.0.255/25 (Доступные адреса для хостов: 192.168.0.129 — 192.168.0.254)
Это был очень простой пример.
Так же каждую такую сеть вы можете еще разбить на несколько подсетей, не обязательно поровну, но и на различное количество хостов в каждой подсети.
Например, мы хотим разбить сеть 192.168.0.128/25 на одну сеть которая бы имела не менее 30 адресов, и другую сеть, которая имела бы не менее 60 адресов.
Находим необходимые префиксы наших новых сетей.
30 адресов, ищим ближайшее значение степени двойки, 2^5 = 32. Это то, что нужно.
Тоесть для этой сети нам достаточно сети пяти бит. (32 -5 = 27), итак префикс нашей новой подсети будет /27
Для второй сети, 60 адресов, ближайшая степень двойки — 64, 2^6 = 64.
Тоесть для новой сети нам необходимо 6 бит (32-6 = 26), префикс будет /26
Ну и запишем что у нас получилось:
1. 192.168.0.128 — 192.168.0.159/27
2. 192.168.0.160 — 192.168.0.123/26
Когда перед нами стоят такие задачи, то нужно начинать разбиение сети с наибольшего количества, адресов, и так по убыванию (в моем примере наоборот).
Надеюсь данная заметка кому-то будет полезной.
p.s. В ходе повторения материала, набрел на очень полезный ресурс, с точки зрения пратики: http://tests.proseti.com/
Рекомендую 🙂