Перейти к содержанию

Маска подсети

Микроконтроллеру с Ethernet или Wi-Fi нужны три параметра: свой адрес, маска и шлюз. Маска отвечает на вопрос, который устройство задаёт перед каждой отправкой пакета: адресат в моей сети или за маршрутизатором? Ошибка в маске — частая причина того, что плата видна не всем.

Обновлено Редакция GAW

Маска подсети (subnet mask) — 32-битное число, которое указывает, какие биты IPv4-адреса задают номер сети, а какие — номер узла в ней: единицы маски отмечают сетевую часть, нули — узловую. RFC 950 ввёл её как «address mask» — битовую маску, выделяющую номер подсети (разд. 2.1), а RFC 1122 описывает её как 32-битную маску, выделяющую номер сети и подсети в адресе (разд. 3.3.1.1).

Как маска делит адрес

Адрес сети получается побитовым И адреса и маски:

ДесятичнаяДвоичная
Адрес192.168.1.1011000000.10101000.00000001.00001010
Маска255.255.255.011111111.11111111.11111111.00000000
Сеть192.168.1.011000000.10101000.00000001.00000000

Расчёт наш. Число единиц в маске — длина префикса: 255.255.255.0 записывают как /24 в нотации CIDR. RFC 950 допускал несмежные биты подсети, но рекомендовал делать их смежными и старшими; в современных сетях маска всегда состоит из единиц подряд и затем нулей. Побитовые операции удобно проверить в калькуляторе битовых масок.

Зачем маска узлу

Перед каждой отправкой узел решает, где получатель (RFC 1122, разд. 3.3.1.1):

  1. накладывает маску на свой адрес и на адрес получателя;
  2. если результаты совпадают — получатель в той же сети, пакет уходит напрямую;
  3. если нет — получатель доступен только через шлюз по умолчанию.

Отсюда типичные ошибки. Слишком широкая маска (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 единиц подряд. На практике маска — единицы подряд, затем нули, и калькулятор подсетей такую запись не примет.

Источники

  1. IETF. RFC 950: Internet Standard Subnetting Procedure (1985) — разд. 2.1: вариант 5 — битовая маска («address mask») указывает, какие биты локальной части адреса — номер подсети; биты подсети не обязаны идти подряд, но рекомендуется, чтобы они шли подряд и занимали старшие биты локальной части; разд. 2.3 и прил. I: как узел узнаёт маску — ICMP Address Mask Request и Reply
  2. IETF. RFC 1122: Requirements for Internet Hosts — Communication Layers (1989) — разд. 3.3.1.1: решение «локальный или удалённый адресат» — маска выделяет номер сети и подсети; если биты адресата и источника под маской совпадают, пакет отправляют напрямую, иначе — через шлюз; узел должен работать и без шлюзов
  3. WIZnet. W5500 Datasheet v1.1.0 (2022) — разд. 4.1: SUBR (0x0005–0x0008) задаёт маску подсети, пример 255.255.255.0 — 0xFF, 0xFF, 0xFF, 0x00; значение после сброса 0x00

Нашли ошибку?