Маска подсети
Микроконтроллеру с Ethernet или Wi-Fi нужны три параметра: свой адрес, маска и шлюз. Маска отвечает на вопрос, который устройство задаёт перед каждой отправкой пакета: адресат в моей сети или за маршрутизатором? Ошибка в маске — частая причина того, что плата видна не всем.
Обновлено Редакция GAW
Маска подсети (subnet mask) — 32-битное число, которое указывает, какие биты IPv4-адреса задают номер сети, а какие — номер узла в ней: единицы маски отмечают сетевую часть, нули — узловую. RFC 950 ввёл её как «address mask» — битовую маску, выделяющую номер подсети (разд. 2.1), а RFC 1122 описывает её как 32-битную маску, выделяющую номер сети и подсети в адресе (разд. 3.3.1.1).
Как маска делит адрес
Адрес сети получается побитовым И адреса и маски:
| Десятичная | Двоичная | |
|---|---|---|
| Адрес | 192.168.1.10 | 11000000.10101000.00000001.00001010 |
| Маска | 255.255.255.0 | 11111111.11111111.11111111.00000000 |
| Сеть | 192.168.1.0 | 11000000.10101000.00000001.00000000 |
Расчёт наш. Число единиц в маске — длина префикса: 255.255.255.0 записывают как /24 в нотации CIDR. RFC 950 допускал несмежные биты подсети, но рекомендовал делать их смежными и старшими; в современных сетях маска всегда состоит из единиц подряд и затем нулей. Побитовые операции удобно проверить в калькуляторе битовых масок.
Зачем маска узлу
Перед каждой отправкой узел решает, где получатель (RFC 1122, разд. 3.3.1.1):
- накладывает маску на свой адрес и на адрес получателя;
- если результаты совпадают — получатель в той же сети, пакет уходит напрямую;
- если нет — получатель доступен только через шлюз по умолчанию.
Отсюда типичные ошибки. Слишком широкая маска (255.255.0.0 вместо 255.255.255.0) делает «своими» адреса, которые на самом деле за маршрутизатором, и устройство пытается найти их напрямую. Слишком узкая — наоборот, отправляет соседей через шлюз (наш вывод из алгоритма).
Где задаётся на микроконтроллере
- W5500 — регистр SUBR по адресам 0x0005–0x0008, по октету на адрес: 255.255.255.0 записывается как 0xFF, 0xFF, 0xFF, 0x00; после сброса там нули (даташит, разд. 4.1).
- ESP32 — поле
netmaskв структуреesp_netif_ip_info_tпри статической настройке; по DHCP маску выдаёт сервер.
Сколько узлов помещается в подсеть с данной маской и какие у неё адрес сети и широковещательный адрес, считает калькулятор подсетей IPv4. Подключение Ethernet к микроконтроллеру — в статье «Ethernet для микроконтроллеров».
Частые вопросы
Что значит маска 255.255.255.0?
Что первые 24 бита адреса — номер сети, а последние 8 — номер узла. Эта маска соответствует префиксу /24: в подсети 256 адресов, из них 254 доступны узлам, а адрес сети и широковещательный — служебные (наш расчёт: 2⁸ − 2).
Как устройство использует маску?
Перед отправкой пакета оно накладывает маску на свой адрес и на адрес получателя. Если результаты совпадают, получатель в той же сети и пакет идёт напрямую; если нет — через шлюз (RFC 1122, разд. 3.3.1.1).
Может ли маска быть 255.255.0.255?
RFC 950 допускал несмежные биты подсети, но рекомендовал смежные старшие биты, а запись префиксом CIDR вообще описывает маску как n единиц подряд. На практике маска — единицы подряд, затем нули, и калькулятор подсетей такую запись не примет.
Источники
- IETF. RFC 950: Internet Standard Subnetting Procedure (1985) — разд. 2.1: вариант 5 — битовая маска («address mask») указывает, какие биты локальной части адреса — номер подсети; биты подсети не обязаны идти подряд, но рекомендуется, чтобы они шли подряд и занимали старшие биты локальной части; разд. 2.3 и прил. I: как узел узнаёт маску — ICMP Address Mask Request и Reply
- IETF. RFC 1122: Requirements for Internet Hosts — Communication Layers (1989) — разд. 3.3.1.1: решение «локальный или удалённый адресат» — маска выделяет номер сети и подсети; если биты адресата и источника под маской совпадают, пакет отправляют напрямую, иначе — через шлюз; узел должен работать и без шлюзов
- WIZnet. W5500 Datasheet v1.1.0 (2022) — разд. 4.1: SUBR (0x0005–0x0008) задаёт маску подсети, пример 255.255.255.0 — 0xFF, 0xFF, 0xFF, 0x00; значение после сброса 0x00
Нашли ошибку?
Смотрите также
- Калькулятор подсетей IPv4Маска и CIDR, сеть, broadcast, узлы, частные диапазоны, деление на подсети
- CIDRБесклассовая адресация: префикс /n вместо маски и классов A, B, C
- Шлюз по умолчаниюМаршрутизатор для пакетов за пределы подсети; адрес из той же подсети
- Широковещательный адресАдрес «всем узлам»: 255.255.255.255 или все единицы в части узла
- Ethernet для микроконтроллераW5500, ENC28J60, MAC + PHY по RMII, LAN8720, DP83848, трансформатор и разводка
- Битовые маскиПоле регистра: маска, сдвиг, чтение и запись, код на C