IPv4 і підмережі: як працюють маски, CIDR та VLSM

⏱ 8 min read • TECH

У конфігурації мережі є блок 10.45.12.0/23, а сервер має адресу 10.45.13.150. Чи належить він до цього блоку? Де закінчується підмережа і скільки пристроїв у ній можна розмістити?

Відповісти допомагає маска: вона визначає, яка частина IPv4-адреси позначає мережу, а яка — хост усередині неї. Коли зрозуміло, як проходить ця межа, можна і перевіряти готові конфігурації, і планувати власні підмережі.

Розберемо це від двійкового запису до розподілу адрес між кількома VLAN. корисно буде тим, хто вже зустрічав IP-адресу й шлюз у налаштуваннях, але хоче зрозуміти логіку їхньої роботи.

IPv4-адреса: чотири октети, 32 біти

IPv4-адреса має довжину 32 біти. Для зручності ми записуємо її як чотири десяткові числа, розділені крапками. Кожне число представляє 8 бітів — октет, значення якого лежить у межах від 0 до 255.

Наприклад, адреса 192.168.1.10 у двійковому вигляді:

192      .168      .1        .10
11000000 .10101000 .00000001 .00001010

Кожна позиція в октеті має свою вагу:

Вага біта1286432168421
Число 19211000000
Число 16810101000

Тому 192 = 128 + 64, а 168 = 128 + 32 + 8. Це стане в пригоді, коли будемо переводити маску з двійкового запису в десятковий.

Де мережа, а де хост

У парі адреса + маска частина бітів визначає мережевий префікс, а решта — хостову частину. Межа може проходити всередині октету.

Адреса 192.168.1.10/24: перші 24 біти — мережева частина, останні 8 — хостова

Адреса 192.168.1.10 сама по собі не повідомляє, де ця межа. З маскою /24 перші 24 біти належать мережевій частині, останні 8 — хостовій. З /26 це вже 26 і 6 бітів відповідно.

Маска підмережі та запис CIDR

У масці для CIDR одиниці йдуть суцільно від початку, а після них — нулі. Одиниці виділяють мережеву частину адреси, нулі — хостову.

Побітове AND адреси 192.168.1.10 і маски 255.255.255.0 дає адресу мережі 192.168.1.0

Маска 255.255.255.0 у двійковому записі має 24 одиниці:

11111111.11111111.11111111.00000000

Її можна записати коротше: /24. Число після слеша — довжина префікса, тобто кількість початкових одиниць у масці. Такий запис використовується в CIDR — Classless Inter-Domain Routing.

ПрефіксМаскаБітів для хостової частини
/23255.255.254.09
/24255.255.255.08
/26255.255.255.1926
/32255.255.255.2550

Що довший префікс, то менше адрес у блоці. /26 містить 64 адреси, /24 — 256, а /23 — 512.

Як знайти адресу мережі: побітове AND

Щоб отримати адресу мережі, виконуємо побітове AND між IP-адресою та маскою. Результат дорівнює 1 лише там, де обидва біти дорівнюють 1. Маска зберігає мережеву частину й обнуляє хостову.

Для 192.168.1.10/24:

Адреса:  11000000.10101000.00000001.00001010
Маска:   11111111.11111111.11111111.00000000
         ----------------------------------- AND
Мережа:  11000000.10101000.00000001.00000000
         192.168.1.0

Якщо застосувати ту саму маску до 192.168.1.50, отримаємо ту саму адресу мережі: 192.168.1.0. Для 192.168.2.50 результат буде іншим: 192.168.2.0.

Коли пакет іде через шлюз

У типовій конфігурації хост із 192.168.1.10/24 має маршрут до безпосередньо підключеної мережі 192.168.1.0/24 і маршрут за замовчуванням через шлюз.

Для адреси 192.168.1.50 підходить маршрут локальної мережі. На Ethernet хост використовує ARP, щоб дізнатися MAC-адресу одержувача, якщо її ще немає в кеші, і надсилає кадр безпосередньо йому.

Для 192.168.2.50 локальний маршрут не підходить. Якщо окремого маршруту немає, хост використовує шлюз за замовчуванням: дізнається MAC-адресу шлюзу й передає кадр йому. IP-адресою призначення пакета залишається 192.168.2.50.

Остаточне рішення визначає таблиця маршрутизації. Якщо підходять кілька маршрутів, перевагу має найдовший відповідний префікс — longest prefix match. Тому окремий маршрут до /32 може мати перевагу над підключеною мережею /24.

Неправильна маска може змусити хост вважати віддалену адресу локальною. Тоді він намагатиметься знайти одержувача через ARP замість передачі пакета шлюзу. Це одна з причин перевіряти маску разом з адресою та маршрутами під час діагностики.

Навіщо ділити мережу на підмережі

Subnetting — це поділ адресного блоку на менші блоки з довшими префіксами. Наприклад, одну /24 можна поділити на чотири /26.

Поділ 192.168.1.0/24 на чотири підмережі /26 по 64 адреси з початками .0, .64, .128 і .192

