Сетевые программы для мониторинга небольших сетей часто используют метод fast ping. Суть его заключается в том, что генерируется файл со списком проверяемых IP-адресов и доступность этих адресов проверяются по протоколу ICMP. При этом все контролируемые хосты пингуются одновременно.
Соответственно, у такого метода есть некоторые минусы:
  • мгновенный скачкообразный ICMP-флуд в ethernet-сегменте;
  • мгновенная нагрузка на систему;
  • в выводе утилиты fping имеют место быть не только IP-адреса ответивших хостов, т.е. его нужно еще дополнительно фильтровать;
  • неприемлемое для больших сетей (несколько тысяч хостов) быстродействие.
Я поставил задачу реализовать подобную массовую проверку ансамбля хостов по протоколу arp, используя в качестве базиса утилиту arping.
Идея достаточно простая: из скрипта запускаем arping (по 3 запроса с временем ожидания 100 мс) на все необходимые хосты в фоновом режиме, перенаправляя вывод каждой программы по каждому IP-адресу в отдельный текстовый файл, имя которого для простоты включает проверяемый IP-адрес. Обработчику результата можно даже не открывать файлы для анализа содержимого, достаточно проверить размер файла, например, в PHP функцией filesize().
Некоторым осложнением при использовании утилиты arping является необходимость принудительно указывать сетевой интерфейс, если он отличается от первого по порядку в системе. Причем хорошо, если для всех хостов сетевой интерфейс один. Так как на практике в сетях с 1k+ хостов используется несколько сетевых интерфейсов (как правило виртуальные) то необходимо: либо анализировать вывод ifconfig на предмет соответствия определенного IP-адреса сетевому интерфейсу, либо использовать другие программные методы определения соответствия IP-адреса интерфейсу.
Также следует помнить такую особенность FreeBSD 8.2, как несколько «неадекватное» время ответа. Если в FreeBSD 8.0 время ответа в рабочем ethernet-сегменте составляло приблизительно 18 мс, то в 8.2 оно изменяется от десятков микросекунд до сотен миллисекунд.
Тем не менее, используя описанную методику получилось реализовать контроль состояния сети приблизительно на 1000 хостов и генерацию визуального отображения их состояния в виде карты, подобной карте Frendly Pinger. Время работы PHP скрипта составляет несколько секунд, причем сама проверка arping-ом составдяет всего пол секунды.
.