Сети для самых маленьких. Часть 5: IPv4 — адреса, маски и подсети
Четыре предыдущие части были про канальный уровень: Ethernet, Wi-Fi и PPPoE умеют доставить кадр соседу — устройству на том же кабеле, в той же радиосети, на другом конце той же линии. Дальше соседа канальный уровень не видит: MAC-адрес ничего не говорит о том, где машина находится, и коммутатор с миллиардом адресов в таблице не построить.
Сетевой уровень добавляет две вещи: адрес, по которому можно понять, где машина, и маршрутизацию — передачу пакета от сети к сети через цепочку роутеров. Протокол сетевого уровня в интернете — IP, Internet Protocol, и его четвёртая версия, IPv4 (RFC 791, 1981 год), до сих пор несёт большую часть трафика. Сегодня — только про адреса: как они устроены, как считаются подсети и как машина по адресу принимает своё первое решение. Заголовок пакета, маршрутизация и NAT — в следующей части.
Адрес: 32 бита
IPv4-адрес — число из 32 бит. Для людей его записывают как четыре десятичных числа от 0 до 255 через точку, по байту на число:
192.168.1.10
│ │ │ └─ 00001010
│ │ └──── 00000001
│ └────── 10101000
└────────── 11000000
11000000.10101000.00000001.00001010
Всего адресов 2³² = 4 294 967 296. Это число показалось огромным в 1981 году и кончилось к 2011-му; об этом в конце.
Адрес принадлежит не машине, а интерфейсу: у ноутбука с кабелем и Wi-Fi два адреса, у роутера — по адресу на каждую сеть, к которой он подключён, и ещё адрес 127.0.0.1 есть у всех. У одного интерфейса может быть и несколько адресов.
Маска: где кончается сеть и начинается хост
Адрес состоит из двух частей: номер сети в старших битах и номер хоста в младших. Где проходит граница, задаёт маска: 32 бита, в которых единицы стоят напротив сетевой части, а нули — напротив хостовой. Единицы всегда идут подряд слева, поэтому маску достаточно описать одним числом — количеством единиц. Это и есть запись через косую черту, префикс:
адрес 192.168.1.10 11000000.10101000.00000001.00001010
маска 255.255.255.0 11111111.11111111.11111111.00000000 = /24
└──────── сеть ───────────┘└ хост ┘
192.168.1.10/24 и «адрес 192.168.1.10, маска 255.255.255.0» — одно и то же. Первые 24 бита — сеть 192.168.1, последние 8 — хост номер 10 в ней.
Из адреса и маски вычисляются три вещи, и все три — побитовыми операциями:
- Адрес сети: адрес AND маска. Все биты хоста обнуляются:
192.168.1.0. Этот адрес обозначает сеть целиком и хосту не назначается. - Широковещательный адрес: адрес OR инвертированная маска. Все биты хоста единицы:
192.168.1.255. Пакет на него получают все хосты сети (в кадре Ethernet он уедет наff:ff:ff:ff:ff:ff). - Диапазон хостов: всё между ними,
192.168.1.1–192.168.1.254. Всего 2⁸ − 2 = 254.
Два вычитаются всегда: первый адрес — сеть, последний — широковещание. Формула числа хостов — 2^(32 − префикс) − 2.
Возьмём пример, где граница проходит не по байту, иначе арифметика кажется проще, чем есть. Адрес 192.168.1.130/26:
адрес 192.168.1.130 11000000.10101000.00000001.10000010
маска /26 11111111.11111111.11111111.11000000 = 255.255.255.192
└┘└────┘
сеть хост (6 бит)
сеть адрес AND маска ...00000001.10000000 = 192.168.1.128
broadcast адрес OR NOT маска ...00000001.10111111 = 192.168.1.191
хосты 192.168.1.129 – 192.168.1.190, всего 2⁶ − 2 = 62
В последнем байте маски 11000000 два старших бита принадлежат сети, и они делят диапазон 0–255 на четыре блока по 64: .0–.63, .64–.127, .128–.191, .192–.255. Адрес .130 попадает в третий. Приём для счёта в уме: размер блока = 256 − последний ненулевой байт маски. Для 255.255.255.192 это 64, для .224 — 32, для .240 — 16.
Таблица для последнего байта, которой хватает в девяноста процентах случаев:
| Префикс | Маска | Хостов | Для чего |
|---|---|---|---|
| /24 | 255.255.255.0 | 254 | типовая локальная сеть |
| /25 | 255.255.255.128 | 126 | |
| /26 | 255.255.255.192 | 62 | |
| /27 | 255.255.255.224 | 30 | |
| /28 | 255.255.255.240 | 14 | небольшая серверная подсеть |
| /29 | 255.255.255.248 | 6 | блок адресов от провайдера |
| /30 | 255.255.255.252 | 2 | линк между двумя роутерами |
| /31 | 255.255.255.254 | 2 | линк между роутерами без сети и broadcast (RFC 3021) |
| /32 | 255.255.255.255 | 1 | один адрес: loopback, VIP, маршрут к хосту |
Два особых случая. /31 нарушает правило «минус два»: на линии между двумя роутерами ни адрес сети, ни широковещание не нужны, и стандарт разрешил использовать оба адреса. /32 — это не сеть, а один адрес; так записывают адрес, который должен быть на интерфейсе, но не принадлежит никакому сегменту: адрес loopback-интерфейса роутера, виртуальный адрес сервиса.
С другой стороны байта та же логика: 10.0.0.0/8 — 16 миллионов адресов, 172.16.0.0/12 — миллион, 192.168.0.0/16 — 65 тысяч. Префикс /0 с маской 0.0.0.0 покрывает все адреса вообще; 0.0.0.0/0 мы увидим в следующей части как «маршрут по умолчанию».
Делить и объединять
Префикс — это просто позиция границы, и её можно двигать. Сдвинуть вправо на один бит — разделить сеть пополам:
192.168.1.0/24 (256 адресов)
├── 192.168.1.0/25 (.0 – .127)
│ ├── 192.168.1.0/26 (.0 – .63)
│ └── 192.168.1.64/26 (.64 – .127)
└── 192.168.1.128/25 (.128 – .255)
├── 192.168.1.128/27 (.128 – .159)
├── 192.168.1.160/27 (.160 – .191)
└── 192.168.1.192/26 (.192 – .255)
Части не обязаны быть одинаковыми: справа одна /26 и две /27. Это называется VLSM (маски переменной длины), и именно так режут адресное пространство в реальных сетях: серверам /26, принтерам /28, линкам между роутерами /30.
Сдвинуть влево — объединить. Сети 192.168.0.0/24 и 192.168.1.0/24 различаются только 24-м битом, и вместе они 192.168.0.0/23. Это агрегация (суммаризация), и на ней держится интернет: роутер провайдера не хранит миллионы маршрутов до каждой /24, он хранит одну запись на весь блок клиента. Объединять можно только выровненные блоки: 192.168.1.0/24 и 192.168.2.0/24 в /23 не сложатся, потому что 192.168.1.0/23 — это .0 и .1, а 192.168.2.0/23 — .2 и .3. Проверка проста: адрес сети должен делиться на размер блока.
Инструмент, чтобы не считать руками, — ipcalc:
$ ipcalc 192.168.1.130/26
Address: 192.168.1.130 11000000.10101000.00000001.10 000010
Netmask: 255.255.255.192 = 26 11111111.11111111.11111111.11 000000
Wildcard: 0.0.0.63 00000000.00000000.00000000.00 111111
=>
Network: 192.168.1.128/26 11000000.10101000.00000001.10 000000
HostMin: 192.168.1.129 11000000.10101000.00000001.10 000001
HostMax: 192.168.1.190 11000000.10101000.00000001.10 111110
Broadcast: 192.168.1.191 11000000.10101000.00000001.10 111111
Hosts/Net: 62
Первое решение: сосед или шлюз
Теперь самое важное применение маски. У хоста есть пакет для адреса X. Канальный уровень умеет доставить только соседу. Как хост узнаёт, сосед ли X?
Алгоритм:
- Взять адрес назначения X и наложить на него свою маску: X AND маска.
- Сравнить результат с адресом своей сети.
- Совпало — X в той же сети, значит, сосед: отправить кадр прямо ему (его MAC-адрес узнаётся через ARP, часть 7).
- Не совпало — X где-то за пределами сегмента: отправить кадр шлюзу по умолчанию (default gateway), роутеру, адрес которого хосту сообщили при настройке. Дальше — забота роутера.
Хост 192.168.1.10/24, шлюз 192.168.1.1:
| Назначение | AND 255.255.255.0 | Моя сеть? | Кадр уходит |
|---|---|---|---|
192.168.1.20 |
192.168.1.0 |
да | на MAC хоста .20 |
192.168.1.255 |
192.168.1.0 |
да | на ff:ff:ff:ff:ff:ff |
192.168.2.5 |
192.168.2.0 |
нет | на MAC шлюза 192.168.1.1 |
203.0.113.10 |
203.0.113.0 |
нет | на MAC шлюза |
Отсюда два следствия, объясняющие большую часть «сеть настроена, а не работает»:
Шлюз должен быть в той же сети, что и хост. Иначе хост по собственному алгоритму решит, что до шлюза нужен шлюз. Linux такую настройку просто не примет: ip route add default via 192.168.2.1 при адресе 192.168.1.10/24 ответит «Nexthop has invalid gateway».
Ошибка в маске ломает связь непредсказуемо. Пусть у хоста A 192.168.1.10/24, а у B по ошибке 192.168.1.20/25. A считает B соседом и шлёт кадр напрямую — доходит. B для ответа накладывает свою маску /25: 192.168.1.10 AND 255.255.255.128 = 192.168.1.0, его сеть 192.168.1.0/25 — тоже сосед, отвечает напрямую. Работает. Но хост C 192.168.1.200/24: A видит его соседом, а B — нет, и отправляет ответ шлюзу. Если шлюз догадается вернуть пакет в тот же сегмент — работает, но медленно и через роутер; если нет — A пингует B, C пингует A, а B до C не достучаться. Такие сети живут годами, пока кто-нибудь не посмотрит маски.
Классы: история, которая до сих пор мешает
До 1993 года маска не настраивалась, а следовала из первых битов адреса:
| Класс | Первые биты | Диапазон | Маска | Сетей × хостов |
|---|---|---|---|---|
| A | 0 |
0.0.0.0 – 127.255.255.255 | /8 | 128 × 16 млн |
| B | 10 |
128.0.0.0 – 191.255.255.255 | /16 | 16 тыс. × 65 тыс. |
| C | 110 |
192.0.0.0 – 223.255.255.255 | /24 | 2 млн × 254 |
| D | 1110 |
224.0.0.0 – 239.255.255.255 | — | групповые адреса |
| E | 1111 |
240.0.0.0 – 255.255.255.255 | — | зарезервировано |
Схема оказалась расточительной: организации с 300 компьютерами класса C не хватало, а класс B на 65 тысяч был слишком велик, и адреса в нём пропадали. В 1993 году ввели CIDR (Classless Inter-Domain Routing): маска произвольной длины, записывается префиксом, маршруты агрегируются. Всё, что было выше в этой статье, — CIDR.
Классы, однако, не исчезли из головы инструментов. ifconfig и некоторые Windows-утилиты, получив адрес без маски, до сих пор подставляют классовую; слово «сеть класса C» в разговоре означает просто /24; а классы D и E остались как есть.
Адреса, которые не ходят по интернету
Не всё адресное пространство раздаётся. Диапазоны, которые нужно узнавать с одного взгляда:
| Диапазон | Что это |
|---|---|
0.0.0.0/8 |
«этот хост, эта сеть». 0.0.0.0 в списке слушающих портов означает «все адреса машины», в запросе адреса — «у меня его ещё нет» (это мы видели в IPCP из четвёртой части, увидим в DHCP) |
127.0.0.0/8 |
loopback: пакет на любой из этих адресов возвращается в ту же машину, не выходя в сеть; 127.0.0.1 — localhost |
169.254.0.0/16 |
link-local: хост назначает себе случайный адрес отсюда, если ему никто не выдал адрес (в Windows это называется APIPA). Увидели такой адрес — значит, не ответил DHCP-сервер |
10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 |
частные (RFC 1918). Любой может использовать внутри своей сети, интернет-роутеры их не маршрутизируют. Чтобы выйти в интернет с такого адреса, нужен NAT (часть 6) |
100.64.0.0/10 |
адреса для CGNAT: провайдер выдаёт абонентам, когда своих белых адресов не хватает, и транслирует на своей стороне (часть 6) |
224.0.0.0/4 |
групповые (multicast): пакет на такой адрес получают все, кто подписан. 224.0.0.1 — все хосты сегмента, 224.0.0.251 — mDNS |
240.0.0.0/4 |
зарезервировано с 1981 года и не используется до сих пор |
255.255.255.255 |
ограниченное широковещание: всем в этом сегменте, через роутер не проходит |
192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 |
документационные: для примеров в статьях и книгах, в интернете не маршрутизируются. Именно они в примерах этой серии |
Всё остальное — публичные («белые») адреса, уникальные во всём интернете. Их раздают пять региональных регистратур (RIPE NCC для Европы, ARIN для Северной Америки и т. д.) провайдерам и крупным организациям блоками, а провайдеры — абонентам.
Почему адресов не хватило
Из 4,3 миллиарда адресов вычтите частные, групповые, зарезервированный класс E, loopback — останется около 3,7 миллиарда. Людей на планете восемь миллиардов, устройств у каждого несколько. Центральный запас IANA кончился в феврале 2011-го, региональные — между 2011 и 2019 годами. Новый блок сегодня можно только купить на вторичном рынке, по несколько десятков долларов за адрес.
Поэтому домашний роутер получает от провайдера один публичный адрес (а всё чаще — адрес из 100.64.0.0/10), раздаёт устройствам частные 192.168.x.x и подменяет адреса на лету. Это NAT, и о нём — в следующей части вместе с заголовком и маршрутизацией. А окончательный ответ на нехватку — IPv6 с его 2¹²⁸ адресами, которому посвящён отдельный блок серии.
Смотрим руками
Адреса и маски интерфейсов:
$ ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 ...
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic eth0
scope host — адрес виден только внутри машины, scope global — обычный, dynamic — получен автоматически, brd — вычисленный широковещательный.
Таблица маршрутов — то, по чему принимается решение «сосед или шлюз». Пока без подробностей, они в следующей части:
$ ip route
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
Вторая строка появилась сама (proto kernel), когда интерфейсу назначили адрес с маской: «сеть 192.168.1.0/24 — прямо за eth0». Первая — шлюз по умолчанию.
Спросить у системы, как она отправит пакет на конкретный адрес:
$ ip route get 192.168.1.20
192.168.1.20 dev eth0 src 192.168.1.10 uid 1000
$ ip route get 203.0.113.10
203.0.113.10 via 192.168.1.1 dev eth0 src 192.168.1.10 uid 1000
В первом случае via нет — сосед, во втором есть — через шлюз. Это тот самый алгоритм из середины статьи, выполненный ядром.
И на Windows то же самое: ipconfig покажет адрес, маску и шлюз, route print — таблицу маршрутов.
Что запомнить
- IPv4-адрес — 32 бита; маска отделяет номер сети от номера хоста;
/24и255.255.255.0— одно и то же. - Адрес сети — AND с маской, широковещательный — OR с инвертированной маской, хостов 2^(32 − префикс) − 2. Размер блока в последнем байте — 256 минус байт маски.
- Подсети делятся сдвигом границы вправо и объединяются сдвигом влево, но только выровненные блоки.
- Хост сравнивает адрес назначения со своей сетью через свою маску: совпало — сосед, нет — шлюз. Шлюз обязан быть в той же сети. Неверная маска ломает связь частично и незаметно.
- Частные диапазоны
10/8,172.16/12,192.168/16в интернет не маршрутизируются;169.254.x.xзначит «адрес не получен»;127.x.x.x— сама машина.
Дальше — Часть 6: IPv4 — заголовок, маршрутизация и NAT: заголовок пакета по полям, что такое TTL и зачем он нужен, как роутер выбирает маршрут по самому длинному префиксу, что происходит с пакетом, который не влезает в кадр, и как устроен NAT, благодаря которому вся ваша квартира сидит за одним адресом.
Оставить комментарий могут только зарегистрированные пользователи.
Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.