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

DHCP — протокол динамической настройки узла

Плата с ESP32 подключилась к Wi-Fi и сразу получила адрес, маску и шлюз — это работа DHCP. Протокол экономит ручную настройку, но у него есть подробности, которые важны для прошивки: аренда кончается, адрес может смениться, а для статической настройки клиент нужно выключить.

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

DHCP (Dynamic Host Configuration Protocol) — протокол, по которому узел получает от сервера сетевые настройки: IP-адрес, маску подсети, шлюз по умолчанию, адреса серверов DNS и другие параметры. Он описан в RFC 2131 и основан на более старом протоколе BOOTP.

Как выдаётся адрес

RFC 2131 предусматривает три способа (разд. 1):

СпособЧто происходит
Автоматическийсервер выдаёт адрес навсегда
Динамическийадрес выдаётся на время — в аренду — и потом может достаться другому
Ручнойадрес назначает администратор, DHCP только передаёт его устройству

Динамический — единственный способ, при котором освободившиеся адреса используются повторно.

Обмен сообщениями

  1. DHCPDISCOVER — клиент широковещательно ищет серверы.
  2. DHCPOFFER — сервер предлагает параметры; перед этим он может проверить, не занят ли адрес, запросом ICMP Echo.
  3. DHCPREQUEST — клиент запрашивает предложенное у одного сервера и тем самым отказывается от других.
  4. 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).

Источники

  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; времена выбирают со случайным разбросом
  2. 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 взаимоисключающие и не меняются во время работы
  3. WIZnet. W5500 Datasheet v1.1.0 (2022) — разд. 1: аппаратно поддерживаются TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE — DHCP в списке нет

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