Контрольная сумма 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). Процесс состоит из следующих шагов:
- Инициализация: Поле контрольной суммы в заголовке ICMP-пакета устанавливается в нулевое значение (0x0000).
- Разбиение на 16-битные слова: Весь ICMP-пакет (заголовок и данные) рассматривается как последовательность 16-битных слов. Если длина пакета не кратна двум байтам, он дополняется нулевым байтом (padding) для выравнивания. Это дополнение не передаётся в сети и используется только для вычисления.
- Суммирование: Все 16-битные слова складываются с использованием арифметики с дополнением до единицы (one’s complement addition). При переполнении (когда сумма превышает 16 бит) перенос добавляется обратно к младшим битам (циклический перенос).
- Инвертирование: Результат суммы инвертируется (все биты заменяются на противоположные). Полученное 16-битное значение и есть контрольная сумма.
- Запись: Инвертированное значение записывается в поле контрольной суммы заголовка.
Пример упрощённого вычисления: Пусть пакет состоит из двух 16-битных слов: 0x1234 и 0x5678.
- Сумма: 0x1234 + 0x5678 = 0x68AC.
- Инвертирование: ~0x68AC = 0x9753.
- Контрольная сумма: 0x9753.
При проверке получатель выполняет те же операции, включая поле контрольной суммы. Если в результате получается 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-заголовка. Псевдозаголовок содержит:
- IP-адрес источника (128 бит).
- IP-адрес назначения (128 бит).
- Длину ICMPv6-пакета (32 бита).
- Нулевые биты (24 бита).
- Следующий заголовок (8 бит) — значение 58 для ICMPv6.
Это сделано для защиты от ошибок, связанных с неправильной маршрутизацией или подменой адресов. В IPv4 для ICMP псевдозаголовок не используется.
Проверка контрольной суммы
При получении ICMP-пакета устройство выполняет следующие действия:
- Вычисляет контрольную сумму по всему пакету (включая поле контрольной суммы, которое считается равным нулю на момент вычисления).
- Сравнивает результат с переданным значением.
- Если значения совпадают (результат суммирования с включённым полем контрольной суммы даёт 0xFFFF), пакет принимается. В противном случае пакет отбрасывается без уведомления отправителя.
Игнорирование пакетов с неверной контрольной суммой — стандартное поведение для всех реализаций стека TCP/IP. Это предотвращает обработку повреждённых данных, которые могли возникнуть из-за аппаратных сбоев, помех на линии или злонамеренных атак.
Значение и применение
Контрольная сумма ICMP играет ключевую роль в обеспечении надёжности IP-сетей:
- Обнаружение ошибок: Позволяет выявить битовые искажения, возникшие при передаче через физическую среду (например, из-за электромагнитных помех).
- Диагностика сети: Утилиты ping и traceroute полагаются на ICMP-пакеты (эхо-запросы и эхо-ответы). Корректная контрольная сумма гарантирует, что диагностические данные не искажены.
- Безопасность: Злоумышленники могут подделывать ICMP-пакеты (например, для атак типа «ICMP flood» или «Smurf»), но неверная контрольная сумма делает такие пакеты недействительными. Однако это не является полноценной защитой, так как атакующий может правильно вычислить сумму.
Критика и ограничения
- Отсутствие шифрования: Контрольная сумма не обеспечивает конфиденциальность или аутентификацию. Она только проверяет целостность данных, но не защищает от намеренной модификации (если злоумышленник перехватит пакет, он может пересчитать контрольную сумму).
- Уязвимость к атакам: В некоторых типах ICMP-сообщений (например, «Redirect») подделка пакета может привести к перенаправлению трафика. Контрольная сумма не предотвращает такие атаки.
- Алгоритмическая простота: Однодополнительная сумма не является криптостойкой. Для обнаружения случайных ошибок она эффективна, но не защищает от целенаправленных искажений.
Источники
- RFC 792 — Internet Control Message Protocol (1981).
- RFC 1122 — Requirements for Internet Hosts — Communication Layers (1989).
- RFC 1812 — Requirements for IP Version 4 Routers (1995).
- RFC 4443 — Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) (2006).
- Stevens, W. Richard. «TCP/IP Illustrated, Volume 1: The Protocols» (1994).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →