ICMP
ICMP (англ. Internet Control Message Protocol — протокол межсетевых управляющих сообщений[1]) — сетевой протокол, входящий в стек протоколов TCP/IP. В основном ICMP используется для передачи сообщений об ошибках и других исключительных ситуациях, возникших при передаче данных, например, запрашиваемая услуга недоступна или хост, или маршрутизатор не отвечают. Также на ICMP возлагаются некоторые сервисные функции (services).
| ICMP | |
|---|---|
| Название | Internet Control Message Protocol |
| Уровень (по модели OSI) | Сетевой |
| Семейство | TCP/IP |
| Спецификация | RFC 792 |
Технические подробности
Протокол 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-сообщений
ICMP-сообщения (тип 12) генерируются при нахождении ошибок в заголовке IP-пакета (за исключением самих ICMP-пакетов, дабы не привести к бесконечно растущему потоку ICMP-сообщений об ICMP-сообщениях).
ICMP-сообщения (тип 3) генерируются маршрутизатором при отсутствии маршрута к адресату.
Утилита Ping, служащая для проверки возможности доставки IP-пакетов, использует ICMP-сообщения с типом 8 (эхо-запрос) и 0 (эхо-ответ).
Утилита Traceroute, отображающая путь следования IP-пакетов, использует ICMP-сообщения с типом 11.
ICMP-сообщения с типом 5 используются маршрутизаторами для обновления записей в таблице маршрутизации отправителя.
ICMP-сообщения с типом 4 используются получателем (или маршрутизатором) для управления скоростью отправки сообщений отправителем.
Формат пакета ICMP
| Октет (байт) | 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] | Тип | Код | Контрольная сумма | |||||||||||||||||||||||||||||
| … | Данные (формат зависит от значений полей «Код» и «Тип») | |||||||||||||||||||||||||||||||
| Тип | Статус | Код | Сообщение | Данные (длина, бит) | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | Эхо-ответ |
| |||||||||||||||||||
| 1, 2 | не используется | Зарезервировано | ||||||||||||||||||||
| 3 | Адресат недоступен |
| ||||||||||||||||||||
| 0 | Сеть недостижима | |||||||||||||||||||||
| 1 | Узел недостижим | |||||||||||||||||||||
| 2 | Протокол недостижим | |||||||||||||||||||||
| 3 | Порт недостижим | |||||||||||||||||||||
| 4 | Необходима фрагментация, но установлен флаг её запрета (DF) | |||||||||||||||||||||
| 5 | Неверный маршрут от источника | |||||||||||||||||||||
| 6 | Сеть назначения неизвестна | |||||||||||||||||||||
| 7 | Узел назначения неизвестен | |||||||||||||||||||||
| 8 | Узел источник изолирован | |||||||||||||||||||||
| 9 | Сеть административно запрещена | |||||||||||||||||||||
| 10 | Узел административно запрещён | |||||||||||||||||||||
| 11 | Сеть недоступна для ToS | |||||||||||||||||||||
| 12 | Узел недоступен для ToS | |||||||||||||||||||||
| 13 | Коммуникации административно запрещены | |||||||||||||||||||||
| 14 | Нарушение порядка предпочтения узлов | |||||||||||||||||||||
| 15 | Активно отсечение порядка предпочтения | |||||||||||||||||||||
| 4 | устарел | 0 | Сдерживание источника (отключение источника при переполнении очереди) | |||||||||||||||||||
| 5 | Перенаправление |
| ||||||||||||||||||||
| 0 | Перенаправление пакетов в сеть | |||||||||||||||||||||
| 1 | Перенаправление пакетов к узлу | |||||||||||||||||||||
| 2 | Перенаправление для каждого типа обслуживания (ToS) | |||||||||||||||||||||
| 3 | Перенаправление пакета к узлу для каждого типа обслуживания | |||||||||||||||||||||
| 6 | устарел | 0 | Альтернативный адрес узла | |||||||||||||||||||
| 7 | не используется | Зарезервировано | ||||||||||||||||||||
| 8 | 0 | Эхо-запрос |
| |||||||||||||||||||
| 9 | 0 | Объявление маршрутизатора |
| |||||||||||||||||||
| 10 | 0 | Запрос маршрутизатора |
| |||||||||||||||||||
| 11 | Время жизни дейтаграммы истекло |
| ||||||||||||||||||||
| 0 | Время жизни пакета (TTL) истекло при транспортировке | |||||||||||||||||||||
| 1 | Время жизни пакета истекло при сборке фрагментов | |||||||||||||||||||||
| 12 | Неверный параметр (проблема с параметрами дейтаграммы: ошибка в IP-заголовке или отсутствует необходимая опция) | |||||||||||||||||||||
| 0 | Указатель говорит об ошибке |
| ||||||||||||||||||||
| 1 | Отсутствует требуемая опция |
| ||||||||||||||||||||
| 2 | Некорректная длина | |||||||||||||||||||||
| 13 | 0 | Запрос метки времени |
| |||||||||||||||||||
| 14 | 0 | Ответ с меткой времени | ||||||||||||||||||||
| 15 | устарел | 0 | Информационный запрос |
| ||||||||||||||||||
| 16 | устарел | 0 | Информационный ответ | |||||||||||||||||||
| 17 | устарел | 0 | Запрос адресной маски |
| ||||||||||||||||||
| 18 | устарел | 0 | Отклик на запрос адресной маски | |||||||||||||||||||
| 19 | зарезервирован | Зарезервировано (для обеспечения безопасности) | ||||||||||||||||||||
| 20—29 | зарезервирован | Зарезервировано (для экспериментов на устойчивость к ошибкам) | ||||||||||||||||||||
| 30 | устарел | Трассировка маршрута |
| |||||||||||||||||||
| 0 | Исходящий пакет успешно отправлен | |||||||||||||||||||||
| 1 | Путь для исходящего пакета не найден, пакет уничтожен | |||||||||||||||||||||
| 31 | устарел | Ошибка преобразования датаграммы |
| |||||||||||||||||||
| 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-пакета никогда не генерируется новый.
- ICMP-пакеты никогда не генерируются в ответ на IP-пакеты с широковещательным или групповым адресом, чтобы не вызывать перегрузку в сети (так называемый «широковещательный шторм»).
- При повреждении фрагментированного IP-пакета ICMP-сообщение отправляется сразу после получения первого повреждённого фрагмента, поскольку отправитель всё равно повторит передачу всего IP-пакета целиком.
См. также
Примечания
Ссылки
- RFC 792 (ICMPv4)
- RFC 950 Address Mask
- RFC 1122 (дополнительные типы ICMP-сообщений для существующих кодов)
- RFC 1393 Traceroute
- RFC 1256 Router Advertisement Solicitation
- RFC 1475 Conversion Failed
- RFC 1812 (дополнительные типы ICMP-сообщений для существующих кодов)
- RFC 4443 (ICMPv6)
- RFC 2463 (ICMPv6)
- RFC 1885 (ICMPv6)
- RFC 4884 Расширение сообщений и обратная совместимость
- Навязывание хосту ложного маршрута с использованием протокола ICMP
- ICMP-атаки с 01 по 05 документ