Сети для самых маленьких. Часть 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?

Алгоритм:

  1. Взять адрес назначения X и наложить на него свою маску: X AND маска.
  2. Сравнить результат с адресом своей сети.
  3. Совпало — X в той же сети, значит, сосед: отправить кадр прямо ему (его MAC-адрес узнаётся через ARP, часть 7).
  4. Не совпало — 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, благодаря которому вся ваша квартира сидит за одним адресом.

Оставить комментарий могут только зарегистрированные пользователи.

Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.