Сети с нуля 04. Подсети и CIDR: считаем без калькулятора
Note
Материал сверен с первоисточниками (RFC и официальная документация Microsoft, Wireshark и др.; ссылки — в конце статьи). Примеры вывода — иллюстрации: на вашей системе значения и формат могут отличаться.
Когда офис вырастает, одной плоской сети становится мало: хочется отделить гостей от рабочих компьютеров, серверы от принтеров, а управление оборудованием от всех остальных. Для этого одну большую сеть делят на подсети. Здесь нужна арифметика, но не сложная: достаточно степеней двойки и одного приёма, «шага» маски. Его мы и разберём.
В статье вы научитесь:
- читать запись
192.168.10.0/24и понимать, сколько в ней адресов и узлов; - находить адрес сети и широковещательный адрес (broadcast) для любого адреса и любой маски без калькулятора;
- делить сеть на равные подсети и на подсети разного размера (VLSM);
- объединять несколько сетей в одну запись (суммирование маршрутов);
- замечать типичные ошибки: пересечения, «лишние» адреса, неверные границы блоков.
Что такое адрес, маска, подсеть, адрес сети и broadcast, мы здесь не повторяем: это есть в статье 03. Сквозной пример тот же: сеть 192.168.10.0/24.
Tip
Если вы только знакомитесь с сетями, прочитайте статью до раздела «Деление сети /24 на равные подсети» включительно и решите упражнения 1–3. VLSM и суммирование оставьте на второй проход: для статей 05–12 они не нужны.
Что нужно знать заранее
- Сети с нуля 03. IPv4-адреса и маски подсети — формат адреса, маска и префикс, логическое «И», адрес сети и broadcast. Без неё эта статья будет трудной.
- Сети с нуля 01. Что такое сеть: устройства, модель TCP/IP и OSI — желательно, чтобы понимать, зачем сети делят.
От классов к CIDR
Деление сети на подсети придумали давно: RFC 950 (1985; RFC, Request for Comments, — серия документов-стандартов интернета) разрешил отдавать под номер подсети любое число бит из узловой части адреса. Но тогда действовали классы адресов (RFC 791): у класса A старший бит равен 0 (первый октет 0–127), у класса B старшие биты 10 (128–191), у класса C 110 (192–223). Класс сам определял границу между сетью и узлом, то есть маску /8, /16 или /24.
Деление на классы оказалось неудобным: сеть класса C слишком мала для многих организаций, а класса B слишком велика. В 1993 году RFC 1519 назвал причинами исчерпание адресов класса B и быстрый рост таблиц маршрутизации и предложил CIDR (Classless Inter-Domain Routing, «бесклассовая адресация»). Современное описание — RFC 4632 (2006) — заменило RFC 1519 и объявило систему классов A/B/C устаревшей. Суть CIDR в том, что граница между сетью и узлом может проходить где угодно, а не только после 8, 16 или 24 бит, и всегда записывается явно.
Блок адресов с общим началом называется префиксом. Его пишут как адрес сети, косую черту и длину префикса: 192.168.10.0/24. Длина префикса — число единиц в маске, то есть число бит, общих для всего блока (от 0 до 32). Это и есть «маска в коротком виде». Отсюда два правила:
- Маска или префикс должны быть известны всегда. По одному адресу вроде
192.168.10.101границу не определить, а слово «класс» для расчётов не нужно. - Маска должна быть непрерывной: единицы слева, нули справа, без «дыр».
Note
В старых источниках можно встретить рекомендацию не использовать подсеть из одних нулей и подсеть из одних единиц (она была в RFC 950 и повторена в RFC 1122). Сейчас она устарела: RFC 1812 называет такое ограничение бессмысленным в бесклассовой адресации, а RFC 1878 включает все подсети в свои таблицы. Современное оборудование, как правило, использует все подсети, но в очень старой технике и документации ограничение ещё встречается.
Размер блока и число узлов
Длина префикса n показывает, сколько бит отдано под сеть. Остальные 32 − n бит принадлежат узлам. Отсюда:
- размер блока (число адресов) равен
2^(32 − n); - число узлов равно размеру блока минус 2, потому что адрес сети (все нули в узловой части) и широковещательный адрес (все единицы) узлам не назначаются.
Для /24 узловых бит 8, адресов 2⁸ = 256, узлов 254. Для /26 узловых бит 6, адресов 64, узлов 62. Каждый дополнительный бит префикса вдвое уменьшает блок.
Два особых случая
/31— два адреса. По обычному правилу узлов было бы 0, но RFC 3021 разрешает использовать/31на двухточечных (point-to-point) каналах, то есть на линиях, соединяющих ровно два устройства: оба адреса в такой сети считаются адресами узлов, а направленного broadcast на канале нет. Оборудование на обоих концах должно поддерживать такой режим, проверяйте это до использования./32— один адрес, то есть один конкретный узел. Такую запись используют, когда нужно указать именно этот узел, например в маршруте к одному узлу.
Шпаргалка /24–/30
Эти префиксы встречаются в офисных сетях чаще всего. В колонке «Шаг» стоит число, на которое «прыгает» адрес сети в последнем октете (о нём — в следующем разделе).
| Префикс | Маска | Адресов | Узлов | Шаг в последнем октете |
|---|---|---|---|---|
/24 |
255.255.255.0 |
256 | 254 | 256 (весь октет) |
/25 |
255.255.255.128 |
128 | 126 | 128 |
/26 |
255.255.255.192 |
64 | 62 | 64 |
/27 |
255.255.255.224 |
32 | 30 | 32 |
/28 |
255.255.255.240 |
16 | 14 | 16 |
/29 |
255.255.255.248 |
8 | 6 | 8 |
/30 |
255.255.255.252 |
4 | 2 | 4 |
Полная таблица для всех префиксов от /0 до /32 есть на странице Таблица масок подсети. В её колонке «Инверсия» стоит инверсная (wildcard) маска: её используют в классических списках доступа Cisco (ACL, Access Control List — правила разрешения и запрета трафика; Cisco с нуля 08: Списки доступа (ACL)). Учтите, что для /31 в колонке «Используется» там указан 0 по классическому правилу, а на двухточечных каналах оба адреса используются.
Быстрый метод: «шаг» маски
Расчёты в двоичной системе точны, но медленны. На практике все делают так.
Шаг 1. Найдите границу. Если длина префикса кратна 8 (/8, /16, /24), граница проходит между октетами и «интересного» октета нет: адрес сети — октеты слева от границы, остальные равны нулю; broadcast — те же октеты слева и 255 справа. Например, для 192.168.10.101/24 это 192.168.10.0 и 192.168.10.255, для 172.16.45.9/16 — 172.16.0.0 и 172.16.255.255.
Для остальных префиксов граница лежит внутри одного октета, его мы и называем «интересным». В маске это октет со значением не 255 и не 0. Его номер равен длине префикса, поделённой на 8 с округлением вверх: для /26 четвёртый, для /22 и /20 третий.
Шаг 2. Вычислите шаг: 256 − значение октета маски. Для 255.255.255.192 шаг равен 256 − 192 = 64, для 255.255.252.0 шаг равен 256 − 252 = 4. Шаг — это размер блока в «интересном» октете: адреса сетей идут в нём с таким интервалом.
Шаг 3. Адрес сети: возьмите самое большое число, кратное шагу и не превышающее значение этого октета в адресе. Октеты правее обнуляются, левее остаются как в адресе.
Шаг 4. Широковещательный адрес: прибавьте к найденному числу шаг и вычтите 1. Октеты правее заполняются 255. Узлы лежат между адресом сети и broadcast.
Чтобы не вспоминать значение маски по числу бит, запомните таблицу:
| Бит сети в «интересном» октете | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| Значение маски | 128 | 192 | 224 | 240 | 248 | 252 | 254 |
| Шаг | 128 | 64 | 32 | 16 | 8 | 4 | 2 |
Если заняты все 8 бит октета, это октет 255: граница проходит между октетами (случай /8, /16, /24). Например, /26: 26 = 3 × 8 + 2, три октета по 255 и два бита в четвёртом, значит маска 255.255.255.192, шаг 64.
Пример 1: 192.168.10.101/26
Это наш PC1, но с маской /26. Шаг 64, значит сети начинаются с 0, 64, 128, 192. Число 101 лежит между 64 и 128, поэтому адрес сети 192.168.10.64, broadcast 192.168.10.127 (64 + 64 − 1 = 127), узлы 192.168.10.65–192.168.10.126, всего 62.
Проверка в двоичной системе: 101 = 01100101. Две единицы маски оставляют 01, остальные 6 бит обнуляются, получается 01000000 = 64. Если их заполнить единицами, получится 01111111 = 127. Результаты совпали.
Пример 2: 192.168.37.5/22
Маска 255.255.252.0, «интересный» октет третий, шаг 256 − 252 = 4. Число 37 лежит между 36 и 40, значит адрес сети 192.168.36.0. Broadcast: третий октет 36 + 4 − 1 = 39, четвёртый 255, итого 192.168.39.255. Узлы: 192.168.36.1–192.168.39.254, их 2¹⁰ − 2 = 1022. Обратите внимание: в такой сети адрес 192.168.37.0 не является адресом сети, это обычный адрес узла.
Пример 3: 10.77.130.9/20
Маска 255.255.240.0 (20 = 2 × 8 + 4 бита), «интересный» октет третий, шаг 256 − 240 = 16. Число 130 лежит между 128 и 144, значит адрес сети 10.77.128.0, broadcast 10.77.143.255 (128 + 16 − 1 = 143).
Деление сети /24 на равные подсети
Каждый дополнительный бит префикса удваивает число подсетей и вдвое уменьшает размер каждой:
| Новый префикс | Подсетей из /24 |
Адресов в подсети | Узлов |
|---|---|---|---|
/25 |
2 | 128 | 126 |
/26 |
4 | 64 | 62 |
/27 |
8 | 32 | 30 |
/28 |
16 | 16 | 14 |
Поделим 192.168.10.0/24 на четыре подсети /26. Шаг 64, поэтому сети начинаются с .0, .64, .128, .192:
| Подсеть | Диапазон узлов | Broadcast |
|---|---|---|
192.168.10.0/26 |
.1 – .62 |
192.168.10.63 |
192.168.10.64/26 |
.65 – .126 |
192.168.10.127 |
192.168.10.128/26 |
.129 – .190 |
192.168.10.191 |
192.168.10.192/26 |
.193 – .254 |
192.168.10.255 |
В восемь подсетей /27 (шаг 32) сеть делится так: .0, .32, .64, .96, .128, .160, .192, .224, в каждой по 30 узлов.
VLSM: подсети разного размера
Равное деление удобно, но расточительно. Серверам нужно 20 адресов, а канал между двумя маршрутизаторами обойдётся двумя. Если резать всё на блоки по 64 адреса, на канал уйдёт целая подсеть /26. VLSM (Variable Length Subnet Mask, маски переменной длины) позволяет брать из одного блока подсети разных размеров. CIDR это допускает: префикс записывается явно для каждой подсети.
Порядок разбиения:
- Выпишите участки сети (подразделения, группы устройств) и число нужных узлов в каждом. Считайте с запасом на рост и включайте в число адрес шлюза.
- Для каждого подберите наименьший блок, где
2^(32 − n) − 2не меньше нужного числа. - Отсортируйте участки по убыванию размера.
- Размещайте блоки подряд, начиная с начала адресного блока. Адрес сети каждого блока должен быть кратен его размеру.
- Оставшееся пространство сохраните как резерв.
Note
Дальше в серии мы работаем с одной сетью 192.168.10.0/24. Разбиение ниже — отдельный учебный план: так можно было бы поделить тот же блок, если бы офису потребовалось несколько участков.
Допустим, нужны (числа уже с адресом шлюза): офис — 100 узлов, гости — 28, серверы — 20, управление оборудованием — 10 и два двухточечных канала между маршрутизаторами (по 2 узла). Подбираем блоки: 100 → /25 (126 узлов), 28 → /27 (30), 20 → /27 (30), 10 → /28 (14), 2 → /30 (2).
| Назначение | Нужно | Блок | Узлы | Broadcast |
|---|---|---|---|---|
| Офис | 100 | 192.168.10.0/25 |
.1 – .126 |
.127 |
| Гости | 28 | 192.168.10.128/27 |
.129 – .158 |
.159 |
| Серверы | 20 | 192.168.10.160/27 |
.161 – .190 |
.191 |
| Управление | 10 | 192.168.10.192/28 |
.193 – .206 |
.207 |
| Канал 1 | 2 | 192.168.10.208/30 |
.209 – .210 |
.211 |
| Канал 2 | 2 | 192.168.10.212/30 |
.213 – .214 |
.215 |
Карта адресного пространства:
.0 - .127 офис 192.168.10.0/25
.128 - .159 гости 192.168.10.128/27
.160 - .191 серверы 192.168.10.160/27
.192 - .207 управление 192.168.10.192/28
.208 - .211 канал 1 192.168.10.208/30
.212 - .215 канал 2 192.168.10.212/30
.216 - .255 резерв 192.168.10.216/29 и 192.168.10.224/27
Свободными остались 40 адресов (.216–.255), и они укладываются в два выровненных блока: 192.168.10.216/29 (адреса .216–.223) и 192.168.10.224/27 (адреса .224–.255).
Почему сначала большие блоки? Блок обязан начинаться с адреса, кратного его размеру. Если поставить канал /30 в начало (.0–.3), офис /25 уже не сможет занять .0–.127 и ему придётся начинаться с .128. Место между .4 и .127 разобьётся на мелкие остатки. Для двухточечных каналов можно взять и /31: тогда на канал уйдёт два адреса вместо четырёх, но нужна поддержка на обоих концах.
Участки обычно выносят в отдельные VLAN (виртуальные локальные сети), а между ними настраивают маршрутизацию. На оборудовании Cisco это разобрано в статьях Cisco с нуля 04: VLAN, access- и trunk-порты и Cisco с нуля 05: Маршрутизация между VLAN.
Суммирование (агрегация) сетей
Обратная задача: у вас несколько соседних сетей, и их нужно записать одним префиксом. Это нужно, например, чтобы в таблице маршрутов была одна строка вместо четырёх: так провайдер объявляет один агрегированный маршрут для крупного блока. Работу таблицы маршрутов мы разберём в статье 05.
Сети можно объединить в один префикс, если выполнены три условия:
- они идут подряд без пропусков;
- их число — степень двойки (2, 4, 8…);
- адрес первой сети кратен размеру всего блока. Для сетей
/24, как в примерах ниже, это значит: третий октет первой сети делится на число объединяемых сетей.
Пример: 192.168.20.0/24, 192.168.21.0/24, 192.168.22.0/24, 192.168.23.0/24. Их четыре, 20 делится на 4. Смотрим на третий октет в двоичной записи:
20 = 00010100
21 = 00010101
22 = 00010110
23 = 00010111
------
общие 6 бит: 000101
Общих бит в третьем октете 6, значит длина префикса 16 + 6 = 22. Результат: 192.168.20.0/22 (адреса 192.168.20.0–192.168.23.255). Проверка по шагу: 256 − 252 = 4, а 20 кратно 4.
Не всегда получится так же. Сети 192.168.21.0/24–192.168.24.0/24 идут подряд, их четыре, но 21 не делится на 4: единым префиксом без лишнего их не описать. Минимальный набор: 192.168.21.0/24, 192.168.22.0/23 и 192.168.24.0/24. Самый длинный единый префикс, который накроет все четыре, — 192.168.16.0/20 (адреса 192.168.16.0–192.168.31.255), но в него попадут ещё 12 чужих сетей /24. Агрегат должен покрывать только ваши сети, иначе маршрут «заберёт» трафик, предназначенный другим.
Практика
Решите, а потом сверьтесь с ответами.
Упражнение 1. Для адреса 192.168.10.77/27 найдите адрес сети, broadcast, диапазон узлов и число узлов.
Ответ: шаг 32; 77 лежит между 64 и 96; сеть 192.168.10.64/27; broadcast 192.168.10.95; узлы .65–.94; их 30.
Упражнение 2. В одной ли подсети 192.168.10.100/26 и 192.168.10.130/26?
Ответ: нет. Шаг 64: адрес .100 лежит в сети 192.168.10.64/26 (.64–.127), а .130 — в 192.168.10.128/26 (.128–.191). Для связи между ними нужен маршрутизатор.
Упражнение 3. Какой самый длинный префикс (то есть самая маленькая подсеть) подойдёт для сети: а) 50 компьютеров и 1 шлюз; б) 14 компьютеров и 1 шлюз?
Ответ: а) нужно 51 адрес; блок /26 даёт 62 узла, значит /26. б) нужно 15 адресов; /28 даёт только 14, значит /27 (30 узлов).
Упражнение 4. Разделите 192.168.10.0/24 для трёх подразделений и канала между маршрутизаторами: А — 60 узлов, Б — 28, В — 12, канал — 2 узла (шлюзы уже включены в числа).
Ответ: А — 192.168.10.0/26 (узлы .1–.62, broadcast .63); Б — 192.168.10.64/27 (.65–.94, broadcast .95); В — 192.168.10.96/28 (.97–.110, broadcast .111); канал — 192.168.10.112/30 (.113–.114, broadcast .115). Свободно с .116: 192.168.10.116/30, 192.168.10.120/29 и 192.168.10.128/25.
Упражнение 5. Объединяются ли в один префикс сети 192.168.4.0/24–192.168.7.0/24? А сети 192.168.6.0/24–192.168.9.0/24?
Ответ: первые четыре сети — да, 192.168.4.0/22 (4 делится на 4). Вторые четыре — нет, 6 не делится на 4. Их можно описать двумя префиксами: 192.168.6.0/23 и 192.168.8.0/23.
Типичные ошибки и недоразумения
- Пересечение подсетей. Сети
192.168.10.0/25(адреса.0–.127) и192.168.10.64/26(.64–.127) пересекаются: вторая целиком лежит в первой. Адрес192.168.10.100оказывается сразу «в двух сетях»: одни узлы будут искать его напрямую у себя, а маршрутизатор отправит пакеты на него в другую подсеть (он выбирает маршрут с более длинным префиксом, подробнее в статье 05). В итоге связь с этим адресом нестабильна или невозможна. - Адрес сети не выровнен. Запись
192.168.10.50/26как адрес сети неверна: адрес сети/26должен делиться на 64, то есть может быть.0,.64,.128или.192. Запись192.168.10.50/26корректна только как адрес узла в сети192.168.10.0/26. - Забытые «минус два» и отсутствие запаса. Для 62 компьютеров не хватит
/26, если нужен ещё шлюз: узлов 62, и шлюз займёт один из них. Считайте шлюз и запас на рост: блок «впритык» придётся менять при первом росте сети, а перенумерация обходится дороже нескольких лишних адресов. - Использование
/31не на двухточечном канале. Режим предназначен только для линков из двух устройств. - Путаница масок и инверсных (wildcard) масок. Для
/24обычная маска255.255.255.0, инверсная0.0.0.255. В настройках адресов на компьютерах нужна обычная, а в классических списках доступа Cisco — инверсная.
Проверьте себя
- Сколько адресов и сколько узлов в сети
/27? 32 адреса и 30 узлов (2⁵ = 32, минус адрес сети и broadcast). - Чем особенна сеть
/31? В ней два адреса, и на двухточечном канале оба считаются адресами узлов (направленного broadcast нет). - Можно ли назначить компьютеру адрес
192.168.10.127при маске255.255.255.128? Нет: это broadcast-адрес сети192.168.10.0/25(диапазон.0–.127). - Пересекаются ли сети
192.168.10.0/25и192.168.10.64/26? Да, вторая целиком входит в первую (.64–.127). - Найдите адрес сети и broadcast для
10.20.99.200/21. Шаг 8 в третьем октете; 99 лежит между 96 и 104; сеть10.20.96.0, broadcast10.20.103.255.
Что дальше
- Сети с нуля 05. Как пакет находит путь: шлюз, маршруты и ARP — как хост и маршрутизатор используют маску при выборе пути.
- Сети с нуля 06. DHCP: как устройство получает адрес — как раздавать адреса из подсети автоматически.
- Таблица масок подсети — полная справочная таблица
/0–/32. - Cisco с нуля 06: Статическая маршрутизация и маршрут по умолчанию — как оборудование использует подсети и суммированные маршруты.
Источники
- RFC 4632: Classless Inter-domain Routing (CIDR) — префиксная запись, таблица размеров блоков, агрегация.
- RFC 1519: CIDR, an Address Assignment and Aggregation Strategy — предшественник RFC 4632 (1993), причины отказа от классов.
- RFC 791: Internet Protocol — формат адресов с классами A, B, C.
- RFC 950: Internet Standard Subnetting Procedure — основной документ о подсетях (STD 5); содержит и устаревшую рекомендацию не использовать подсети из нулей и единиц.
- RFC 1122: Requirements for Internet Hosts — повтор той же рекомендации в требованиях к хостам.
- RFC 1812: Requirements for IP Version 4 Routers — выбор маршрута с самым длинным префиксом; снятие запрета на подсети из нулей и единиц.
- RFC 1878: Variable Length Subnet Table For IPv4 — таблица подсетей; пометка об устаревании исключения первой и последней подсети.
- RFC 3021: Using 31-Bit Prefixes on IPv4 Point-to-Point Links — префикс
/31на двухточечных каналах. - Microsoft Learn: TCP/IP addressing and subnetting — пример деления сети маской
255.255.255.192, первый и последний адрес сети.