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

ICMP Echo (ping)

Команда ping — это два сообщения ICMP: запрос с произвольными данными и ответ, в котором эти данные возвращаются без изменений. По идентификатору и номеру последовательности отправитель сопоставляет ответы с запросами и измеряет время оборота.

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

ICMP Echo — пара сообщений протокола ICMP, Echo Request (эхо-запрос) и Echo Reply (эхо-ответ), на которой работает утилита ping. Отправитель посылает запрос с произвольными данными, а получатель обязан вернуть те же данные в ответе. По RFC 792 для IPv4 запрос имеет тип 8, ответ — тип 0; по RFC 4443 для IPv6 — типы 128 и 129. Код в обоих случаях равен 0.

Формат сообщения

Заголовок одинаков у запроса и ответа: байт типа, байт кода, 16-битная контрольная сумма, затем 16-битные поля Identifier и Sequence Number, после них данные. Чтобы сформировать ответ, узел меняет местами адреса источника и назначения, подставляет тип ответа и пересчитывает сумму — содержимое остаётся прежним. RFC 4443 отдельно требует, чтобы данные вернулись целиком и без изменений, а их объём ничем не ограничивает.

ПолеIPv4 (RFC 792)IPv6 (RFC 4443)
Тип запроса / ответа8 / 0128 / 129
Код00
Контрольная суммапо сообщению ICMP начиная с поля Typeпо сообщению плюс псевдозаголовок IPv6, Next Header 58
Identifier, Sequence Numberпомогают сопоставить ответ с запросом, могут быть 0те же, копируются в ответ
Данныевозвращаются в ответевозвращаются целиком и без изменений

Идентификатор, по RFC 792, можно использовать как порт в TCP или UDP — он отличает один сеанс ping от другого на том же узле, — а номер последовательности увеличивать с каждым запросом. Разница в расчёте суммы объясняется тем, что у заголовка IPv6 нет собственной суммы: как и у UDP, в ICMPv6 адреса защищены псевдозаголовком.

Что показывает ping

Утилита измеряет время между отправкой запроса и приходом ответа и считает потери. Значение TTL в ответе — это оставшийся предел переходов после обратного пути. Отсутствие ответа означает не обязательно «устройство выключено»: пакет мог отбросить межсетевой экран, а устройство за NAT из интернета вообще не адресуется напрямую. Если запросы с большими данными не проходят, а короткие проходят, дело, скорее всего, в MTU на пути. Проверять связность имеет смысл по шагам: сначала шлюз по умолчанию, потом внешний адрес.

На микроконтроллере

Для IPv6 RFC 4443 (разд. 4.1) обязывает каждый узел отвечать на Echo Request, поэтому любой полноценный стек IPv6 на контроллере содержит ответчик. Отправлять запросы самому полезно для контроля связи с сервером: ESP-IDF для этого даёт API ICMP Echo. Сеанс создаётся функцией esp_ping_new_session() по структуре esp_ping_config_t, где задаются адрес цели (IPv4 или IPv6), число запросов count, интервал interval_ms, тайм-аут timeout_ms, размер данных data_size и ttl; count = 0 (ESP_PING_COUNT_INFINITE) означает бесконечный ping. Обратные вызовы on_ping_success, on_ping_timeout и on_ping_end получают результат, а esp_ping_get_profile() отдаёт номер последовательности, TTL ответа и время оборота. Документация Espressif приводит именно этот сценарий: устройство интернета вещей периодически проверяет, жив ли удалённый сервер, и предупреждает пользователя, если связь пропала. Прочие варианты сетевого стека для контроллеров — в статьях об ESP32 и об Ethernet для микроконтроллеров.

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

Какие типы ICMP у ping?

В IPv4 по RFC 792 запрос Echo имеет тип 8, ответ Echo Reply — тип 0, код в обоих случаях 0. В ICMPv6 по RFC 4443 это типы 128 (Echo Request) и 129 (Echo Reply), тоже с кодом 0. Ответчик меняет местами адреса, подставляет тип ответа и пересчитывает контрольную сумму, а данные возвращает без изменений.

Зачем в Echo поля Identifier и Sequence Number?

Чтобы отправитель мог сопоставить пришедший ответ с конкретным запросом. RFC 792 предлагает использовать идентификатор как порт в TCP или UDP — для обозначения сеанса ping, а номер последовательности увеличивать с каждым запросом. Ответчик копирует оба поля в ответ. Оба поля могут быть нулевыми. В ESP-IDF номер последовательности доступен через esp_ping_get_profile() с ключом ESP_PING_PROF_SEQNO и после перезапуска сеанса считается с нуля.

Обязано ли устройство отвечать на ping?

Для IPv6 — да: RFC 4443 (разд. 4.1) требует, чтобы каждый узел реализовал ответчик на Echo Request. Для IPv4 RFC 792 описывает формат, а требование отвечать на практике выполняют все стеки TCP/IP, хотя межсетевые экраны могут блокировать такие пакеты. Ответ на одноадресный запрос в IPv6 обязан уходить с того адреса, на который пришёл запрос.

Источники

  1. IETF. RFC 792 Internet Control Message Protocol. J. Postel, September 1981 — разд. Echo or Echo Reply Message: поля Type (8 — echo, 0 — echo reply), Code 0, Checksum, Identifier, Sequence Number, Data; для ответа адреса источника и назначения меняются местами, тип меняется на 0, сумма пересчитывается; сумма — 16-битное дополнение до единицы суммы по дополнению до единицы сообщения ICMP начиная с поля Type, при расчёте поле суммы равно нулю, при нечётной длине добавляется нулевой октет; Identifier и Sequence Number помогают сопоставить ответы с запросами и могут быть нулевыми; данные запроса должны быть возвращены в ответе; идентификатор может использоваться как порт в TCP или UDP для обозначения сеанса, номер последовательности — увеличиваться с каждым запросом
  2. IETF. RFC 4443 Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification. A. Conta, S. Deering, M. Gupta, March 2006 — разд. 2.3: сумма ICMPv6 считается по всему сообщению с псевдозаголовком IPv6, Next Header 58; разд. 4.1: Echo Request — Type 128, Code 0, Identifier и Sequence Number могут быть нулевыми, Data — ноль и более октетов произвольных данных; каждый узел обязан реализовать ответчик на Echo и должен бы предоставить интерфейс для отправки запросов в целях диагностики; разд. 4.2: Echo Reply — Type 129, Code 0, Identifier, Sequence Number и Data копируются из запроса; адрес источника ответа на одноадресный запрос обязан совпадать с адресом назначения запроса; данные обязаны вернуться целиком и без изменений; ограничения на объём данных нет
  3. Espressif. ESP-IDF Programming Guide v6.1, ESP32: ICMP Echo — сеанс ping создаётся esp_ping_new_session() по структуре esp_ping_config_t с полями count, interval_ms, timeout_ms, data_size, tos, ttl, target_addr (IPv4 или IPv6); ESP_PING_DEFAULT_CONFIG() — конфигурация по умолчанию; count = 0 (ESP_PING_COUNT_INFINITE) — бесконечный ping; обратные вызовы on_ping_success, on_ping_timeout, on_ping_end; esp_ping_get_profile() возвращает номер последовательности, TTL, размер ответа, время оборота; после остановки и повторного запуска сеанса номер последовательности считается с нуля; типовое применение — проверка, жив ли удалённый сервер
Страница помогла?

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