Что такое ICMP (Internet Control Message Protocol)
ICMP — это IP-протокол, используемый для проверки сетевого подключения между конечными точками или узлами, поддерживающими сетевой уровень 3.
ICMP является частью набора интернет-протоколов, как определено в RFC 792. I CMP-сообщения обычно используются в целях диагностики или управления или генерируются в ответ на ошибки в операциях IP. I Ошибки CMP направляются на исходный IP-адрес исходного пакета.


ICMP использует базовую поддержку IP, как если бы это был протокол более высокого уровня, однако на самом деле ICMP является неотъемлемой частью IP. Хотя сообщения ICMP содержатся в стандартных IP-пакетах, сообщения ICMP обычно обрабатываются как особый случай, отличный от обычной обработки IP.
Во многих случаях необходимо проверять содержимое ICMP-сообщения и доставлять соответствующее сообщение об ошибке приложению, ответственному за передачу IP-пакета, вызвавшего отправку ICMP-сообщения.
ICMP — это протокол сетевого уровня. С пакетами ICMP не связан номер порта TCP или UDP, поскольку эти номера связаны с транспортным уровнем выше.
Формат заголовка ICMP
Пакет ICMP инкапсулируется в пакет IPv4. Пакет состоит из разделов заголовка и данных (полезной нагрузки), заголовок имеет длину 8 байт, поля заголовка ICMP подробно описаны ниже:

Заголовок ICMP начинается после заголовка IPv4 и идентифицируется номером IP-протокола «1». Все пакеты ICMP имеют 8-байтовый заголовок и раздел данных переменного размера. Первые 4 байта заголовка имеют фиксированный формат, а последние 4 байта зависят от типа/кода этого ICMP-пакета.
Тип ICMP
1 для IPv4 и 3 для IPv6
Коды заголовков ICMP

Раздел данных ICMP

Сообщения об ошибках ICMP содержат раздел данных, который включает копию всего заголовка IPv4 отправленного пакета, а также не менее первых восьми байтов данных из пакета IPv4, вызвавшего сообщение об ошибке.
Длина сообщений об ошибках ICMP не должна превышать 576 байт. Эти данные используются хостом для сопоставления сообщения с соответствующим процессом. Если протокол более высокого уровня использует номера портов, предполагается, что они находятся в первых восьми байтах исходных данных дейтаграммы.
Анализ ICMP-дейтаграмм в Wireshark
Когда на хост отправляется команда ping, дейтаграмма инкапсулирует заголовок Ethernet, заголовок IP, заголовок ICMP и полезную нагрузку. Минимальный размер заголовка IPv4 составляет 20 байт, а максимальный размер — 60 байт.
Формат пакета ICMP
Размер данных полезной нагрузки по умолчанию в ping в Windows составляет 32 байта. Добавим в него 20 байт IP-заголовка и 8 байт ICMP-заголовка. 32+20+8, получается 60 байт.
Но, когда мы анализируем пинг в Wireshark, размер записываемого в лог фрейма составляет 74 байта. Это связано с тем, что при проверке связи нам также понадобятся MAC-адреса назначения и источника, которые доступны в заголовке Ethernet. Итак, 14 + 20 + 8 + 32 = 74 байта. Итак, ping отправляет инкапсулированный IP-пакет, который представляет собой комбинацию: заголовка Ethernet (14 байтов) + заголовка IP (20 байтов) + заголовка ICMP (8 байтов) + полезной нагрузки ICMP (32 байта)

Захват ICMP Wireshark

* Эхо-ответ

Протокол ICMP (Internet Control Message Protocol) — протокол межсетевых управляющих сообщений.

Протокол IP, который используется для передачи данных на сетевом уровне, сервис передачи данных без гарантии доставки. Если в пути по передаче данных с пакетом-то есть доход, то никаких выплат не будет
Информация о возникновении ошибок в сети, принадлежащей по протоколу ICMP. А также протокол ICMP может использоваться для диагностики работы в сети даже в случае непредвиденных ошибок. Так как IP предоставляет сервис без гарантии доставки, к сообщению об ошибках ICMP не требует передачи ни протокола ICMP ни протокола IP.
Формат заголовка ICMP
Рассмотрим формат пакета ICMP. Первое поле в заголовке тип. Оно говорит о том, что произошло в сети, какая ошибка или какое действие по диагностике протокола контроля.

