Шлюз по умолчанию (default gateway)
В настройках сети микроконтроллера после адреса и маски всегда идёт третий параметр — шлюз. Без него плата прекрасно общается с соседями по сегменту, но не может ответить ни облачному серверу, ни компьютеру за роутером. Разбираем, что делает шлюз и какие ошибки с ним случаются.
Обновлено Редакция GAW
Шлюз по умолчанию (default gateway) — маршрутизатор в локальной сети, которому узел отправляет пакеты для всех адресов вне своей подсети, если не знает лучшего маршрута. В RFC 1122 (1989) маршрутизаторы называются «шлюзами» (gateways): узел, не нашедший адресата в своей сети, выбирает шлюз «по умолчанию» и отдаёт пакет ему (разд. 3.3.1.2).
Как узел решает, куда отправить пакет
- Накладывает маску подсети на свой адрес и на адрес получателя.
- Если результаты совпадают — получатель в той же сети, пакет уходит ему напрямую.
- Если нет — получатель доступен только через шлюз (RFC 1122, разд. 3.3.1.1).
Если шлюз оказался не лучшим следующим узлом к адресату, он сам перешлёт пакет дальше и сообщит узлу более короткий путь сообщением ICMP Redirect (разд. 3.3.1.2). RFC требует, чтобы узел работал и вовсе без шлюзов — в изолированной сети.
Параметры устройства
| Параметр | Пример | Где у W5500 |
|---|---|---|
| Собственный адрес | 192.168.0.2 | SIPR, 0x000F–0x0012 |
| Маска | 255.255.255.0 | SUBR, 0x0005–0x0008 |
| Шлюз | 192.168.0.1 | GAR, 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). После сброса там нули.
Источники
- IETF. RFC 1122: Requirements for Internet Hosts — Communication Layers (1989) — разд. 3.3.1.1: если биты адресата под маской не совпадают с битами источника, адресат доступен только через шлюз; узел должен работать и без шлюзов, в изолированной сети; разд. 3.3.1.2: узел ведёт кэш маршрутов, при отсутствии записи выбирает шлюз «по умолчанию» и отправляет пакет ему; если шлюз не лучший следующий узел, он пересылает пакет дальше и присылает ICMP Redirect; требования: поддерживать несколько шлюзов по умолчанию; во времена RFC шлюзами называли маршрутизаторы
- WIZnet. W5500 Datasheet v1.1.0 (2022) — разд. 4.1: GAR (0x0001–0x0004) задаёт адрес шлюза по умолчанию, пример 192.168.0.1 — 0xC0, 0xA8, 0x00, 0x01; значение после сброса 0x00
- Espressif. ESP-IDF Programming Guide v6.1: ESP-NETIF — адрес, маску, шлюз и DNS обычно получают от DHCP; esp_netif_get_ip_info() возвращает esp_netif_ip_info_t с адресом, маской и шлюзом; для статического адреса клиент DHCP нужно остановить
Нашли ошибку?
Смотрите также
- Калькулятор подсетей IPv4Маска и CIDR, сеть, broadcast, узлы, частные диапазоны, деление на подсети
- Маска подсети32 бита: единицы — номер сети, нули — номер узла; 255.255.255.0 = /24
- DHCPПротокол выдачи IP-адреса, маски и шлюза; аренда, DISCOVER–OFFER–REQUEST–ACK
- Частные IP-адреса10/8, 172.16/12, 192.168/16: адреса локальных сетей, не маршрутизируемые в интернет
- Ethernet для микроконтроллераW5500, ENC28J60, MAC + PHY по RMII, LAN8720, DP83848, трансформатор и разводка
- MAC EthernetБлок, который формирует и принимает кадры Ethernet