Что такое ICMP
ICMP (Internet Control Message Protocol, RFC 792) - слой поверх IP для служебных сообщений: уведомлений об ошибках доставки, диагностики, MTU discovery. Это не транспорт для данных приложений (TCP/UDP - для этого).
ICMP-пакет - это IP-пакет с protocol number 1, payload содержит ICMP-header (type + code + checksum) и type-specific data.
Самые важные типы
| type | code | название | назначение |
|---|---|---|---|
| 0 | 0 | echo-reply | ответ на ping |
| 3 | 0 | destination-unreachable: net | сеть недостижима |
| 3 | 1 | destination-unreachable: host | хост недостижим (ARP не разрешился) |
| 3 | 3 | destination-unreachable: port | порт закрыт (UDP-трюк) |
| 3 | 4 | fragmentation-needed | пакет > MTU + DF (PMTU discovery) |
| 5 | 0 | redirect | роутер сообщает «у тебя плохой маршрут, используй Y» |
| 8 | 0 | echo-request | ping-запрос |
| 11 | 0 | time-exceeded: TTL=0 | основа traceroute |
| 11 | 1 | time-exceeded: frag-reassembly | таймаут сборки фрагментов |
ping = ICMP echo
Команда ping шлёт type=8 (echo-request), приходит type=0 (echo-reply).
В payload - увеличивающийся seq и timestamp; сравнение позволяет считать
RTT и потери.
Поля которые помогают диагностике:
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=8.45 ms
icmp_seq- номер пакета (отсутствие = loss)ttl- сколько hop'ов осталось у ответа; разные ttl = ECMP-балансировкаtime- RTT (полный round trip)
traceroute через time-exceeded
Классический traceroute:
- Шлёт UDP-пакет (или ICMP echo, или TCP SYN) с TTL=1
- Первый роутер уменьшает TTL до 0, дропает пакет, отправляет ICMP type=11 (time-exceeded). Источник видит IP первого hop'а
- Шлёт повторно с TTL=2 → видим второй hop, и так далее
Когда ICMP блокирован
Параноидальные файрволы любят дропать ICMP - это антипаттерн:
- Без ICMP не работает PMTU discovery → пакеты больше MTU молча дропаются → приложение «зависает» на больших ответах
- Без traceroute сложнее диагностировать сетевые проблемы
- Без ping сложнее проверить «жив ли хост»
В крайнем случае дропают только echo, сохраняя type=3 и type=11.