Це допомагає окремо планувати адреси для робочих станцій, серверів, гостьових пристроїв і мережі керування. Між сегментами можна налаштовувати маршрути та правила доступу.

Водночас IP-підмережа й широкомовний домен — різні поняття. Призначення різних масок або префіксів саме по собі не ізолює Ethernet-трафік. Для окремих широкомовних доменів зазвичай використовують VLAN або фізично окремі сегменти, а для обміну між ними — маршрутизатор чи L3-комутатор.

ARP-запити залишаються в межах свого широкомовного домену. Велика кількість пристроїв збільшує обсяг такого трафіку, але сама по собі не означає, що обов’язково виникне broadcast storm.

Як розрахувати розмір підмережі

Нехай довжина префікса — p. Тоді для хостової частини залишається h = 32 - p бітів, а загальна кількість адрес дорівнює 2^h.

У звичайній IPv4-підмережі з broadcast дві адреси мають спеціальне призначення:

  • Усі хостові біти дорівнюють 0 — адреса мережі.
  • Усі хостові біти дорівнюють 1 — broadcast-адреса підмережі.

Тому для таких підмереж кількість адрес для інтерфейсів дорівнює 2^h - 2. Окремі випадки /31 і /32 розглянемо нижче.

Приклад: чотири рівні підмережі з однієї /24

Маємо 192.168.1.0/24. Потрібно отримати чотири однакові підмережі.

Щоб розрізняти чотири блоки, потрібні два додаткові біти: 2^2 = 4. Подовжуємо префікс на 2 — отримуємо /26.

Для хостової частини залишається 32 - 26 = 6 бітів. Кожен блок містить 2^6 = 64 адреси, з яких 62 можна призначити інтерфейсам.

Маска /26 — 255.255.255.192. В останньому октеті мережі починаються з кроком 256 - 192 = 64:

ПідмережаАдреси для інтерфейсівBroadcast
192.168.1.0/26192.168.1.1–192.168.1.62192.168.1.63
192.168.1.64/26192.168.1.65–192.168.1.126192.168.1.127
192.168.1.128/26192.168.1.129–192.168.1.190192.168.1.191
192.168.1.192/26192.168.1.193–192.168.1.254192.168.1.255

Broadcast — остання адреса блоку. Для третьої підмережі це 192.168.1.191, тобто адреса перед початком четвертої.

Якщо межа проходить у третьому октеті

Повернімося до задачі зі вступу: чи належить 10.45.13.150 до 10.45.12.0/23?

Маска /23 — 255.255.254.0. Крок у третьому октеті дорівнює 256 - 254 = 2. Отже, блоки починаються з 10.45.0.0, 10.45.2.0, 10.45.4.0 і так далі.

Блок 10.45.12.0/23 охоплює:

ПараметрЗначення
Адреса мережі10.45.12.0
Перша адреса для інтерфейсу10.45.12.1
Остання адреса для інтерфейсу10.45.13.254
Broadcast10.45.13.255
Усього адрес / для інтерфейсів512 / 510

Так, 10.45.13.150 належить до цього блоку. Підмережа охоплює два послідовні значення третього октету: 12 і 13.

Правило кроку застосовуємо до октету, в якому проходить межа префікса. Для /26 це четвертий октет, для /23 — третій. Наступні октети повністю належать хостовій частині.

Як підібрати маску під кількість пристроїв

Потрібна мережа для 100 серверів усередині 10.50.0.0/16. Шукаємо найменшу кількість хостових бітів, для якої вистачить адрес:

2^6 - 2 = 62    — недостатньо
2^7 - 2 = 126   — достатньо

Залишаємо 7 бітів для хостів: 32 - 7 = 25. Потрібна підмережа /25 з маскою 255.255.255.128.

Наприклад, 10.50.0.0/25 має адреси для інтерфейсів від 10.50.0.1 до 10.50.0.126, broadcast — 10.50.0.127. Наступна /25 починається з 10.50.0.128, після неї — 10.50.1.0.

Під час планування рахуємо також адреси шлюзів, віртуальні адреси та резерв на розширення. У хмарного провайдера можуть бути додаткові резервування: математична місткість підмережі не завжди дорівнює кількості адрес, доступних для ваших серверів.

VLSM: підмережі різного розміру

Якщо всі створені підмережі мають однакову довжину префікса, це FLSM — Fixed Length Subnet Mask. Так ми поділили /24 на чотири /26.

VLSM — Variable Length Subnet Mask — дозволяє виділяти з одного блоку підмережі різного розміру. Це корисно, коли одному сегменту потрібні 100 адрес для пристроїв, іншому — 20, а з’єднанню між маршрутизаторами — лише дві.

Візьмемо 192.168.10.0/24 і такі потреби:

  • Продажі — 100 пристроїв.
  • IT — 50 пристроїв.
  • Керування — 20 пристроїв.
  • Два з’єднання між маршрутизаторами — по 2 інтерфейси.