Второй полекод сообщения. В нем подробно описан тип ошибки, ее причина или диагностическое действие. Дальше идёт контрольная сумма, которая используется для проверки правильности доставки. Следующие 4 байта, служебная информация, которая зависит от типа и кода сообщения. В поле данных ICMP, как правило включается фрагмент пакета при передачи которого произошла ошибка.
Типы ICMP — сообщений
Самое важно в пакете ICMP это тип сообщений. Именно тип, говорит о том, что произошло в сети. Есть 2 вида ICMP сообщений. Первый вид это запрос-ответ.

Коды ICMP — сообщений
Следующее поле в заголовке ICMP это код сообщения. Ниже представлено несколько возможных кодов для типа сообщения 3 — узел назначения недостижим. Какие могут быть причины? Причины перечислены ниже на картинке.

Применение ICMP
Большая часть пакетов ICMP формируется и отправляется автоматически сетевым оборудованиям. Но некоторые типы сообщений формируются утилитами, которые применяются для диагностики сети. Рассмотрим утилиты ping и traceroute (в Windows tracert)
Утилита ping
Утилита ping используется, чтобы проверить доступность компьютера в сети. Возможно подключиться к этому компьютеру или нельзя. Ping использует это-протокол ICMP. Компьютер, который хочет проверить доступность другого, отправляет эхо-запрос (тип=8, код=0).

Компьютер, который получил такой запрос, в ответ отправляет эхо-ответ ICMP с типом 0, если эхо-ответ не пришел, значит установить с компьютером соединение по сети невозможно.

Пример использования утилиты ping для проверки возможности подключиться к сайту ВКонтакте. По умолчанию утилита ping запускает 4 эхо-запроса и для каждого эхо-запроса получен эхо-ответ. В ответе указывается некоторая диагностическая информация.

Утилита traceroute
Утилита traceroute позволяет определить маршрут от отправителя к получателю. Под маршрутом имеется в виду перечень всех маршрутизаторов через которые проходит пакет.
Пример работы утилиты traceroute ее windows вариант tracert для определения маршрута к сайту ВКонтакте.

Работа утилиты traceroute
Как утилита traceroute узнает маршрутизатор? Для этого утилита использует ICMP сообщения время жизни истекло. Чтобы этого достичь, сначала отправляется сообщение у которого время жизни установлено в единицу TTL=1.

Пакет доходит до первого маршрутизатора, маршрутизатор уменьшает время жизни TTL=0 и маршрутизатор отбрасывает пакет.


На следующем этапе отправляется пакет с временем жизни равным двум TTL=2.

На первом маршрутизаторе время жизни уменьшается до единицы и пакет переходит на второй маршрутизатор.

Второй маршрутизатор снова уменьшает время на 1, время жизни становится нулем. Пакет отбрасывается и уже второй маршрутизатор отправляет сообщение время жизни истекло. Утилита traceroute извлекает адрес второго маршрутизатора из IP заголовка этого сообщения.

И так происходит до тех пор пока пакет не дойдет до узла назначения.
Заключение
Рассмотрели протокол ICMP протокол межсетевых управляющих сообщений. Протокол ICMP используется для сообщения об ошибках, которые происходят в сети и для тестирования работоспособности сети.
Types Summary
The 4-byte ICMP header contains an 8-bit type field, which defines the ICMP type. The type determines what the ICMP packet is used for. Depending on the type, the 8-bit code field may also be used, which contains additional information. If the type does not have any codes defined, the code field is set to zero.
Below is a table of all currently defined ICMP types. Note that some of these are IPv4 or IPv6 specific.
Active Types
There are many types which have been deprecated, or are reserved for some reason. The ones that are still active are outlined here.
Echo and Echo-Reply

