DHCP — протокол динамической настройки узла
Плата с ESP32 подключилась к Wi-Fi и сразу получила адрес, маску и шлюз — это работа DHCP. Протокол экономит ручную настройку, но у него есть подробности, которые важны для прошивки: аренда кончается, адрес может смениться, а для статической настройки клиент нужно выключить.
Обновлено Редакция GAW
DHCP (Dynamic Host Configuration Protocol) — протокол, по которому узел получает от сервера сетевые настройки: IP-адрес, маску подсети, шлюз по умолчанию, адреса серверов DNS и другие параметры. Он описан в RFC 2131 и основан на более старом протоколе BOOTP.
Как выдаётся адрес
RFC 2131 предусматривает три способа (разд. 1):
| Способ | Что происходит |
|---|---|
| Автоматический | сервер выдаёт адрес навсегда |
| Динамический | адрес выдаётся на время — в аренду — и потом может достаться другому |
| Ручной | адрес назначает администратор, DHCP только передаёт его устройству |
Динамический — единственный способ, при котором освободившиеся адреса используются повторно.
Обмен сообщениями
- DHCPDISCOVER — клиент широковещательно ищет серверы.
- DHCPOFFER — сервер предлагает параметры; перед этим он может проверить, не занят ли адрес, запросом ICMP Echo.
- DHCPREQUEST — клиент запрашивает предложенное у одного сервера и тем самым отказывается от других.
- DHCPACK — сервер подтверждает адрес и передаёт параметры.
Остальные сообщения: DHCPNAK — отказ (например, клиент переехал в другую подсеть), DHCPDECLINE — адрес уже занят, DHCPRELEASE — клиент возвращает адрес, DHCPINFORM — запрос параметров без адреса (RFC 2131, табл. 2). Транспорт — UDP: к серверу на порт 67, к клиенту на порт 68 (разд. 4.1).
Аренда
Адрес выдаётся на срок аренды. По умолчанию клиент продлевает её у своего сервера в момент T1 = 0,5 срока, а если ответа нет, в момент T2 = 0,875 срока переходит в состояние REBINDING и рассылает запрос всем серверам. Времена выбирают со случайным разбросом, чтобы клиенты не продлевали аренду одновременно (разд. 4.4.5). Пример (наш расчёт): при аренде 24 ч — 12 ч и 21 ч.
DHCP на микроконтроллерах
- ESP32. У интерфейса Ethernet и станции Wi-Fi клиент DHCP включён по умолчанию, у точки доступа работает сервер. О полученном адресе сообщает событие IP_EVENT. Для статического адреса клиент нужно остановить, иначе
esp_netif_set_ip_info()вернёт ESP_ERR_ESP_NETIF_DHCP_NOT_STOPPED (ESP-NETIF, ESP-IDF v6.1). - W5500. DHCP нет в списке аппаратно поддерживаемых протоколов (TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE), поэтому клиент DHCP работает в программе микроконтроллера поверх UDP-сокета (даташит, разд. 1).
Если сервер не ответил, устройство может назначить себе link-local адрес 169.254.x.x. Чтобы статический адрес не столкнулся с выдаваемыми, его берут из подсети роутера, но вне пула DHCP. Проверить подсеть поможет калькулятор подсетей IPv4.
Частые вопросы
Как устройство получает адрес по DHCP?
За четыре сообщения: клиент широковещательно ищет серверы (DHCPDISCOVER), сервер предлагает параметры (DHCPOFFER), клиент запрашивает предложенное у одного сервера (DHCPREQUEST), сервер подтверждает (DHCPACK). Сообщения идут по UDP: к серверу на порт 67, к клиенту на порт 68 (RFC 2131, разд. 3.1 и 4.1).
Что такое аренда и когда её продлевают?
Аренда — срок, на который сервер выдаёт адрес при динамическом распределении. По умолчанию клиент начинает продлевать её у своего сервера в момент T1 = 0,5 срока, а если ответа нет — в момент T2 = 0,875 срока обращается ко всем серверам широковещательно (RFC 2131, разд. 4.4.5). При аренде 24 ч это 12 и 21 ч (наш расчёт).
Как задать статический адрес на ESP32?
Остановить клиент DHCP интерфейса (esp_netif_dhcpc_stop), затем записать адрес, маску и шлюз функцией esp_netif_set_ip_info(). Если клиент DHCP работает, функция вернёт ошибку ESP_ERR_ESP_NETIF_DHCP_NOT_STOPPED (ESP-NETIF, ESP-IDF v6.1).
Источники
- IETF. RFC 2131: Dynamic Host Configuration Protocol (1997) — аннотация: DHCP передаёт узлам параметры конфигурации, основан на BOOTP; разд. 1: три способа выдачи адреса — автоматический (постоянный), динамический (на ограниченное время, единственный с повторным использованием адресов) и ручной (адрес задаёт администратор, DHCP только передаёт); разд. 3.1, табл. 2: DHCPDISCOVER (широковещательный поиск серверов), DHCPOFFER, DHCPREQUEST, DHCPACK, DHCPNAK, DHCPDECLINE, DHCPRELEASE, DHCPINFORM; сервер может проверить предлагаемый адрес ICMP Echo; разд. 4.1: транспорт UDP, от клиента к серверу — порт 67, от сервера к клиенту — порт 68; разд. 4.4.5: T1 по умолчанию 0,5 срока аренды, T2 — 0,875; после T2 клиент переходит в REBINDING и продлевает широковещательным DHCPREQUEST; времена выбирают со случайным разбросом
- Espressif. ESP-IDF Programming Guide v6.1: ESP-NETIF — адрес, шлюз, маску и DNS обычно получают от DHCP, о назначении сообщает событие IP_EVENT; клиент DHCP включён по умолчанию у интерфейса Ethernet и станции Wi-Fi, для статического адреса его нужно остановить; сервер DHCP — у точки доступа; флаги ESP_NETIF_DHCP_CLIENT и ESP_NETIF_DHCP_SERVER взаимоисключающие и не меняются во время работы
- WIZnet. W5500 Datasheet v1.1.0 (2022) — разд. 1: аппаратно поддерживаются TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE — DHCP в списке нет
Нашли ошибку?
Смотрите также
- Калькулятор подсетей IPv4Маска и CIDR, сеть, broadcast, узлы, частные диапазоны, деление на подсети
- Шлюз по умолчаниюМаршрутизатор для пакетов за пределы подсети; адрес из той же подсети
- Маска подсети32 бита: единицы — номер сети, нули — номер узла; 255.255.255.0 = /24
- Link-local адрес (169.254.x.x)Адрес 169.254.0.0/16, назначаемый без DHCP; действует только в своём сегменте
- Широковещательный адресАдрес «всем узлам»: 255.255.255.255 или все единицы в части узла
- Ethernet для микроконтроллераW5500, ENC28J60, MAC + PHY по RMII, LAN8720, DP83848, трансформатор и разводка