ping отправляет ICMP-пакеты «echo request» и ждёт «echo reply». По ответам видно, жив ли узел, сколько пакетов теряется и какая задержка (RTT). Это первый шаг диагностики сети: сначала localhost, потом шлюз, потом дальше.
Синтаксис
ping [опции] узел
узел — имя или IP. Без -c и -w ping работает бесконечно, пока не нажмёшь Ctrl+C.
Опции
Сколько и как часто
| Опция | Что делает |
|---|
-c N | отправить N пакетов и выйти |
-i сек | интервал между пакетами (по умолчанию 1 с; дробные можно: -i 0.2). Обычному пользователю — не меньше 0.002 |
-w сек | крайний срок: выйти через столько секунд, сколько бы пакетов ни ушло |
-W сек | сколько ждать ответа, если ответов ещё не было вообще (по умолчанию 10 с; 0 — бесконечно) |
-f | flood: шлёт пакеты так быстро, как приходят ответы (только root) |
Что печатать
| Опция | Что делает |
|---|
-q | тихо: только итоговая статистика |
-n | не превращать адреса обратно в имена |
-D | метка времени Unix перед каждой строкой |
-O | печатать «no answer yet» для пакетов без ответа (видно пропуски) |
-a | звуковой сигнал на каждый ответ |
Пакет и адресация
| Опция | Что делает |
|---|
-s байт | размер данных (по умолчанию 56; плюс 8 байт ICMP-заголовка и 20 байт IP) |
-M do | запретить фрагментацию — так ищут MTU пути |
-t TTL | задать TTL исходящих пакетов |
-I интерфейс|адрес | с какого интерфейса или адреса отправлять |
-4 / -6 | только IPv4 / только IPv6 |
Как читать вывод
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.353 ms
...
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 201ms
rtt min/avg/max/mdev = 0.015/0.184/0.353/0.169 ms
56(84) — 56 байт данных, 84 — весь IP-пакет;
icmp_seq — номер пакета: пропуски в нумерации = потери;
ttl — сколько ещё маршрутизаторов пакет мог пройти;
time — задержка туда-обратно;
- итог: отправлено, получено, процент потерь;
mdev — разброс задержки (джиттер).
Коды выхода
| Код | Значение |
|---|
0 | ответы пришли (а при -c вместе с -w — пришло ровно -c ответов) |
1 | ни одного ответа, или при -c + -w к сроку пришло меньше ответов, чем -c |
2 | другая ошибка: имя не резолвится, нет прав, неверная опция |
Примеры
# три пакета и выход
ping -c 3 127.0.0.1
# быстрая проверка в скрипте: 1 пакет, ждать ответа не больше 2 секунд
if ping -c 1 -W 2 -q 10.0.0.1 >/dev/null; then echo жив; else echo молчит; fi
# только итоговая статистика по 20 пакетам с интервалом 0.2 с
ping -q -c 20 -i 0.2 127.0.0.1
# работать ровно 5 секунд, сколько бы пакетов ни ушло
ping -w 5 127.0.0.1
# пропуски видны сразу, с метками времени — удобно писать в лог
ping -D -O 10.0.0.1
# найти MTU: 1472 байта данных + 28 заголовков = 1500, без фрагментации
ping -c 2 -M do -s 1472 127.0.0.1
# принудительно IPv4 (localhost иначе может уйти на ::1)
ping -4 -c 1 localhost
Подводные камни
- ICMP часто закрыт. Файрволы и облачные сети режут ICMP, а сервис при этом работает. Отсутствие ответа на
ping не значит, что хост выключен: проверяй сам порт (curl, ss). В песочнице IzzyLab выход наружу тоже закрыт — тренируйся на 127.0.0.1.
- Без
-c скрипт зависнет навсегда. В скриптах всегда ставь -c или -w.
- Без
-W «мёртвый» адрес держит 10 секунд. ping -c 1 недоступный_IP ждёт ответа 10 с. Для быстрых проверок добавляй -W 1 или -W 2.
-c вместе с -w строже, чем кажется. ping -c 5 -w 1 … закончится через секунду с кодом 1, даже если все отправленные пакеты получили ответ (0% packet loss): пришло меньше пяти.
localhost может резолвиться в ::1 — ping покажет PING localhost (::1). Нужен IPv4 — пиши 127.0.0.1 или -4.
- Код
1 и код 2 — разные беды. 1 — пакеты ушли, но ответов нет; 2 — ping даже не смог начать (имя не резолвится, опечатка в опции).
- Интервал меньше 2 мс и
-f — только для root. Обычный пользователь получит cannot flood.
См. также
ip · ss · dig · getent · curl