Когда я запускаю это в поле Ubuntu:
sudo ping google.com -c 25 -l 25
Я получаю примерно 1 строку каждые 2 секунды, несмотря на то, что он должен (если я правильно читаю) сразу же отправить все 25 пакетов. Как ни странно, он утверждает, что я получаю время отклика:
--- google.com ping statistics ---
25 packets transmitted, 24 received, 4% packet loss, time 0ms
rtt min/avg/max/mdev = 23.370/28.067/32.902/2.895 ms, pipe 24
Кроме того, если я хочу выйти под залог раньше, мне нужно нажать Ctrl-C один раз для каждого пакета. Кто-нибудь знает, что может быть причиной этого?
Если вы пингуетесь через IP, а не через имя хоста, вы получите ожидаемое поведение.
Я все еще пытаюсь понять, почему это так.
# find IP address of host
$ host -t a google.com
google.com has address 74.125.225.17
google.com has address 74.125.225.19
google.com has address 74.125.225.20
google.com has address 74.125.225.18
google.com has address 74.125.225.16
# pick an IP and ping it, all output is displayed at once
$ sudo ping 74.125.225.17 -c 25 -l 25
PING 74.125.225.17 (74.125.225.17) 56(84) bytes of data.
64 bytes from 74.125.225.17: icmp_seq=1 ttl=55 time=29.7 ms
64 bytes from 74.125.225.17: icmp_seq=2 ttl=55 time=30.4 ms
64 bytes from 74.125.225.17: icmp_seq=3 ttl=55 time=40.0 ms
64 bytes from 74.125.225.17: icmp_seq=4 ttl=55 time=40.4 ms
64 bytes from 74.125.225.17: icmp_seq=7 ttl=55 time=50.1 ms
64 bytes from 74.125.225.17: icmp_seq=5 ttl=55 time=50.4 ms
64 bytes from 74.125.225.17: icmp_seq=6 ttl=55 time=51.4 ms
64 bytes from 74.125.225.17: icmp_seq=8 ttl=55 time=52.4 ms
64 bytes from 74.125.225.17: icmp_seq=9 ttl=55 time=55.4 ms
64 bytes from 74.125.225.17: icmp_seq=10 ttl=55 time=56.4 ms
64 bytes from 74.125.225.17: icmp_seq=11 ttl=55 time=57.3 ms
64 bytes from 74.125.225.17: icmp_seq=13 ttl=55 time=58.3 ms
64 bytes from 74.125.225.17: icmp_seq=12 ttl=55 time=59.3 ms
64 bytes from 74.125.225.17: icmp_seq=14 ttl=55 time=60.3 ms
64 bytes from 74.125.225.17: icmp_seq=15 ttl=55 time=61.9 ms
64 bytes from 74.125.225.17: icmp_seq=16 ttl=55 time=62.3 ms
64 bytes from 74.125.225.17: icmp_seq=17 ttl=55 time=63.2 ms
64 bytes from 74.125.225.17: icmp_seq=18 ttl=55 time=64.2 ms
64 bytes from 74.125.225.17: icmp_seq=19 ttl=55 time=68.9 ms
64 bytes from 74.125.225.17: icmp_seq=20 ttl=55 time=69.2 ms
64 bytes from 74.125.225.17: icmp_seq=21 ttl=55 time=70.2 ms
64 bytes from 74.125.225.17: icmp_seq=22 ttl=55 time=75.9 ms
64 bytes from 74.125.225.17: icmp_seq=23 ttl=55 time=76.2 ms
64 bytes from 74.125.225.17: icmp_seq=24 ttl=55 time=77.2 ms
64 bytes from 74.125.225.17: icmp_seq=25 ttl=55 time=78.1 ms
ОБНОВИТЬ
После запуска ping через strace я обнаружил, что он зависает от разрешения имен (неудивительно). Однако мое внимание привлекло avahi-daemon
. Этот сервис реализует архитектуру Apple Zeroconf (также известную как «Rendezvous» или «Bonjour»). Другими словами, функциональность мне не нужна.
После остановки avahi-daemon поведение ping вернулось к нормальному.
# sudo /etc/init.d/avahi-daemon stop
Отключить его во время запуска можно с помощью:
# sudo update-rc.d -f avahi-daemon
Другой способ - просто использовать -n
флаг с пингом. Зависание связано с обратным поиском DNS, выполняемым при обработке ответов.
Если вы выполните tcpdump во время проверки связи, вы, вероятно, увидите, что он приостанавливается при поиске обратного сопоставления ... то есть: когда он ищет сопоставление DNS-IP-адрес.
Я предполагаю, что avahi-daemon запрашивается где-то в цепочке, когда пакеты возвращаются. -L 25 заботится только об исходящих пакетах ... ping по-прежнему будет выполнять свою работу и искать все имена, независимо от того, предварительно загружены ли вы или не. :)