← Весь справочник

ping

Проверка доступности узла по ICMP — потери, задержка, MTU, коды выхода для скриптов

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 — бесконечно)
-fflood: шлёт пакеты так быстро, как приходят ответы (только 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