Для цього прикладу використаємо /30 на з’єднаннях між маршрутизаторами. Вважаємо, що потреби сегментів разом зі шлюзами вкладаються у вибрані блоки.

Зручно починати з найбільшого блоку й поступово переходити до менших. При послідовному розподілі з початку вільної /24 це допомагає зберігати вирівнювання адрес:

СегментПідмережаАдреси для інтерфейсівBroadcast
Продажі192.168.10.0/25192.168.10.1–192.168.10.126192.168.10.127
IT192.168.10.128/26192.168.10.129–192.168.10.190192.168.10.191
Керування192.168.10.192/27192.168.10.193–192.168.10.222192.168.10.223
З’єднання A–Б192.168.10.224/30192.168.10.225–192.168.10.226192.168.10.227
З’єднання Б–В192.168.10.228/30192.168.10.229–192.168.10.230192.168.10.231

Розміри блоків: 128 + 64 + 32 + 4 + 4 = 232 адреси. Діапазон від 192.168.10.232 до 192.168.10.255 залишається вільним.

Цей залишок має 24 адреси й не є одним CIDR-блоком. Його можна представити двома блоками: 192.168.10.232/29 і 192.168.10.240/28.

Початок підмережі має відповідати її розміру. Для /26 останній октет може бути 0, 64, 128 або 192. Запис 192.168.10.160/26 позначає адресу всередині 192.168.10.128/26, а не початок нового блоку.

Агрегація маршрутів: кілька префіксів в одному записі

Route summarization дозволяє представити кілька менших мереж одним спільним префіксом. Наприклад:

192.168.0.0/24
192.168.1.0/24
192.168.2.0/24
192.168.3.0/24
       ↓
192.168.0.0/22

Маска /22 — 255.255.252.0, крок у третьому октеті — 4. Цей блок точно охоплює наведені чотири /24.

Агрегація скорочує кількість записів у таблицях маршрутизації. Вона не об’єднує VLAN і не змінює маски на пристроях. Узагальнений маршрут має вести в правильному напрямку для всього оголошеного блоку; окремі винятки можна описувати конкретнішими маршрутами.

Окремі випадки: /31 і /32

/31 для з’єднання точка-точка

Звичайна /30 містить чотири адреси, дві з яких можна призначити інтерфейсам. Для з’єднання лише двох маршрутизаторів можна використати /31, якщо обидва пристрої підтримують таку конфігурацію.

RFC 3021 визначає використання обох адрес /31 як адрес кінцевих точок. Окремі адреси мережі та directed broadcast у цьому випадку не резервуються.

Наприклад, у 192.168.10.224/31 одному кінцю можна призначити 192.168.10.224, іншому — 192.168.10.225. Формула 2^h - 2 тут не застосовується. Це спеціальний випадок для point-to-point, його не слід переносити на звичайний LAN із кількома пристроями.

/32 для однієї адреси

Префікс /32 містить рівно одну адресу. У таблиці маршрутизації це маршрут до конкретної адреси — host route.

Такі адреси також часто призначають loopback-інтерфейсам маршрутизаторів. Проте /32 сам по собі не означає loopback: це довжина префікса, а призначення інтерфейсу визначається конфігурацією. Окремо від цього існує спеціальний IPv4-блок 127.0.0.0/8 для локального loopback.

Шпаргалка CIDR

ПрефіксМаскаУсього адресАдрес для інтерфейсів
/23255.255.254.0512510
/24255.255.255.0256254
/25255.255.255.128128126
/26255.255.255.1926462
/27255.255.255.2243230
/28255.255.255.2401614
/29255.255.255.24886
/30255.255.255.25242
/31255.255.255.25422 на point-to-point
/32255.255.255.2551Одна конкретна адреса

Значення для /23–/30 наведені для звичайних підмереж із резервуванням адреси мережі та broadcast, без додаткових резервувань платформи.

Як перевіряти свої розрахунки

Для ручного розрахунку достатньо знайти адресу мережі, розмір блоку та його останню адресу. Результат можна перевірити стандартним модулем ipaddress у Python 3:

from ipaddress import IPv4Address, IPv4Network

network = IPv4Network("10.45.12.0/23")

print(network.network_address)                    # 10.45.12.0
print(network.broadcast_address)                  # 10.45.13.255
print(network.num_addresses)                      # 512
print(IPv4Address("10.45.13.150") in network)       # True

Для практики візьміть адресу 10.5.20.100/27. Маска /27 дає крок 32 в останньому октеті. Число 100 потрапляє в блок 96–127, отже мережа — 10.5.20.96/27, адреси для інтерфейсів — .97–.126, broadcast — .127.

Основне правило: спочатку визначте межі блоку, потім розподіляйте адреси всередині нього. Для VLSM додатково перевірте, що блоки правильно вирівняні, не перетинаються і вміщують усі потрібні інтерфейси.

Детальніше про префікси й агрегацію — у RFC 4632, про адресацію та поведінку IPv4-хостів — у RFC 1122.

Comments

© 2025 CodeByMe.de | Engineering