FreeBSD ping rapid как в Cisco или Juniper

Очень нравится, как реализован ping rapid в Cisco или Juniper. Легко и просто быстро качественно проверить канал связи. Суть работы данного режима (rapid) заключается в следующем: утилита посылает пакет удаленному узлу и, как только получает ответ, печатает в консоль символ восклицательного знака и сразу же отправляет следующий пакет без задержки. Если в течение 100 мс ответ не пришел, то это считается потерей. При потере в консоль печатается символ точки. Таким образом наглядно быстро и удобно можно определить качество канала связи. 1000 пакетов, чего вполне достаточно для проверки качества, проходит за приблизительно 10..20 секунд. Данная статья поможет Вам сделать свой FreeBSD PING RAPID.

Параметры запуска адаптированы под непривилегированного пользователя. Если Вы планируете запускать утилиту от имени root, то можете к параметрам команды ping добавить -s 1472 -D, чтобы отправлять удаленному хосту 1500-байтные пакеты — такой способ проверки будет более эффективный, однако он работает только от root (ничего не мешает использовать sudo, чтобы исправить это).

Итак, скрипт на bash:

#!/usr/local/bin/bash

[ $# -lt 1 ] && echo "Использование:$0 <ip-адрес> [к-во пакетов] [размер байт]" >&2 && exit 1

Dest=$1
Cnt=$2
Size=$3
ok=0
notok=0
params=0

echo "--------------------------------------------------------------------------------"

if [[ $Cnt == "" ]]; then
    echo "Количество пакетов не задано. По умолчанию 20 пакетов."
    ((Cnt=20))
    ((params=1))
fi

if [[ $Size == "" ]]; then
    echo "Размер пакетов не задан. По умолчанию 1472 байта (1500 байт MTU)"
    ((Size=1472))
    ((params=1))
fi

if [[ $params != 0 ]]; then
    echo "Чтобы задать количество пакетов и их размер, используйте следующий вызов"
    echo "rapid <ip-адрес> [количество] [размер]"
fi

start=$(date '+%Y.%m.%d %T')
echo "--------------------------------------------------------------------------------"
echo "Пингуем узел:         $Dest"
echo "Количество пакетов:   $Cnt"
echo "Размер пакетов:       $Size байт"
echo "Макс. время ожидания: 200 мс"
echo "Старт проверки:       $start"
echo
i=1
while ((i<=Cnt))
do
        ping -n -W 200 -c 1 -s $Size -q $Dest > /dev/null 2>&1
        RET=$?
        if [ ${RET} -eq 0 ]; then
            ((ok+=1))
            echo -ne '!'
        else
            ((notok+=1))
            echo -ne '.'
        fi
        ((i+=1))
done
echo
echo
end=$(date '+%Y-%m-%d %T')
echo "Окончание проверки:   $end"
success=`echo "$ok * 100 / $Cnt" | bc -l -e 'scale=3'`
loss=`echo "100 - $success" | bc -l -e 'scale=3'`
echo "Отправлено: $Cnt / Вернулось: $ok ($success %) / Потерялось: $notok ($loss %)"
echo "--------------------------------------------------------------------------------"

Выглядит выполнение команды следующим образом:

rapid-ping



Если эта статья помогла Вам, пожалуйста, окажите финансовую поддержку моему блогу.

Добавить комментарий