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 / 0 | 128 / 129 |
| Код | 0 | 0 |
| Контрольная сумма | по сообщению 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 обязан уходить с того адреса, на который пришёл запрос.
Источники
- 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 для обозначения сеанса, номер последовательности — увеличиваться с каждым запросом
- 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 копируются из запроса; адрес источника ответа на одноадресный запрос обязан совпадать с адресом назначения запроса; данные обязаны вернуться целиком и без изменений; ограничения на объём данных нет
- 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, размер ответа, время оборота; после остановки и повторного запуска сеанса номер последовательности считается с нуля; типовое применение — проверка, жив ли удалённый сервер
Нашли ошибку? ·
Смотрите также
- Контрольная сумма UDP16-битная сумма по псевдозаголовку, заголовку и данным UDP; необязательна в IPv4, обязательна в IPv6
- TCPНадёжный поток байтов поверх IP: рукопожатие, порты, подтверждения, keep-alive
- Hop Limit / TTL8-битный счётчик переходов в заголовке IP: уменьшается на каждом маршрутизаторе, при нуле пакет отбрасывается
- Path MTU Discovery (PMTUD)Как узел IPv6 подбирает размер пакета под самый узкий канал пути: Packet Too Big, минимум 1280, таймеры
- NAT (трансляция адресов)Подмена адресов и портов на границе частной сети: привязки, направление сеанса, таймауты, что не работает
- Шлюз по умолчаниюМаршрутизатор для пакетов за пределы подсети; адрес из той же подсети
- Ethernet для микроконтроллераW5500, ENC28J60, MAC + PHY по RMII, LAN8720, DP83848, трансформатор и разводка
- ESP32ESP32, S2, S3, C2, C3, C5, C6, H2, P4: ядра, радио, USB, GPIO — сравнение и выбор