Адресация IPv4 и разбиение на подсети
В темах 4 и 5 узлы находили друг друга по MAC-адресам, а коммутаторы учились, за каким портом какой адрес находится. Этот способ хорош в пределах широковещательного домена, но не масштабируется дальше: MAC-адрес ничего не говорит о местоположении узла, и коммутатору приходится помнить каждый адрес отдельно и рассылать лавиной кадры к ещё не изученным. Сеть из миллиардов узлов на таком принципе построить нельзя. Сетевой уровень решает задачу доставки между сетями иначе — с помощью адресов, в которых закодировано, к какой сети принадлежит узел. Такие адреса и рассматриваются в этой теме.
Протокол IP четвёртой версии (англ. Internet Protocol version 4, IPv4) использует 32-битные адреса 1. Каждый адрес делится на две части: старшие биты указывают на сеть, младшие — на узел внутри неё. Граница между частями и способы её задания составляют основную техническую сторону темы: от жёсткой классовой схемы 1981 года к бесклассовой адресации CIDR, позволяющей нарезать адресное пространство блоками любой длины, кратной степени двойки, и объединять маршруты к соседним блокам в один. Практическая сторона — расчёт подсетей: по адресу и префиксу найти сеть, широковещательный адрес и диапазон узлов, разделить выданный организации блок на подсети под отделы и сегменты, составить адресный план с запасом на рост.
Изложение построено так. Сначала разбираются структура адреса, двоичная запись и маска. Затем прослеживается история перехода от классов к CIDR и вводится агрегирование маршрутов. Третий раздел посвящён специальным адресам по реестру IANA, четвёртый — технике расчёта подсетей с проверкой модулем ipaddress языка Python, пятый — тому, как адреса распределяются между организациями и почему адреса IPv4 закончились. Устройство заголовка IP и работа ARP рассматриваются в теме 7, выбор маршрута по адресу — в теме 8, автоматическая выдача адресов — в теме 14, адресация IPv6 — в теме 11.
Иерархическая адресация и структура адреса IPv4
Зачем адресу иерархия
Адрес может быть плоским или иерархическим. Плоский адрес — уникальный номер без внутренней структуры, как MAC-адрес или номер паспорта: по нему можно опознать объект, но нельзя понять, где он находится. Иерархический адрес устроен как почтовый: страна, город, улица, дом, квартира. Почтовому отделению в Москве не нужно знать все дома Новосибирска — достаточно знать, что письма с городом «Новосибирск» отправляются в определённый сортировочный центр. Только последнее звено цепочки разбирается с номером квартиры.
Адрес IPv4 иерархичен в том же смысле. Маршрутизатор хранит не адреса отдельных узлов, а записи о сетях: «адреса, начинающиеся с таких-то битов, — через такой-то соседний маршрутизатор». Одна запись покрывает сколько угодно узлов одной сети, а при правильно спланированном распределении адресов — и множество соседних сетей сразу. Благодаря этому таблица маршрутизации ядра Интернета насчитывает около миллиона записей при нескольких миллиардах подключённых устройств, а таблица маршрутизатора небольшой организации — единицы записей. Плата за иерархию — адрес узла зависит от его места в сети 13: при переезде в другую сеть узел получает новый адрес, и это одна из причин, по которым IP-адреса на практике назначаются автоматически (тема 14).
Заметим, что адрес IP, строго говоря, принадлежит не узлу, а его сетевому интерфейсу. Маршрутизатор с тремя интерфейсами имеет три адреса в трёх разных сетях, а хост с проводным и беспроводным подключениями — два. Говоря «адрес узла», подразумевают адрес интерфейса, если из контекста не следует иное.
Двоичная и десятичная запись
Адрес IPv4 — 32-битное число; всего таких чисел 2³² = 4 294 967 296. Для записи человеком используется точечно-десятичная нотация (англ. dotted decimal notation): 32 бита делятся на четыре байта, называемых октетами (англ. octet), каждый октет записывается десятичным числом от 0 до 255, и числа разделяются точками 1. Адрес 192.168.10.77 в двоичной записи выглядит так:
192 168 10 77
11000000 10101000 00001010 01001101
Перевод октета в двоичную форму выполняется разложением по степеням двойки: веса битов слева направо равны 128, 64, 32, 16, 8, 4, 2, 1. Число 77 = 64 + 8 + 4 + 1, поэтому установлены биты с весами 64, 8, 4 и 1: 01001101. Обратный перевод — суммирование весов установленных битов: 11000000 = 128 + 64 = 192. При расчёте подсетей полезно помнить значения октетов, состоящих из единиц в старших разрядах, — именно такие октеты встречаются в масках:
| Двоичная запись | Десятичное значение | Число единиц |
|---|---|---|
10000000 | 128 | 1 |
11000000 | 192 | 2 |
11100000 | 224 | 3 |
11110000 | 240 | 4 |
11111000 | 248 | 5 |
11111100 | 252 | 6 |
11111110 | 254 | 7 |
11111111 | 255 | 8 |
Точечно-десятичная запись — лишь удобство для человека. Компьютер работает с адресом как с 32-битным числом, и в заголовке пакета адрес передаётся четырьмя байтами в сетевом порядке (старший байт первым). Отсюда несколько неочевидных следствий: запись 010.1.1.1 некоторые программы понимают как восьмеричную (010 = 8), а ping 3232238157 в Linux отправит эхо-запрос на 192.168.10.77, потому что 3 232 238 157 — то же число в десятичной записи целиком.
Сеть и узел: маска и длина префикса
Граница между сетевой частью и номером узла задаётся маской подсети (англ. subnet mask) — 32-битным числом, у которого единицы стоят в разрядах сетевой части, а нули — в разрядах номера узла. Маска записывается так же, как адрес, точечно-десятичной нотацией: маска 255.255.255.192 содержит 26 единиц и 6 нулей. Единицы маски обязаны идти подряд с самого старшего разряда; ранние стандарты формально допускали «разрывные» маски 2, но современная адресация и все реализации маршрутизации требуют непрерывности 3. Поэтому маску однозначно определяет число единиц — длина префикса (англ. prefix length), — и принято записывать адрес вместе с длиной префикса через косую черту: 192.168.10.77/26. Такая запись называется нотацией CIDR.
Сетевая часть адреса — его префикс — вычисляется поразрядной операцией «И» (англ. bitwise AND) адреса и маски: в разрядах, где у маски единица, бит адреса сохраняется, где ноль — обнуляется. Номер узла получается операцией «И» адреса с инвертированной маской.
Рисунок показывает вычисление для адреса 192.168.10.77/26. Первые три октета маски — 255, они пропускают октеты адреса без изменений. Четвёртый октет маски 11000000 оставляет от 01001101 только два старших бита: 01000000 = 64. Сеть — 192.168.10.64/26. Номер узла — шесть младших битов 001101 = 13, то есть узел 13 в этой сети. В сети с префиксом длины p номер узла занимает 32 − p бит, поэтому сеть содержит 2³²⁻ᵖ адресов. Для /26 это 2⁶ = 64 адреса: от 192.168.10.64 до 192.168.10.127.
Два адреса каждой сети зарезервированы. Адрес, у которого все биты номера узла нулевые, обозначает саму сеть (англ. network address) и не назначается интерфейсу. Адрес, у которого все биты номера узла единичные, — широковещательный адрес этой сети (англ. directed broadcast address): пакет на него доставляется всем узлам сети 2. Для назначения интерфейсам остаётся 2³²⁻ᵖ − 2 адресов; в сети /26 — 62 адреса, от .65 до .126. Исключения из этого правила — сети /31 и /32 — рассматриваются в разделе о специальных адресах.
Операционная система применяет маску постоянно. Получив от приложения пакет для отправки, хост сравнивает префикс адреса назначения с префиксом своего интерфейса: если они совпадают, получатель находится в той же сети, и пакет отправляется ему непосредственно (сначала нужно узнать его MAC-адрес — тема 7); если нет — пакет отправляется маршрутизатору. В Linux адрес с префиксом задаётся командой ip addr add; ключ brd + просит вычислить широковещательный адрес из префикса. Ядро сразу добавляет в таблицу маршрутизации запись о непосредственно подключённой сети:
ip addr add 10.5.0.1/24 brd + dev eth0
ip -4 addr show dev eth0
ip route
6: eth0@x: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
inet 10.5.0.1/24 brd 10.5.0.255 scope global eth0
valid_lft forever preferred_lft forever
10.5.0.0/24 dev eth0 proto kernel scope link src 10.5.0.1
Поле brd показывает широковещательный адрес, а строка маршрута — сеть, которую ядро считает непосредственно достижимой. Неверная маска — одна из самых частых ошибок настройки: узел с маской /16 вместо /24 будет пытаться достичь «соседей» непосредственно, хотя они находятся за маршрутизатором, а узел с маской /28 вместо /24 отправит маршрутизатору пакеты для соседей по сегменту.
От классов к бесклассовой адресации
Классовая адресация
Первоначальная схема, закреплённая в RFC 791 в 1981 году, не нуждалась в маске: граница между сетью и узлом определялась первыми битами самого адреса 1. Адресное пространство делилось на классы.
| Класс | Первые биты | Диапазон первого октета | Сетевая часть | Адресов в сети | Назначение |
|---|---|---|---|---|---|
| A | 0 | 0–127 | 8 бит | 16 777 216 | крупные сети |
| B | 10 | 128–191 | 16 бит | 65 536 | средние сети |
| C | 110 | 192–223 | 24 бита | 256 | малые сети |
| D | 1110 | 224–239 | — | — | групповая рассылка |
| E | 1111 | 240–255 | — | — | зарезервировано |
Как видно на рисунке, классовая схема позволяет маршрутизатору определить сетевую часть по одному взгляду на первые биты адреса. Но выбор оказался слишком грубым. Сетей класса A было всего 128, и каждая содержала более 16 миллионов адресов; ими владели крупные корпорации и ведомства, использовавшие лишь малую долю. Сеть класса C в 256 адресов была мала для большинства организаций, поэтому они запрашивали сеть класса B на 65 536 адресов, даже если им нужно было 2000. К началу 1990-х годов стало ясно, что сетей класса B хватит лишь на несколько лет, а если раздавать вместо них множество сетей класса C, таблицы маршрутизации магистральных маршрутизаторов разрастутся до неприемлемых размеров 3. Две проблемы — расточительное расходование адресов и рост таблиц — потребовали отказаться от классов.
Подсети и бесклассовая маршрутизация
Первый шаг был сделан ещё в 1985 году: RFC 950 разрешил организации делить свою классовую сеть на подсети (англ. subnets), заимствуя старшие биты номера узла под номер подсети и задавая границу маской 2. Сеть класса B 172.16.0.0 можно было разбить, например, на 256 подсетей по 256 адресов маской 255.255.255.0. Снаружи организация по-прежнему выглядела одной сетью класса B, и внешние маршрутизаторы о подсетях не знали.
Решающим стал переход к бесклассовой междоменной маршрутизации (англ. Classless Inter-Domain Routing, CIDR), предложенной в 1993 году в RFC 1519 и обновлённой в 2006 году в RFC 4632 3. CIDR отменил классы целиком: граница между сетью и узлом может проходить после любого бита, длина префикса передаётся явно вместе с каждым маршрутом, а блоки адресов выдаются организациям размером «по потребности» — 2ᵏ адресов при подходящем k. Организации, которой нужно 2000 адресов, выдаётся блок /21 (2048 адресов), а не сеть класса B. Протоколы маршрутизации, передававшие только адрес сети без маски, были заменены или дополнены (BGP четвёртой версии, OSPF и RIPv2 передают длину префикса), и маршрутизаторы научились выбирать маршрут по наибольшему совпадающему префиксу — подробно в теме 8.
Классовая терминология тем не менее сохранилась в профессиональной речи: «сеть класса C» часто говорят о любом блоке /24, а некоторые программы при отсутствии явной маски подставляют классовую. Настраивая адрес, маску следует указывать всегда.
Агрегирование маршрутов
Вторая сторона CIDR — агрегирование (англ. route aggregation, также summarization, суммаризация): несколько соседних блоков с общим префиксом можно описать одной записью с более коротким префиксом 3. Пусть филиалу выделены сети 10.20.0.0/24, 10.20.1.0/24, 10.20.2.0/24 и 10.20.3.0/24. Выпишем третий октет:
10.20.0.0 ... 00000000
10.20.1.0 ... 00000001
10.20.2.0 ... 00000010
10.20.3.0 ... 00000011
У всех четырёх сетей совпадают первые 16 бит и ещё 6 старших бит третьего октета — всего 22 бита, а различаются только два последних бита третьего октета. Значит, вместе они образуют блок 10.20.0.0/22, и маршрутизатору главного офиса достаточно одной записи «10.20.0.0/22 — через маршрутизатор филиала» вместо четырёх. Блок /22 при этом содержит ровно эти четыре сети, не больше и не меньше.
Агрегировать можно не любые соседние сети. Сети 10.20.1.0/24 и 10.20.2.0/24 соседние, но в одну сеть /23 не объединяются: блок /23 должен начинаться с адреса, у которого последний бит сетевой части равен нулю, а 10.20.1.0 (третий октет 00000001) этому не удовлетворяет. Ближайший общий блок — 10.20.0.0/22 — включает и чужие сети 10.20.0.0/24 и 10.20.3.0/24. Общее правило: блок длины p начинается с адреса, кратного 2³²⁻ᵖ, и 2ᵏ блоков длины p объединяются в один блок длины p − k, только если первый из них выровнен по границе 2³²⁻⁽ᵖ⁻ᵏ⁾.
Агрегирование оправдывает иерархическое распределение адресов. Провайдер, получивший блок /16, выдаёт клиентам блоки из него и объявляет в Интернет один маршрут /16, а не сотни клиентских. Организация, раздавшая адреса филиалам из непрерывных выровненных блоков, обходится в главном офисе одной записью на филиал. Если же адреса раздавались бессистемно, агрегирование становится невозможным, и каждый новый сегмент прибавляет запись в таблицы всех маршрутизаторов. Поэтому адресный план составляют с расчётом на агрегирование с самого начала.
Специальные адреса
Адреса сети, широковещательные адреса и короткие сети
Помимо адресов сети и направленного широковещания, о которых говорилось выше, есть ограниченный широковещательный адрес (англ. limited broadcast) 255.255.255.255: пакет на него доставляется всем узлам своего сегмента и никогда не пересылается маршрутизаторами. Им пользуется, например, клиент DHCP, ещё не знающий ни своего адреса, ни адреса сети (тема 14). Направленное широковещание в чужую сеть (пакет на 192.168.10.127 извне сети 192.168.10.64/26) маршрутизаторы по умолчанию тоже не пересылают: в 1990-е годы такие пакеты использовались для атак с усилением (англ. smurf attack), когда один пакет, отправленный на широковещательный адрес чужой сети, вызывал ответы всех её узлов.
Резервирование двух адресов неприятно на звеньях «точка — точка» между двумя маршрутизаторами: сеть /30 содержит четыре адреса, из которых используются два, и половина адресного пространства звеньев тратится впустую. RFC 3021 разрешил использовать на таких звеньях сети /31 из двух адресов без адреса сети и широковещательного: оба адреса назначаются интерфейсам 9. Префикс /32 обозначает один адрес; так записываются маршруты к отдельному узлу и адреса интерфейсов обратной петли маршрутизаторов.
| Префикс | Адресов | Узлов | Типичное применение |
|---|---|---|---|
| /24 | 256 | 254 | сегмент отдела, VLAN |
| /25 | 128 | 126 | половина сегмента |
| /26 | 64 | 62 | небольшой отдел |
| /27 | 32 | 30 | серверный сегмент |
| /28 | 16 | 14 | сегмент управления |
| /29 | 8 | 6 | небольшой блок публичных адресов клиента |
| /30 | 4 | 2 | звено «точка — точка» |
| /31 | 2 | 2 | звено «точка — точка» по RFC 3021 |
| /32 | 1 | 1 | адрес обратной петли маршрутизатора, маршрут к узлу |
Реестр адресов специального назначения
Ряд блоков адресного пространства IPv4 зарезервирован для особых целей. Их перечень ведёт IANA в реестре адресов специального назначения (англ. IANA IPv4 Special-Purpose Address Registry), правила ведения которого установлены RFC 6890 6. В таблице — блоки, которые встречаются на практике.
| Блок | Назначение | Маршрутизируется в Интернете | Документ |
|---|---|---|---|
0.0.0.0/8 | «этот узел в этой сети»; 0.0.0.0 — адрес источника до получения адреса, в сокетах — «все интерфейсы» | нет | RFC 791, RFC 6890 16 |
10.0.0.0/8 | частные адреса | нет | RFC 1918 4 |
100.64.0.0/10 | общее адресное пространство провайдеров для CGNAT | нет | RFC 6598 5 |
127.0.0.0/8 | обратная петля (англ. loopback), обычно 127.0.0.1 | нет | RFC 6890 6 |
169.254.0.0/16 | локальные адреса канала (англ. link-local) | нет | RFC 3927 7 |
172.16.0.0/12 | частные адреса (172.16.0.0–172.31.255.255) | нет | RFC 1918 4 |
192.0.0.0/24 | служебные назначения IETF | нет | RFC 6890 6 |
192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 | документация и примеры (TEST-NET-1, 2, 3) | нет | RFC 5737 8 |
192.168.0.0/16 | частные адреса | нет | RFC 1918 4 |
198.18.0.0/15 | тестирование производительности сетевого оборудования | нет | RFC 6890 6 |
224.0.0.0/4 | групповая рассылка (англ. multicast), бывший класс D | особые правила | RFC 5771 10 |
240.0.0.0/4 | зарезервировано (бывший класс E) | нет | RFC 6890 6 |
255.255.255.255/32 | ограниченное широковещание | нет | RFC 6890 6 |
Блок 127.0.0.0/8 целиком принадлежит интерфейсу обратной петли: пакет на любой его адрес не покидает узел. Это 16 миллионов адресов, используемых на практике одним 127.0.0.1, — наследие классовой эпохи, когда меньший блок выделить было нельзя. Блок 240.0.0.0/4 — ещё 268 миллионов адресов — формально свободен, но многие операционные системы и сетевое оборудование отказываются работать с такими адресами, и предложения вернуть его в оборот пока не приняты.
Частные, общие и локальные адреса
Частные адреса (англ. private addresses) RFC 1918 — три блока, которые любая организация может использовать внутри своей сети без согласования с кем-либо 4. Они не уникальны глобально: адрес 192.168.1.1 есть в миллионах домашних сетей. Поэтому маршрутизаторы Интернета не принимают маршрутов к частным адресам, а узел с частным адресом выходит в Интернет через трансляцию адресов NAT, заменяющую его адрес на публичный (тема 14). Выбор блока — дело вкуса и масштаба: 192.168.0.0/16 удобен для небольших сетей, 10.0.0.0/8 даёт 16 миллионов адресов для крупных организаций. Практический совет — избегать самых популярных сетей 192.168.0.0/24 и 192.168.1.0/24 в корпоративной сети: сотрудник, подключившийся через VPN из дома, где используется та же сеть, получит конфликт маршрутов.
Блок 100.64.0.0/10 выделен в 2012 году для провайдеров, которым не хватает публичных адресов для абонентов 5. Провайдер назначает абонентским маршрутизаторам адреса из этого блока и транслирует их в публичные на своём оборудовании — трансляция операторского уровня (англ. Carrier-Grade NAT, CGNAT). Отдельный блок понадобился потому, что частные адреса RFC 1918 уже использует сам абонент внутри дома, и одна и та же сеть по разные стороны абонентского маршрутизатора сделала бы маршрутизацию невозможной. Если интерфейс домашнего маршрутизатора со стороны провайдера имеет адрес из 100.64.0.0/10, абонент находится за CGNAT и входящие соединения из Интернета к нему невозможны без участия провайдера.
Локальные адреса канала 169.254.0.0/16 узел назначает себе сам, если в сети нет сервера DHCP: выбирает случайный адрес из блока и проверяет с помощью ARP, что он свободен 7. Такие адреса действуют только в пределах одного сегмента и маршрутизаторами не пересылаются. Появление адреса 169.254.x.y на рабочей станции — верный признак того, что она не получила адрес от DHCP. Адрес 169.254.169.254 используется облачными платформами для службы метаданных виртуальных машин.
Документационные блоки RFC 5737 предназначены для книг, статей и примеров конфигураций 8: в них можно писать «публичные» адреса, не рискуя, что читатель, скопировав пример, нарушит работу чужой сети. В этом курсе публичные адреса берутся из этих блоков.
Блок групповой рассылки 224.0.0.0/4 делится на подблоки по назначению 10. Адреса 224.0.0.0/24 локальны для сегмента (например, 224.0.0.5 — все маршрутизаторы OSPF, тема 9; 224.0.0.251 — mDNS); адреса 239.0.0.0/8 предназначены для использования внутри организации, как частные адреса для одноадресной связи. Групповой адрес обозначает не узел, а группу получателей и не может быть адресом источника.
Модуль ipaddress стандартной библиотеки Python знает реестр специальных адресов и позволяет проверить принадлежность адреса к категориям 11:
import ipaddress
for a in ["10.1.2.3", "100.64.1.1", "169.254.7.7", "192.0.2.10", "224.0.0.5", "8.8.8.8"]:
x = ipaddress.ip_address(a)
print(f"{a:12} private={x.is_private!s:5} global={x.is_global!s:5} "
f"link_local={x.is_link_local!s:5} multicast={x.is_multicast}")
10.1.2.3 private=True global=False link_local=False multicast=False
100.64.1.1 private=False global=False link_local=False multicast=False
169.254.7.7 private=True global=False link_local=True multicast=False
192.0.2.10 private=True global=False link_local=False multicast=False
224.0.0.5 private=False global=True link_local=False multicast=True
8.8.8.8 private=False global=True link_local=False multicast=False
Обратим внимание, что признак is_private в модуле понимается шире, чем в RFC 1918: он истинен для всех блоков, которые реестр IANA помечает как не глобально достижимые, включая документационные и локальные адреса канала, но не для общего адресного пространства 100.64.0.0/10, которое не является ни частным, ни глобальным. Признак is_global у группового адреса 224.0.0.5 истинен, хотя адреса 224.0.0.0/24 за пределы сегмента не выходят: модуль классифицирует адреса по реестру одноадресных блоков, а область действия групповых адресов не учитывает. Вывод получен на Python 3.10; в версиях 3.11.10+, 3.12.4+ и 3.13 классификация is_private/is_global была пересмотрена вслед за реестром IANA, поэтому на Ubuntu 24.04 (Python 3.12) вывод для части адресов может отличаться, поэтому для проверки принадлежности к RFC 1918 надёжнее явно сравнивать с тремя блоками.
Расчёт подсетей
Обратная задача: сеть по адресу
Самая частая задача — по адресу интерфейса и длине префикса найти адрес сети, широковещательный адрес, диапазон адресов узлов и их число. Вычисление через двоичную запись всегда возможно, но для расчётов в уме удобнее приём «интересного октета». Октет, в котором проходит граница префикса, называют интересным (при префиксе от 17 до 24 — третий, от 25 до 32 — четвёртый). Размер блока в этом октете равен 256 минус значение маски в нём. Адрес сети получается округлением интересного октета адреса вниз до числа, кратного размеру блока; октеты левее копируются из адреса, правее — заполняются нулями. Широковещательный адрес — адрес сети плюс размер блока минус единица в интересном октете и 255 во всех октетах правее.
Подробный пример. Дан адрес 172.16.45.201/21.
- Маска
/21: 8 + 8 + 5 единиц, то есть255.255.248.0. Интересный октет — третий, значение маски в нём 248 (11111000). - Размер блока: 256 − 248 = 8. Сети идут по третьему октету с шагом 8: 0, 8, 16, 24, 32, 40, 48, …
- Третий октет адреса — 45. Наибольшее кратное 8, не превышающее 45, — 40. Адрес сети:
172.16.40.0/21. - Широковещательный адрес: третий октет 40 + 8 − 1 = 47, четвёртый — 255:
172.16.47.255. - Адреса узлов: от
172.16.40.1до172.16.47.254; их число 2³²⁻²¹ − 2 = 2048 − 2 = 2046.
Проверим двоичной записью третьего октета: 45 = 00101101; маска оставляет пять старших бит 00101 и обнуляет три младших — 00101000 = 40. Совпадает. Модуль ipaddress даёт тот же результат:
import ipaddress
i = ipaddress.ip_interface("172.16.45.201/21")
n = i.network
print(n, n.netmask, n.broadcast_address, n[1], n[-2], n.num_addresses - 2)
172.16.40.0/21 255.255.248.0 172.16.47.255 172.16.40.1 172.16.47.254 2046
Тот же приём отвечает и на вопрос «находятся ли два адреса в одной сети». Адреса 172.16.40.10/21 и 172.16.47.200/21 — в одной сети (третьи октеты 40 и 47 попадают в один блок 40–47), а 172.16.39.250/21 — в соседней сети 172.16.32.0/21, хотя численно этот адрес ближе к первому, чем 172.16.47.200. Граница сетей определяется выравниванием блоков, а не близостью чисел.
Деление сети на равные подсети
Обратная операция — разделить блок на подсети. Если блок длины p нужно разделить на 2ᵏ равных подсетей, их префикс равен p + k, а размер каждой — 2³²⁻⁽ᵖ⁺ᵏ⁾. Разделим сеть 192.168.10.0/24 на четыре подсети: k = 2, префикс подсетей /26, размер 64 адреса.
| Подсеть | Адрес сети | Диапазон узлов | Широковещательный |
|---|---|---|---|
| 1 | 192.168.10.0/26 | .1–.62 | .63 |
| 2 | 192.168.10.64/26 | .65–.126 | .127 |
| 3 | 192.168.10.128/26 | .129–.190 | .191 |
| 4 | 192.168.10.192/26 | .193–.254 | .255 |
Если требуется не число подсетей, а число узлов в каждой, вычисляется минимальное h такое, что 2ʰ − 2 не меньше требуемого числа узлов, и префикс равен 32 − h. Для 100 узлов: 2⁶ − 2 = 62 мало, 2⁷ − 2 = 126 достаточно, префикс /25. В число узлов обязательно включается интерфейс маршрутизатора — шлюза сегмента, а также адреса принтеров, точек доступа, коммутаторов с управляющими адресами.
Исторически одна из подсетей вызывала сомнения: RFC 950 не рекомендовал использовать «нулевую» подсеть (первую, у которой номер подсети состоит из нулей) и подсеть «из всех единиц», так как их адреса сети и широковещательный совпадали с адресами исходной классовой сети 2. В бесклассовой адресации это ограничение потеряло смысл, и все подсети используются наравне 3. Старые учебники и задачники иногда сохраняют правило «2ᵏ − 2 подсетей» — в современной практике подсетей 2ᵏ.
VLSM и адресный план
Сегменты реальной сети имеют разные размеры, и деление на равные подсети расточительно: если все подсети сделать по размеру наибольшей, маленьким сегментам достанется много лишних адресов. Метод масок переменной длины (англ. Variable Length Subnet Masking, VLSM) выделяет каждому сегменту подсеть подходящего размера из общего блока 3. Чтобы блоки не пересекались и были правильно выровнены, применяется простой алгоритм: требования сортируются по убыванию размера, и подсети выделяются подряд, начиная с наибольшей; каждая следующая начинается с первого свободного адреса, выровненного по её размеру. При выделении по убыванию выравнивание соблюдается автоматически, потому что размер каждой следующей подсети делит размер всех предыдущих.
Составим адресный план офиса «Северного узла», которому выделен блок частных адресов 10.10.0.0/22 (1024 адреса). Требования заданы числом узлов, включая шлюз сегмента, и к каждому добавлен запас на рост 25 % с округлением вверх. Для двух звеньев «точка — точка» между маршрутизаторами запас не нужен.
| Сегмент | Узлов | С запасом | Префикс | Подсеть | Диапазон узлов | Широковещательный |
|---|---|---|---|---|---|---|
| Разработка | 200 | 250 | /24 | 10.10.0.0/24 | 10.10.0.1–.0.254 | 10.10.0.255 |
| Гостевая Wi-Fi | 120 | 150 | /24 | 10.10.1.0/24 | 10.10.1.1–.1.254 | 10.10.1.255 |
| Продажи | 100 | 125 | /25 | 10.10.2.0/25 | 10.10.2.1–.2.126 | 10.10.2.127 |
| Бухгалтерия | 45 | 57 | /26 | 10.10.2.128/26 | 10.10.2.129–.2.190 | 10.10.2.191 |
| Серверная | 20 | 25 | /27 | 10.10.2.192/27 | 10.10.2.193–.2.222 | 10.10.2.223 |
| Управление | 10 | 13 | /28 | 10.10.2.224/28 | 10.10.2.225–.2.238 | 10.10.2.239 |
| Звено офис — филиал | 2 | 2 | /30 | 10.10.2.240/30 | 10.10.2.241–.2.242 | 10.10.2.243 |
| Звено ядро — межсетевой экран | 2 | 2 | /30 | 10.10.2.244/30 | 10.10.2.245–.2.246 | 10.10.2.247 |
Проверим одно значение. Сегменту «Бухгалтерия» с запасом нужно 57 адресов узлов: 2⁶ − 2 = 62 ≥ 57, значит, префикс /26. После подсетей разработки, гостевой сети и продаж первый свободный адрес — 10.10.2.128; он кратен 64 (128 = 2 · 64), поэтому подсеть начинается прямо с него. Распределение занимает 760 адресов из 1024, свободными остаются 10.10.2.248/29 и 10.10.3.0/24. Свободный блок /24 в конце важнее, чем может показаться: он позволит без перенумерации добавить новый сегмент среднего размера или расширить один из существующих.
Рисунок показывает план в виде линейки адресного пространства. Видно, что подсети не пересекаются, каждая начинается на границе своего размера, а весь план агрегируется одной записью 10.10.0.0/22 для маршрутизаторов филиала и провайдера VPN. Хороший адресный план обладает и свойствами, которые не следуют из алгоритма, а задаются соглашениями: адрес шлюза в каждом сегменте выбирается единообразно (обычно первый адрес подсети, .1), номер VLAN связан с адресом (например, VLAN 20 — подсеть 10.10.2.0/25), диапазоны под статические адреса серверов и под выдачу по DHCP разделены, и план документирован в таблице, подобной приведённой выше.
Типичные ошибки адресного плана таковы. Пересечение подсетей: если «Продажам» выдать 10.10.2.0/24, этот блок включит и подсети бухгалтерии, серверной и управления, и маршрутизатор не сможет однозначно решить, в какой сегмент направить пакет. Неверное выравнивание: подсеть 10.10.2.160/26 не существует, потому что 160 не кратно 64, — адрес 10.10.2.160 с префиксом /26 принадлежит сети 10.10.2.128/26. Отсутствие запаса: сегмент, в который через год не помещаются новые сотрудники, приходится перенумеровывать вместе со всеми настройками и правилами межсетевого экрана. Разбросанность: подсети одного филиала, выделенные из разных частей адресного пространства, не агрегируются.
Проверка расчётов программой
Расчёт подсетей легко автоматизировать, и для проверки ручного расчёта модуль ipaddress незаменим 11. Объект IPv4Network поддерживает перечисление подсетей заданной длины, проверку вложенности и пересечения, исключение подсети из блока и объединение соседних блоков:
import ipaddress as ip
base = ip.ip_network("10.10.0.0/22")
plan = [ip.ip_network(s) for s in (
"10.10.0.0/24", "10.10.1.0/24", "10.10.2.0/25", "10.10.2.128/26",
"10.10.2.192/27", "10.10.2.224/28", "10.10.2.240/30", "10.10.2.244/30")]
assert all(n.subnet_of(base) for n in plan) # все внутри блока
assert not any(a.overlaps(b) for i, a in enumerate(plan) for b in plan[i+1:])
free = [base]
for n in plan: # вычесть занятые
free = [r for f in free for r in (f.address_exclude(n) if n.subnet_of(f) else [f])]
print(sorted(free))
print(list(ip.collapse_addresses(ip.ip_network(f"10.20.{k}.0/24") for k in range(4))))
print(ip.ip_network("10.10.2.160/26"))
[IPv4Network('10.10.2.248/29'), IPv4Network('10.10.3.0/24')]
[IPv4Network('10.20.0.0/22')]
Traceback (most recent call last):
...
ValueError: 10.10.2.160/26 has host bits set
Последняя строка программы показывает, что модуль отвергает «сеть», у которой установлены биты номера узла: 10.10.2.160/26 — это адрес узла, а не адрес сети. Для получения сети по адресу узла служит ip_interface(...).network или параметр strict=False. В лабораторной работе 6 на основе этого модуля пишется калькулятор подсетей, а в практическом занятии 6 решаются задачи на ручной расчёт.
Распределение адресного пространства
IANA, региональные регистратуры и локальные регистратуры
Уникальность публичных адресов обеспечивает иерархия организаций, называемая системой реестров интернет-номеров 12. На вершине находится IANA (англ. Internet Assigned Numbers Authority) — функция, исполняемая ныне организацией PTI в составе ICANN. IANA распределяет адресное пространство блоками /8 между пятью региональными интернет-регистратурами (англ. Regional Internet Registry, RIR):
- AFRINIC — Африка;
- APNIC — Азиатско-Тихоокеанский регион;
- ARIN — США, Канада, часть Карибского бассейна;
- LACNIC — Латинская Америка и часть Карибского бассейна;
- RIPE NCC — Европа, Ближний Восток и Центральная Азия, включая Россию.
Региональные регистратуры, в свою очередь, выделяют блоки своим членам — локальным интернет-регистратурам (англ. Local Internet Registry, LIR), которыми обычно выступают провайдеры и крупные организации. Провайдер назначает адреса из своего блока клиентам. Правила распределения в каждом регионе вырабатывает сообщество по открытой процедуре: в регионе RIPE NCC — рабочие группы RIPE, решения которых оформляются документами политики. Сведения о том, кому выделен блок, публикуются в базах данных регистратур и доступны по протоколу WHOIS и его преемнику RDAP (whois 193.0.6.139 вернёт запись о сети RIPE NCC).
Иерархия, изображённая на рисунке, повторяет иерархию самих адресов и служит агрегированию: адреса клиентов провайдера входят в его блок, и в таблицах маршрутизации Интернета провайдер представлен одним или несколькими префиксами. Организации, которые не хотят зависеть от провайдера при смене подключения, получают собственный независимый блок (англ. provider-independent, PI) и объявляют его по BGP (тема 10). Цена — лишняя запись в таблицах всех маршрутизаторов Интернета, поэтому в глобальной маршрутизации не принимаются префиксы длиннее /24.
Исчерпание адресов IPv4
Тридцать два бита казались в 1981 году неисчерпаемым запасом, но рост Интернета в 1990-е и 2000-е годы показал обратное. Из 4,3 миллиарда адресов около 590 миллионов недоступны для одноадресного использования (групповой и зарезервированный бывшие классы D и E, обратная петля, частные блоки), а распределение блоками неизбежно оставляет часть адресов неиспользованной. Работа над преемником — IPv6 со 128-битными адресами — началась ещё в первой половине 1990-х годов (тема 11), а CIDR и NAT задумывались как временные меры, позволяющие дотянуть до его внедрения.
Исчерпание произошло в несколько этапов 14. 3 февраля 2011 года IANA выделила последние пять блоков /8, по одному каждой регистратуре, и центральный запас закончился. В апреле 2011 года APNIC перешла к выдаче из последнего блока /8 по строгим правилам — не более /22 на одного члена. RIPE NCC достигла последнего /8 14 сентября 2012 года и 25 ноября 2019 года объявила о полном исчерпании свободного пространства; с тех пор новым членам выдаются лишь возвращённые адреса в порядке очереди, блоками /24. ARIN исчерпала свободный пул в сентябре 2015 года, LACNIC — в 2020 году. AFRINIC дольше других сохраняла запас и тоже перешла к последней фазе распределения.
Рынок адресов и последствия исчерпания
Исчерпание свободного пула не означает, что адресов нет: они распределены, но используются неравномерно. Организации, получившие крупные блоки в классовую эпоху, используют лишь их часть, и политика регистратур с начала 2010-х годов разрешила передачу адресов (англ. transfer) между организациями. Возник рынок адресов IPv4: адреса покупаются и продаются через брокеров, а регистратура лишь фиксирует смену владельца. По данным брокеров, цена одного адреса выросла с порядка 10 долларов США в середине 2010-х годов до 50–60 долларов в 2021–2022 годах, после чего снизилась; отдельные крупные блоки продавались за десятки миллионов долларов. Распространена и аренда адресов.
Для пользователей сети исчерпание имеет практические следствия. Домашние абоненты всё чаще оказываются за CGNAT и не могут принимать входящие соединения. Облачные платформы начали взимать плату за каждый публичный адрес IPv4. Организации экономят публичные адреса, размещая за одним адресом множество служб с помощью трансляции адресов и обратных прокси-серверов (темы 14 и 16). Долгосрочное решение — IPv6, доля которого в трафике крупных платформ превысила 40 %, но двойной стек IPv4 и IPv6 сохранится ещё долго, и умение рассчитывать подсети IPv4 остаётся обязательным навыком сетевого инженера.
Итоги темы
Адрес IPv4 — 32-битное число, записываемое четырьмя десятичными октетами, и смысл его определяется делением на сетевую часть и номер узла. Иерархия адреса позволяет маршрутизаторам хранить сведения о сетях, а не об отдельных узлах. Граница частей задаётся маской или, что то же, длиной префикса; адрес сети вычисляется поразрядным «И» адреса и маски, а сеть с префиксом p содержит 2³²⁻ᵖ адресов, из которых два — адрес сети и широковещательный — не назначаются интерфейсам, кроме сетей /31 и /32.
Классовая адресация с границей, зашитой в первых битах адреса, привела к расточительному распределению и росту таблиц маршрутизации и в 1993 году уступила место бесклассовой адресации CIDR, в которой длина префикса произвольна и передаётся с каждым маршрутом. Вторая сторона CIDR — агрегирование: выровненные соседние блоки объединяются в один, и именно ради агрегирования адреса распределяются иерархически, от IANA через региональные регистратуры к провайдерам и организациям. Ряд блоков зарезервирован для особых целей — частные адреса RFC 1918, общее пространство CGNAT, локальные адреса канала, обратная петля, документационные и групповые адреса, — и сетевой инженер должен узнавать их с первого взгляда.
Расчёт подсетей сводится к нескольким приёмам: найти сеть по адресу через интересный октет и размер блока, разделить блок на равные подсети, распределить блок между сегментами разного размера методом VLSM по убыванию размеров с выравниванием и запасом на рост. Хороший адресный план не содержит пересечений, агрегируется, оставляет резерв и документирован; результат расчёта проверяется программой с модулем ipaddress.
Свободный пул адресов IPv4 исчерпан с 2011–2020 годов, и последствия исчерпания — CGNAT, рынок адресов, платные публичные адреса — определяют облик современных сетей. Адреса и подсети, рассмотренные в этой теме, — исходный материал для следующих: в теме 7 будет показано, как пакет с этими адресами устроен и как хост находит MAC-адрес соседа по сети, в теме 8 — как маршрутизатор выбирает путь по наибольшему совпадающему префиксу.
Литература
- Postel J. Internet Protocol. — RFC 791, IETF, 1981. https://www.rfc-editor.org/rfc/rfc791
- Mogul J., Postel J. Internet Standard Subnetting Procedure. — RFC 950, IETF, 1985. https://www.rfc-editor.org/rfc/rfc950
- Fuller V., Li T. Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan. — RFC 4632, IETF, 2006. https://www.rfc-editor.org/rfc/rfc4632
- Rekhter Y., Moskowitz B., Karrenberg D., de Groot G. J., Lear E. Address Allocation for Private Internets. — RFC 1918, IETF, 1996. https://www.rfc-editor.org/rfc/rfc1918
- Weil J., Kuarsingh V., Donley C., Liljenstolpe C., Azinger M. IANA-Reserved IPv4 Prefix for Shared Address Space. — RFC 6598, IETF, 2012. https://www.rfc-editor.org/rfc/rfc6598
- Cotton M., Vegoda L., Bonica R., Haberman B. Special-Purpose IP Address Registries. — RFC 6890, IETF, 2013. https://www.rfc-editor.org/rfc/rfc6890
- Cheshire S., Aboba B., Guttman E. Dynamic Configuration of IPv4 Link-Local Addresses. — RFC 3927, IETF, 2005. https://www.rfc-editor.org/rfc/rfc3927
- Arkko J., Cotton M., Vegoda L. IPv4 Address Blocks Reserved for Documentation. — RFC 5737, IETF, 2010. https://www.rfc-editor.org/rfc/rfc5737
- Retana A., White R., Fuller V., McPherson D. Using 31-Bit Prefixes on IPv4 Point-to-Point Links. — RFC 3021, IETF, 2000. https://www.rfc-editor.org/rfc/rfc3021
- Cotton M., Vegoda L., Meyer D. IANA Guidelines for IPv4 Multicast Address Assignments. — RFC 5771, IETF, 2010. https://www.rfc-editor.org/rfc/rfc5771
- Python Software Foundation. ipaddress — IPv4/IPv6 manipulation library. — 2025. https://docs.python.org/3/library/ipaddress.html
- Housley R., Curran J., Huston G., Conrad D. The Internet Numbers Registry System. — RFC 7020, IETF, 2013. https://www.rfc-editor.org/rfc/rfc7020
- Kurose J. F., Ross K. W. Computer Networking: A Top-Down Approach. 8th ed. — Pearson, 2021.
- Huston G. IPv4 Address Report. — 2025. https://ipv4.potaroo.net/