ICMP — это вспомогательный протокол сетевого уровня (Layer 3) модели OSI, предназначенный для передачи диагностических и служебных сообщений, связанных с работой IP-сетей.
Он используется узлами и маршрутизаторами для обнаружения ошибок, управления трафиком и тестирования соединения. В модели TCP-IP ICMP входит в сетевой уровень (Internet Layer), рядом с IP.
ICMP не предназначен для передачи пользовательских данных.


Основные функции

  • Сообщение об ошибках при доставке IP-пакетов.
  • Диагностика сети (например, ping, traceroute).
  • Информирование о перегрузке, недоступности хоста, перенаправлении маршрута.
  • Проверка связи между устройствами.

Особенности

  • ICMP инкапсулируется в IP-пакет (Protocol = 1 для ICMPv4, Protocol = 58 для ICMPv6).
  • Не использует TCP или UDP — работает “поверх” IP.
  • Не надёжный протокол, без подтверждения доставки.
  • Контрольная сумма используется для проверки целостности.

Формат ICMP-пакета (ICMPv4)

ПолеРазмер (бит)Описание
Type8Тип сообщения (например, Echo Request = 8, Echo Reply = 0)
Code8Подтип, уточняющий тип ошибки
Checksum16Контрольная сумма ICMP-заголовка и данных
Rest of Header32Зависит от типа сообщения (идентификатор, последовательность, MTU и т.д.)
DataпеременноДополнительная информация (например, часть оригинального IP-пакета)

Основные типы сообщений ICMPv4

Сообщения ошибок

TypeCodeОписание
30–15Destination Unreachable — адрес, порт или сеть недоступны
40Source Quench (устарел) — сигнал о перегрузке
50–3Redirect — перенаправление пакета на другой маршрут
110–1Time Exceeded — TTL истёк
120Parameter Problem — ошибка в заголовке IP

Информационные сообщения

TypeCodeОписание
00Echo Reply — ответ на ping
80Echo Request — запрос ping
130Timestamp Request
140Timestamp Reply
17 / 18Address Mask Request/Reply (устарело)

Пример ICMP Echo (ping)

При выполнении ping 8.8.8.8 происходит:

  1. Отправляется ICMP Echo Request (type 8) с уникальным идентификатором и номером последовательности.
  2. Узел-получатель отвечает ICMP Echo Reply (type 0).
  3. По времени между отправкой и получением вычисляется RTT (Round Trip Time).
  4. Потеря пакетов или превышение TTL говорит о проблемах маршрута.

Пример ICMP Time Exceeded (traceroute)

Утилита traceroute использует ICMP следующим образом:

  1. Отправляет IP-пакеты с постепенно увеличивающимся TTL (1, 2, 3, …).
  2. Каждый маршрутизатор, уменьшив TTL до 0, отправляет обратно ICMP Time Exceeded (type 11).
  3. Таким образом строится список маршрутизаторов на пути к цели.

ICMPv6 (Internet Control Message Protocol for IPv6)

ICMPv6 (Protocol = 58) объединяет функции ICMPv4, ARP и других служебных протоколов. Основные типы:

TypeНазначение
1–4Сообщения об ошибках (аналог ICMPv4)
128/129Echo Request / Reply
133–137Neighbor Discovery (Router Solicitation, Advertisement, Neighbor Solicitation, Advertisement)
143Multicast Listener Report (для multicast-групп)

ICMPv6 — ключевой компонент IPv6, т.к. именно через него происходит автоконфигурация, обнаружение соседей и маршрутизаторов.


Взаимодействие с другими протоколами

ПротоколВзаимодействие
IPICMP используется для диагностики ошибок доставки IP-пакетов
ARP / NDPICMPv6 заменяет ARP в IPv6-сетях
TCP / UDPПри ошибках (например, порт недоступен) генерируются ICMP-сообщения
OSPF / BGPИспользуют ICMP для проверки связности перед установлением соседства

Безопасность

  • ICMP может использоваться для атак (например, ICMP flood / ping flood, Smurf-атака).
  • Возможны ICMP Redirect подмены маршрутов.
  • В продакшн-сетях часто фильтруют ICMP частично (но не полностью, иначе диагностика ухудшается).

Рекомендации:

  • Разрешать Echo Reply и Time Exceeded, но ограничивать скорость (rate-limit).
  • Блокировать ICMP Redirect и Source Quench.
  • Не фильтровать ICMPv6 (он критичен для работы IPv6).

Диагностические утилиты

УтилитаНазначение
pingПроверка доступности узла (Echo Request/Reply)
traceroute / tracertОпределение маршрута
mtrКомбинированная трассировка + RTT
tcpdump -n icmpАнализ ICMP-пакетов
hping3Отправка произвольных ICMP/TCP/UDP пакетов

Пример анализа ICMP через tcpdump

$ sudo tcpdump -n -i eth0 icmp
IP 192.168.1.10 > 8.8.8.8: ICMP echo request, id 1234, seq 1
IP 8.8.8.8 > 192.168.1.10: ICMP echo reply, id 1234, seq 1

Типичные сценарии использования

  • Проверка связи между устройствами (ping).
  • Диагностика маршрута (traceroute).
  • Уведомления о недостижимости узлов или сетей.
  • Автоматическое определение MTU (через ICMP “Fragmentation Needed”).
  • Контроль состояния маршрутизаторов и шлюзов.