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

Шлюз по умолчанию (default gateway)

В настройках сети микроконтроллера после адреса и маски всегда идёт третий параметр — шлюз. Без него плата прекрасно общается с соседями по сегменту, но не может ответить ни облачному серверу, ни компьютеру за роутером. Разбираем, что делает шлюз и какие ошибки с ним случаются.

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

Шлюз по умолчанию (default gateway) — маршрутизатор в локальной сети, которому узел отправляет пакеты для всех адресов вне своей подсети, если не знает лучшего маршрута. В RFC 1122 (1989) маршрутизаторы называются «шлюзами» (gateways): узел, не нашедший адресата в своей сети, выбирает шлюз «по умолчанию» и отдаёт пакет ему (разд. 3.3.1.2).

Как узел решает, куда отправить пакет

  1. Накладывает маску подсети на свой адрес и на адрес получателя.
  2. Если результаты совпадают — получатель в той же сети, пакет уходит ему напрямую.
  3. Если нет — получатель доступен только через шлюз (RFC 1122, разд. 3.3.1.1).

Если шлюз оказался не лучшим следующим узлом к адресату, он сам перешлёт пакет дальше и сообщит узлу более короткий путь сообщением ICMP Redirect (разд. 3.3.1.2). RFC требует, чтобы узел работал и вовсе без шлюзов — в изолированной сети.

Параметры устройства

ПараметрПримерГде у W5500
Собственный адрес192.168.0.2SIPR, 0x000F–0x0012
Маска255.255.255.0SUBR, 0x0005–0x0008
Шлюз192.168.0.1GAR, 0x0001–0x0004

Значения из примеров даташита W5500 (разд. 4.1); после сброса все эти регистры нулевые. В ESP-IDF шлюз — поле gw структуры esp_netif_ip_info_t; обычно его вместе с адресом и маской выдаёт DHCP, а для статической настройки клиент DHCP нужно остановить (ESP-NETIF). В домашней сети шлюзом обычно служит роутер: устройства внутри получают частные адреса, а выход наружу идёт через него.

Типичные ошибки

  • Шлюз не из своей подсети. Например, адрес 192.168.1.50/24 и шлюз 192.168.0.1: внутри подсети устройство работает, но до шлюза пакет не дойдёт, и связи с внешними адресами нет (наш вывод из алгоритма выше).
  • Шлюз не задан. Устройство отвечает соседям, но не серверам за роутером — частая причина «по локальной сети пингуется, а MQTT в облако не подключается».
  • Неверная маска. Шлюз задан правильно, но слишком широкая маска заставляет устройство искать «чужие» адреса напрямую, минуя шлюз.

Проверить, попадают ли адрес и шлюз в одну подсеть, можно калькулятором подсетей. Подключение Ethernet к микроконтроллеру — в статье «Ethernet для микроконтроллеров».

Не путать

Со шлюзом Modbus или LoRa — устройством, которое переводит один протокол в другой. Шлюз по умолчанию — понятие IP-маршрутизации: это следующий узел на пути пакета.

Частые вопросы

Нужен ли шлюз, если устройство общается только внутри сети?

Нет. Пакеты к адресам своей подсети отправляются напрямую, и RFC 1122 требует, чтобы узел работал и без шлюзов — в изолированной сети (разд. 3.3.1.1). Шлюз нужен, только если устройство отвечает или обращается к адресам за маршрутизатором.

Почему шлюз должен быть в той же подсети?

Потому что до шлюза пакет доходит напрямую, как до соседа по сегменту. Если адрес шлюза не попадает в подсеть устройства по его маске, устройство не может отправить ему пакет напрямую, и связь с внешними адресами не работает (наш вывод из разд. 3.3.1 RFC 1122).

Где задать шлюз у W5500?

В регистре GAR по адресам 0x0001–0x0004, по октету на адрес: 192.168.0.1 записывается как 0xC0, 0xA8, 0x00, 0x01 (даташит W5500, разд. 4.1). После сброса там нули.

Источники

  1. IETF. RFC 1122: Requirements for Internet Hosts — Communication Layers (1989) — разд. 3.3.1.1: если биты адресата под маской не совпадают с битами источника, адресат доступен только через шлюз; узел должен работать и без шлюзов, в изолированной сети; разд. 3.3.1.2: узел ведёт кэш маршрутов, при отсутствии записи выбирает шлюз «по умолчанию» и отправляет пакет ему; если шлюз не лучший следующий узел, он пересылает пакет дальше и присылает ICMP Redirect; требования: поддерживать несколько шлюзов по умолчанию; во времена RFC шлюзами называли маршрутизаторы
  2. WIZnet. W5500 Datasheet v1.1.0 (2022) — разд. 4.1: GAR (0x0001–0x0004) задаёт адрес шлюза по умолчанию, пример 192.168.0.1 — 0xC0, 0xA8, 0x00, 0x01; значение после сброса 0x00
  3. Espressif. ESP-IDF Programming Guide v6.1: ESP-NETIF — адрес, маску, шлюз и DNS обычно получают от DHCP; esp_netif_get_ip_info() возвращает esp_netif_ip_info_t с адресом, маской и шлюзом; для статического адреса клиент DHCP нужно остановить

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