Открыть сервис

Контрольная сумма ICMP

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

История и стандартизация

Протокол ICMP был впервые определён в RFC 792 (1981 год) как неотъемлемая часть стека протоколов TCP/IP. В этом документе были заложены основные принципы вычисления контрольной суммы, которые остаются неизменными до настоящего времени. В отличие от протоколов TCP и UDP, где контрольная сумма может быть опциональной (например, в IPv4 для UDP), для ICMP она всегда обязательна. Это связано с тем, что ICMP используется для передачи сообщений об ошибках и диагностики сети, и её надёжность критична для корректной работы IP-сетей.

В последующих RFC (например, RFC 1122, RFC 1812) уточнялись правила обработки ICMP-пакетов, но алгоритм вычисления контрольной суммы оставался прежним. В IPv6 (RFC 4443) контрольная сумма ICMPv6 также обязательна, но включает в себя псевдозаголовок для защиты от ошибок маршрутизации.

Алгоритм вычисления

Контрольная сумма ICMP вычисляется по алгоритму, известному как «однодополнительная сумма» (one’s complement sum). Процесс состоит из следующих шагов:

  1. Инициализация: Поле контрольной суммы в заголовке ICMP-пакета устанавливается в нулевое значение (0x0000).
  2. Разбиение на 16-битные слова: Весь ICMP-пакет (заголовок и данные) рассматривается как последовательность 16-битных слов. Если длина пакета не кратна двум байтам, он дополняется нулевым байтом (padding) для выравнивания. Это дополнение не передаётся в сети и используется только для вычисления.
  3. Суммирование: Все 16-битные слова складываются с использованием арифметики с дополнением до единицы (one’s complement addition). При переполнении (когда сумма превышает 16 бит) перенос добавляется обратно к младшим битам (циклический перенос).
  4. Инвертирование: Результат суммы инвертируется (все биты заменяются на противоположные). Полученное 16-битное значение и есть контрольная сумма.
  5. Запись: Инвертированное значение записывается в поле контрольной суммы заголовка.

Пример упрощённого вычисления: Пусть пакет состоит из двух 16-битных слов: 0x1234 и 0x5678.

При проверке получатель выполняет те же операции, включая поле контрольной суммы. Если в результате получается 0xFFFF (все биты равны 1), пакет считается неповреждённым. Любое другое значение указывает на ошибку.

Структура ICMP-пакета и поле контрольной суммы

ICMP-пакет состоит из заголовка (8 байт) и данных (переменной длины). Поле контрольной суммы занимает 3-й и 4-й байты заголовка (смещение 2–3):

Смещение (байты)ПолеРазмер (бит)Описание
0–1Тип (Type)8Определяет тип сообщения (например, 8 — эхо-запрос, 0 — эхо-ответ).
1–2Код (Code)8Уточняет тип сообщения (например, для типа 3 «Destination Unreachable» коды 0–15).
2–3Контрольная сумма (Checksum)16Вычисляется по всему ICMP-пакету.
4–7Зависит от типа32Например, идентификатор и номер последовательности для эхо-запросов.

Данные (payload) следуют после заголовка. Для некоторых типов сообщений (например, «Destination Unreachable») данные содержат заголовок и первые 8 байт исходного IP-пакета, вызвавшего ошибку.

Особенности для ICMPv6

В IPv6 протокол ICMPv6 (RFC 4443) использует тот же алгоритм вычисления контрольной суммы, но с одним важным дополнением: в расчёт включается псевдозаголовок (pseudo-header) из IPv6-заголовка. Псевдозаголовок содержит:

Это сделано для защиты от ошибок, связанных с неправильной маршрутизацией или подменой адресов. В IPv4 для ICMP псевдозаголовок не используется.

Проверка контрольной суммы

При получении ICMP-пакета устройство выполняет следующие действия:

  1. Вычисляет контрольную сумму по всему пакету (включая поле контрольной суммы, которое считается равным нулю на момент вычисления).
  2. Сравнивает результат с переданным значением.
  3. Если значения совпадают (результат суммирования с включённым полем контрольной суммы даёт 0xFFFF), пакет принимается. В противном случае пакет отбрасывается без уведомления отправителя.

Игнорирование пакетов с неверной контрольной суммой — стандартное поведение для всех реализаций стека TCP/IP. Это предотвращает обработку повреждённых данных, которые могли возникнуть из-за аппаратных сбоев, помех на линии или злонамеренных атак.

Значение и применение

Контрольная сумма ICMP играет ключевую роль в обеспечении надёжности IP-сетей:

Критика и ограничения

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →