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)
| Поле | Размер (бит) | Описание |
|---|---|---|
| Type | 8 | Тип сообщения (например, Echo Request = 8, Echo Reply = 0) |
| Code | 8 | Подтип, уточняющий тип ошибки |
| Checksum | 16 | Контрольная сумма ICMP-заголовка и данных |
| Rest of Header | 32 | Зависит от типа сообщения (идентификатор, последовательность, MTU и т.д.) |
| Data | переменно | Дополнительная информация (например, часть оригинального IP-пакета) |
Основные типы сообщений ICMPv4
Сообщения ошибок
| Type | Code | Описание |
|---|---|---|
| 3 | 0–15 | Destination Unreachable — адрес, порт или сеть недоступны |
| 4 | 0 | Source Quench (устарел) — сигнал о перегрузке |
| 5 | 0–3 | Redirect — перенаправление пакета на другой маршрут |
| 11 | 0–1 | Time Exceeded — TTL истёк |
| 12 | 0 | Parameter Problem — ошибка в заголовке IP |
Информационные сообщения
| Type | Code | Описание |
|---|---|---|
| 0 | 0 | Echo Reply — ответ на ping |
| 8 | 0 | Echo Request — запрос ping |
| 13 | 0 | Timestamp Request |
| 14 | 0 | Timestamp Reply |
| 17 / 18 | — | Address Mask Request/Reply (устарело) |
Пример ICMP Echo (ping)
При выполнении ping 8.8.8.8 происходит:
- Отправляется ICMP Echo Request (type 8) с уникальным идентификатором и номером последовательности.
- Узел-получатель отвечает ICMP Echo Reply (type 0).
- По времени между отправкой и получением вычисляется RTT (Round Trip Time).
- Потеря пакетов или превышение TTL говорит о проблемах маршрута.
Пример ICMP Time Exceeded (traceroute)
Утилита traceroute использует ICMP следующим образом:
- Отправляет IP-пакеты с постепенно увеличивающимся TTL (1, 2, 3, …).
- Каждый маршрутизатор, уменьшив TTL до 0, отправляет обратно ICMP Time Exceeded (type 11).
- Таким образом строится список маршрутизаторов на пути к цели.
ICMPv6 (Internet Control Message Protocol for IPv6)
ICMPv6 (Protocol = 58) объединяет функции ICMPv4, ARP и других служебных протоколов. Основные типы:
| Type | Назначение |
|---|---|
| 1–4 | Сообщения об ошибках (аналог ICMPv4) |
| 128/129 | Echo Request / Reply |
| 133–137 | Neighbor Discovery (Router Solicitation, Advertisement, Neighbor Solicitation, Advertisement) |
| 143 | Multicast Listener Report (для multicast-групп) |
ICMPv6 — ключевой компонент IPv6, т.к. именно через него происходит автоконфигурация, обнаружение соседей и маршрутизаторов.
Взаимодействие с другими протоколами
| Протокол | Взаимодействие |
|---|---|
| IP | ICMP используется для диагностики ошибок доставки IP-пакетов |
| ARP / NDP | ICMPv6 заменяет 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”).
- Контроль состояния маршрутизаторов и шлюзов.