Что такое ICMP и при чём тут ping? Как ping использует ICMP?
Все говорят «пингани сервер». Я понимаю, что ping проверяет доступность, но как именно он это делает? Читал, что ping работает через ICMP — что конкретно при этом происходит под капотом?
2 ответа
ping — это утилита, которая проверяет доступность хоста, и работает она именно на ICMP. Под капотом всё очень просто:
- Ваш компьютер отправляет хосту ICMP-сообщение типа Echo Request («ты тут?»).
- Если хост жив и не заблокировал ICMP, он отвечает Echo Reply («тут!»).
pingзамеряет время между отправкой и ответом — это и есть тот самый RTT (время в миллисекундах).
Выглядит это так:
ping codechick.io
PING codechick.io (185.12.34.56): 56 data bytes
64 bytes from 185.12.34.56: icmp_seq=0 ttl=55 time=24.3 ms
64 bytes from 185.12.34.56: icmp_seq=1 ttl=55 time=23.8 ms
64 bytes from 185.12.34.56: icmp_seq=2 ttl=55 time=25.1 ms
Что читаем из вывода:
time=24.3 ms— за столько пакет сходил туда-обратно (меньше = лучше);icmp_seq— порядковый номер пакета (помогает увидеть потери);ttl— сколько «прыжков» между роутерами осталось у пакета.
Важный нюанс: если ping не отвечает, это не всегда значит, что хост недоступен. Многие серверы и файрволы специально блокируют ICMP Echo, поэтому хост может прекрасно работать (отдавать сайты по HTTP), но на пинг молчать.
Хочу подчеркнуть последнюю мысль из принятого ответа отдельно, потому что на этом многие спотыкаются: «не пингуется» ≠ «сервер лежит». Я не раз видел, как люди паникуют, что прод упал, хотя сайт открывается нормально — просто ICMP зарезан на файрволе. Если нужно проверить именно доступность сервиса, лучше стучаться в его порт (например, через curl или telnet host 443), а не полагаться только на ping.