Destination Unreachable
When this error is raised, a code is included (as shown in the table below), to give the sender a clue as to what is wrong. Additionally, the data field (after the full 8-byte header) includes a part of the original packet that failed. This is included so the sender can match the error to the process that generated the original packet.
Generally, codes 0-5 seem to be the most common. Код 2 (протокол недоступен) и код 3 (порт недоступен) отправляются конечным хостом и указывают на наличие проблемы на самом хосте, например, порт не открыт, процесс не запущен и так далее.
Код 0 (Net Unreachable), код 1 (Host Unreachable) и код 5 (Source Route Failed) отправляются промежуточным маршрутизатором и обычно предполагают наличие проблемы с маршрутизацией или брандмауэром.
Код 4 (необходима фрагментация и установлен бит DF) также отправляется промежуточным маршрутизатором. Это происходит, если пакет больше, чем MTU для промежуточной сети, однако фрагментация на более мелкие пакеты не допускается, поскольку установлен бит Dont Fragment в заголовке IP.
Эта ошибка возникает, когда хост отправляет эхо-запрос, но у промежуточного маршрутизатора нет маршрута к этому хосту. Помните, что сообщение ICMP будет получено только в том случае, если промежуточный маршрутизатор также имеет обратный маршрут к источнику.

Перенаправление
Сообщение о перенаправлении ICMP помогает сделать маршрутизацию более эффективной. В случае, когда хост имеет шлюз по умолчанию, и шлюз по умолчанию знает, что другой локальный маршрутизатор лучше подходит для сети, к которой хост пытается подключиться, шлюз отправит хосту перенаправление, сообщая хосту использовать этот маршрутизатор с этого момента. Это может применяться ко всему трафику в конкретной сети назначения или только к трафику для определенного хоста назначения.
Важно понимать, что это помогает повысить эффективность маршрутизации, но не используется для заполнения таблиц маршрутизации.
Как показано в захваченном пакете ниже, IP-адрес «лучшего» маршрутизатора включен во вторые 4 байта заголовка. Раздел данных заполняется первыми 8 байтами исходного пакета, поэтому отправитель может сопоставить сообщение с исходным процессом.

Реклама и запрос маршрутизатора
Сообщения Router Solicitation и Router Advertisement используются как часть протокола обнаружения интернет-маршрутизаторов (IRDP), который определен в RFC1256. Это метод обнаружения хостами соседних маршрутизаторов без какой-либо ручной настройки или поддержки DHCP.
Сообщение Solicitation (тип 10) отправляется хостом на многоадресный адрес 224.0.0.2, чтобы запросить у всех маршрутизаторов в локальном сегменте идентифицировать себя. Любые маршрутизаторы, получившие это сообщение (и поддерживающие IRDP), ответят сообщением Advertisement (тип 9), чтобы объявить свой IP-адрес доступным для маршрутизации. Маршрутизаторы также могут время от времени посылать сообщение Advertisement без запроса (скорее реклама, чем ответ).
Если ответит более одного маршрутизатора в локальном сегменте, хост выберет первый ответ. Если хост сделает неверный выбор, для повышения эффективности маршрутизации будут использоваться перенаправления ICMP.
Время истекло
Сообщение о превышении времени может генерироваться для двух разных ошибок; Во-первых, значение поля TTL (время жизни) в заголовке IP уменьшилось до нуля, и пакет пришлось отбросить. Во-вторых, устройство не смогло собрать фрагментированный пакет за отведенное время, и пакет был отброшен. Поле кода используется для определения того, какая из этих ошибок возникла.
Когда пакет отправляется с хоста-источника, устанавливается значение TTL в заголовке IP. Каждый переход уровня 3 в сети будет уменьшать это значение на 1, и в конечном итоге пакет либо будет доставлен, либо значение TTL упадет до нуля, и пакет будет отброшен. Это делается для предотвращения зацикливания, поэтому пакет будет отброшен, если он слишком долго зацикливается. Когда маршрутизатор уменьшает TTL до нуля, он создает сообщение Time Exceeded и отправляет его исходному узлу. Конечно, это может быть вызвано слишком низким значением TTL.
В некоторых случаях эта функция может быть полезна для обеспечения безопасности. Например, функция BGP TTL Security устанавливает TTL таким образом, чтобы были доступны только маршрутизаторы, находящиеся на максимальном расстоянии.
Имейте в виду, что некоторые устройства безопасности, даже если они уровня 3, не уменьшают TTL пакетов, проходящих через них.
Захваченный пакет ниже показывает пример сообщения Time Exceeded из-за истечения TTL.

