# ICMP _Сеть: L2 / L3 · LinuxLab Knowledge Base_ **TL;DR:** ICMP - служебный протокол поверх IP для control-сообщений: echo (ping), destination-unreachable, time-exceeded (используется traceroute), MTU discovery. Не для данных. ## Что такое 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`: 1. Шлёт UDP-пакет (или ICMP echo, или TCP SYN) с **TTL=1** 2. Первый роутер уменьшает TTL до 0, дропает пакет, отправляет ICMP type=11 (time-exceeded). Источник видит **IP первого hop'а** 3. Шлёт повторно с TTL=2 → видим второй hop, и так далее ## Когда ICMP блокирован Параноидальные файрволы любят дропать ICMP - это **антипаттерн**: - Без ICMP не работает PMTU discovery → пакеты больше MTU молча дропаются → приложение «зависает» на больших ответах - Без traceroute сложнее диагностировать сетевые проблемы - Без ping сложнее проверить «жив ли хост» В крайнем случае дропают только echo, сохраняя type=3 и type=11. ## Команды ```bash ping -c 4 8.8.8.8 ``` Послать 4 echo-request и показать статистику ```bash ping -M do -s 1500 1.1.1.1 ``` DF + payload 1500: проверка PMTU; вернётся ICMP frag-needed если MTU меньше ```bash traceroute -I 8.8.8.8 ``` -I: использовать ICMP (а не UDP) для пробинга - лучше когда UDP режут ```bash mtr 8.8.8.8 ``` Live-traceroute с накоплением статистики потерь по hop'ам ```bash tcpdump -i any 'icmp' -c 10 ``` Снять любые ICMP-пакеты (см. [[#cmd-tcpdump|tcpdump]]) ## См. также - [IPv4-адресация и CIDR](/kb/ipv4-addressing.md) - [Traceroute - как увидеть путь пакета через интернет](/kb/traceroute.md) - [MTU и Path MTU Discovery (PMTUD)](/kb/mtu-and-pmtud.md) - [mtr - traceroute + ping в одном](/kb/cmd-mtr.md) - [IPv6 - адресация и базовые концепции](/kb/ipv6-basics.md) - [nmap - сканирование портов и хостов](/kb/cmd-nmap.md)