ICMP (англ. Internet Control Message Protocol — протокол межсетевых управляющих сообщений[1]) — сетевой протокол, входящий в стек протоколов TCP/IP. В основном ICMP используется для передачи сообщений об ошибках и других исключительных ситуациях, возникших при передаче данных, например, запрашиваемая услуга недоступна или хост или маршрутизатор не отвечают. Также на ICMP возлагаются некоторые сервисные функции (services).
Протокол ICMP описан в RFC 792 от 1981 года Jon Postel (с дополнениями в RFC 950). ICMP является стандартом Интернета (входит в стандарт STD 5 вместе с IP). Хотя формально протокол использует IP (ICMP-пакеты инкапсулируются в IP пакеты), он является неотъемлемой частью IP и обязателен при реализации стека TCP/IP. Текущая версия ICMP для IPv4 называется ICMPv4. В IPv6 существует аналогичный протокол ICMPv6.
ICMP-сообщение строится из IP-пакетов, сгенерировавших ICMP-ответ. Протокол IP инкапсулирует соответствующее ICMP-сообщение с новым заголовком IP (чтобы отправить ICMP-сообщение обратно отправителю) и передает полученные пакеты дальше.
Например, каждая машина, которая перенаправляет IP-пакеты (например маршрутизатор), уменьшает значение поля Time to live (TTL) заголовка IP-пакета на единицу; если TTL достигает 0, на источник пакета отправляется ICMP-сообщение о превышении TTL.
ICMP основан на протоколе IP. Каждое ICMP-сообщение инкапсулируется непосредственно в пределах одного IP-пакета, и, таким образом, как и UDP и в отличие от TCP, ICMP является т. н. «ненадежным» (не контролирующим доставку и её правильность). В отличие от UDP, где реализация надёжности возложена на ПО прикладного уровня, ICMP (в силу специфики применения) обычно не нуждается в реализации надёжной доставки. Его цели отличны от целей транспортных протоколов, таких как TCP и UDP: он, как правило, не используется для передачи и приёма данных между конечными системами. ICMP не используется непосредственно в приложениях пользователей сети (исключение составляют инструменты Ping и Traceroute). Тот же Ping, например, служит обычно как раз для проверки потерь IP-пакетов на маршруте.
ICMP-сообщения (тип 1,2) генерируются при нахождении ошибок в заголовке IP-пакета (за исключением самих ICMP-пакетов, дабы не привести к бесконечно растущему потоку ICMP-сообщений об ICMP-сообщениях).
ICMP-сообщения (тип 3) генерируются маршрутизатором при отсутствии маршрута к адресату.
Утилита Ping, служащая для проверки возможности доставки IP-пакетов, использует ICMP-сообщения с типом 8 (эхо-запрос) и 0 (эхо-ответ).
Утилита Traceroute, отображающая путь следования IP-пакетов, использует ICMP-сообщения с типом 11.
ICMP-сообщения с типом 5 используются маршрутизаторами для обновления записей в таблице маршрутизации отправителя.
ICMP-сообщения с типом 4 используются получателем (или маршрутизатором) для управления скоростью отправки сообщений отправителем.
| Октет (байт) |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31
|
| [0—3] |
Тип |
Код |
Контрольная сумма
|
| … |
Данные (формат зависит от значений полей «Код» и «Тип»)
|
Типы пакетов ICMP
| Тип
|
Статус |
Код |
Сообщение |
Данные (длина, бит)
|
| 0
|
|
0 |
Эхо-ответ
|
| Идентификатор (16) |
Номер последовательности (16)
|
| Данные (переменная)
|
|
| 1, 2
|
не используется |
|
Зарезервировано |
|
| 3
|
|
Адресат недоступен
|
| Не используется (32)
|
| Заголовок IP, Начало исходной дейтаграммы (64)
|
|
|
|
0 |
Сеть недостижима
|
|
|
1 |
Узел недостижим
|
|
|
2 |
Протокол недостижим
|
|
|
3 |
Порт недостижим
|
|
|
4 |
Необходима фрагментация, но установлен флаг её запрета (DF)
|
|
|
5 |
Неверный маршрут от источника
|
|
|
6 |
Сеть назначения неизвестна
|
|
|
7 |
Узел назначения неизвестен
|
|
|
8 |
Узел источник изолирован
|
|
|
9 |
Сеть административно запрещена
|
|
|
10 |
Узел административно запрещён
|
|
|
11 |
Сеть недоступна для ToS
|
|
|
12 |
Узел недоступен для ToS
|
|
|
13 |
Коммуникации административно запрещены
|
|
|
14 |
Нарушение порядка предпочтения узлов
|
|
|
15 |
Активно отсечение порядка предпочтения
|
| 4
|
устарел |
0 |
Сдерживание источника (отключение источника при переполнении очереди)
|
| 5
|
|
Перенаправление
|
| Адрес маршрутизатора (32)
|
| Заголовок IP, Начало исходной дейтаграммы (64)
|
|
|
|
0 |
Перенаправление пакетов в сеть
|
|
|
1 |
Перенаправление пакетов к узлу
|
|
|
2 |
Перенаправление для каждого типа обслуживания (ToS)
|
|
|
3 |
Перенаправление пакета к узлу для каждого типа обслуживания
|
| 6
|
устарел |
0 |
Альтернативный адрес узла |
|
| 7
|
не используется |
|
Зарезервировано |
|
| 8
|
|
0 |
Эхо-запрос
|
| Идентификатор (16) |
Номер последовательности (16)
|
| Данные (переменная)
|
|
| 9
|
|
0 |
Объявление маршрутизатора
|
| Количество адресов (8) |
Размер элемента (8) |
Срок действия (16)
|
| Адрес[1] (32)
|
| Предпочтительность[1] (32)
|
| …
|
| Адрес[N] (32)
|
| Предпочтительность[N] (32)
|
|
| 10
|
|
0 |
Запрос маршрутизатора
|
|
| 11
|
|
Время жизни дейтаграммы истекло
|
| Не используется (32)
|
| Заголовок IP, Начало исходной дейтаграммы (64)
|
|
|
|
0 |
Время жизни пакета (TTL) истекло при транспортировке
|
|
|
1 |
Время жизни пакета истекло при сборке фрагментов
|
| 12
|
|
Неверный параметр (проблема с параметрами дейтаграммы: ошибка в IP-заголовке или отсутствует необходимая опция)
|
|
|
0 |
Указатель говорит об ошибке
|
| Указатель (8) |
Не используется (24)
|
| Заголовок IP, Начало исходной дейтаграммы (64)
|
|
|
|
1 |
Отсутствует требуемая опция
|
| Не используется (32)
|
| Заголовок IP, Начало исходной дейтаграммы (64)
|
|
|
|
2 |
Некорректная длина
|
| 13
|
|
0 |
Запрос метки времени
|
| Идентификатор (16) |
Номер последовательности (16)
|
| Начальное время (32)
|
| Время приёма (32)
|
| Время отправки (32)
|
|
| 14
|
|
0 |
Ответ с меткой времени
|
| 15
|
устарел |
0 |
Информационный запрос
|
| Идентификатор (16) |
Номер последовательности (16)
|
|
| 16
|
устарел |
0 |
Информационный ответ
|
| 17
|
устарел |
0 |
Запрос адресной маски
|
| Идентификатор (16) |
Номер последовательности (16)
|
| Маска (32)
|
|
| 18
|
устарел |
0 |
Отклик на запрос адресной маски
|
| 19
|
зарезервирован |
|
Зарезервировано (для обеспечения безопасности) |
|
| 20—29
|
зарезервирован |
|
Зарезервировано (для экспериментов на устойчивость к ошибкам) |
|
| 30
|
устарел |
Трассировка маршрута
|
| Идентификатор (16) |
Не используется (16)
|
| Количество хопов исходящего пакета (16) |
Количество хопов возвращающегося пакета (16)
|
| Скорость линии связи (32)
|
| MTU линии связи (32)
|
|
| 0 |
Исходящий пакет успешно отправлен
|
| 1 |
Путь для исходящего пакета не найден, пакет уничтожен
|
| 31
|
устарел |
Ошибка преобразования датаграммы
|
| Указатель (32)
|
| Заголовок IP и транспортного протокола исходной дейтаграммы
|
|
| 0 |
Неизвестная или неуказанная ошибка
|
| 1 |
Невозможно конвертировать опцию
|
| 2 |
Неизвестная обязательная опция
|
| 3 |
Неподдерживаемая обязательная опция
|
| 4 |
Неподдерживаемый транспортный протокол
|
| 5 |
Превышена полная длина
|
| 6 |
Превышена длина заголовка IP
|
| 7 |
Номер транспортного протокола больше 255
|
| 8 |
Номер порта вне допустимого диапазона
|
| 9 |
Превышена длина заголовка транспортного протокола
|
| 10 |
Переход через границу 32 бит и установлен бит ACK
|
| 11 |
Неизвестная обязательная опция транспортного протокола
|
| 32
|
устарел |
|
Перенаправление для мобильного узла |
|
| 33
|
устарел |
|
IPv6 Where-Are-You (где вы находитесь) |
|
| 34
|
устарел |
|
IPv6 I-Am-Here (я здесь) |
|
| 35
|
устарел |
|
Запрос перенаправления для мобильного узла |
|
| 36
|
устарел |
|
Отклик на запрос перенаправления для мобильного узла |
|
| 37
|
устарел |
|
Запрос доменного имени |
|
| 38
|
устарел |
|
Ответ на запрос доменного имени |
|
| 39
|
устарел |
|
Обнаружение алгоритма безопасности SKIP (SKIP algorithm discovery ICMP message) |
|
| 40
|
|
Photuris |
|
|
|
0 |
Зарезервировано
|
|
|
1 |
Неизвестный индекс параметров безопасности
|
|
|
2 |
Параметры безопасности верны, но произошла ошибка аутентификации
|
|
|
3 |
Параметры безопасности верны, но произошёл сбой при расшифровке
|
|
|
4 |
Требуется проверка подлинности
|
|
|
5 |
Требуется авторизация
|
| 41
|
экспериментальный
|
|
|
|
| 42—252
|
|
|
Зарезервировано
|
|
| 253-254
|
экспериментальный
|
|
Зарезервировано для экспериментов по RFC 3692
|
|
| 255
|
зарезервирован
|
|
Зарезервировано
|
|
- При потере ICMP-пакета никогда не генерируется новый.
- ICMP-пакеты никогда не генерируются в ответ на IP-пакеты с широковещательным или групповым адресом, чтобы не вызывать перегрузку в сети (так называемый широковещательный шторм).
- При повреждении фрагментированного IP-пакета ICMP-сообщение отправляется сразу после получения первого повреждённого фрагмента, поскольку отправитель всё равно повторит передачу всего IP-пакета целиком.
Правила чтения таблиц, описывающих структуру заголовков сетевых протоколов