Бывают случаи, когда пакет приходится разбивать на более мелкие части. Когда фрагменты прибывают в место назначения, их необходимо собрать в исходный пакет. Иногда проблема заключается в том, что один из фрагментов может пропасть, что приведет к отбрасыванию всего пакета.
Чтобы справиться с этим, стек IP запускает таймер при поступлении первого фрагмента. Если время таймера истекает до того, как все фрагменты будут собраны, пакет отбрасывается, а источнику создается и отправляется сообщение Time Exceeded.
Проблема с параметрами
Сообщение о проблеме с параметрами — это универсальное универсальное сообщение. который используется, если не применяется более конкретная ошибка. Это также будет использоваться в случае повреждения или отсутствия данных в заголовке IP.
Когда отправляется сообщение о проблеме с параметрами, указатель включается в старшие 8 бит второй части заголовка. Этот указатель содержит местоположение проблемы в исходном пакете.
В некоторых случаях указатель не включается. Например, если отсутствуют данные (коды 1 и 2), указателя не будет. Ведь трудно указать на данные, которых нет.
Временная метка-запрос и временная метка-ответ
Временные метки можно использовать для синхронизации времени между устройствами. Для этого устройство отправляет другому устройству запрос временной метки типа 13. В запросе указывается время отправки пакета, измеряемое в миллисекундах после полуночи по универсальному времени. Вторые четыре байта заголовка включают идентификатор и порядковый номер, которые используются для сопоставления запросов и ответов.
В ответ получатель генерирует ответ типа 14 Timestamp-Reply. Формат заголовка такой же, как у запроса, но полезная нагрузка включает исходную метку времени, метку времени получения пакета и метку времени отправки ответного пакета.
Фотурис
Photuris — это протокол управления сеансовыми ключами прикладного уровня (RFC2522). Он используется для создания ключей сеанса и установления сопоставлений безопасности IPSec. Он использует ICMP для отчетов о сбоях согласования.
Ссылки
Протокол управляющих сообщений Интернета (ICMP), описанный в RFC 792 и являющийся частью стека протоколов TCP/IP, представляет собой протокол сообщений об ошибках и управления, используемый между сетевыми устройствами.
Сообщения ICMP инкапсулируются в дейтаграммы IP, которые затем инкапсулируются в кадр Ethernet.
Что такое ICMP?
Протокол управляющих сообщений Интернета (ICMP) — это служебный протокол TCP/IP, отвечающий за предоставление информации о доступности устройств, служб или маршрутов в сети TCP/IP. Большинство методов и средств устранения сетевых неполадок основаны на распространенных типах сообщений ICMP.
Основная цель ICMP-пинга — проверить связь между устройствами. Данные отправляются с одного хоста на другой в виде запроса, а хост-получатель должен отправить эти данные обратно в качестве ответа.
Структура пакета ICMP Заголовок ICMP
Этот тип поля представляет собой однобайтовое поле в самом начале заголовка протокола ICMP.
Мы могли бы считать поле Тип ICMP классификацией пакета, а поле Код его подклассом. Например, значение поля «Тип», равное 3, указывает «назначение недоступно».
Хотя одной этой информации может быть недостаточно для устранения проблемы, если бы в этом пакете также было указано значение поля кода 3, указывающее «порт недоступен», мы могли бы сделать вывод, что существует проблема с портом, с которым мы пытаемся общаться.
Захват пакетов ICMP с помощью команды Tcpdump
В IPV4 мы можем использовать эту команду tcpdump для фильтрации всех пакетов ICMP. Мы используем сетевой интерфейс eth0 во всех наших примерах. Пожалуйста, измените его в зависимости от среды.
# tcpdump -i eth0 icmp
Это пакеты, которые мы получаем с помощью команды tcpdump.
Изучение протокола ICMP с примерами
Понимание команды Ping и ICMP с примерами
Изучение номера порта ICMP на примере
Захват пакетов ICMP с помощью Tcpdump




