Как клиент Iperf 2.x определяет количество отправленного трафика?

Если выполнить, например, iperf -c 178.62.60.141 -fm -b 100m -u -t 30 -i 10затем через каждые 10 секунд клиент Iperf выводит объем данных, переданных им в мегабайтах:

root@vserver:~# iperf -c 178.62.60.141 -fm -b 100m -u -t 30 -i 10
WARNING: option -b implies udp testing
------------------------------------------------------------
Client connecting to 178.62.60.141, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 0.22 MByte (default)
------------------------------------------------------------
[  3] local 146.185.187.148 port 37660 connected with 178.62.60.141 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   119 MBytes   100 Mbits/sec
[  3] 10.0-20.0 sec   119 MBytes   100 Mbits/sec
[  3] 20.0-30.0 sec   119 MBytes   100 Mbits/sec
[  3]  0.0-30.0 sec   358 MBytes   100 Mbits/sec
[  3] Sent 255661 datagrams

То же самое верно и для TCP. Факт, что переданные данные и пропускная способность распечатаны после конец каждого интервала и передаваемых данных иногда немного больше или меньше полосы пропускания, указанной с помощью флага «-b», это должно означать, что клиент Iperf фактически каким-то образом считает отправленные данные, а не просто выводит аргумент «-b» (полоса пропускания) флаг. Тем не менее, как это
Iperf клиент посчитает количество данных, которые он отправляет? Это точно не делает этого на низком уровне, потому что, если я введу 10% потери пакетов с tcвыполнить iperf -c 178.62.60.141 -fm -b 100m -u -t 30 -i 10 и затем сравните пакеты, которые Iperf-клиент считал отправленными (из выходных данных Iperf-клиента), с количеством фактически отправленных пакетов (из ip -s link show dev eth0 вывод), затем клиент Iperf подумал, что он отправил> 250 тыс. дейтаграмм, тогда как на самом деле это было чуть более 230 тыс. Точно то же самое верно, если я контролирую движение с tc Дисциплина очередности Token Bucket Filter, то есть, согласно клиенту Iperf, он отправлял трафик со скоростью 100 Мбит / с, в то время как фактическая скорость трафика контролировалась ограничителем.

Если я попытаюсь проанализировать исходный код Iperf (http://ftp.de.debian.org/debian/pool/main/i/iperf/iperf_2.0.5.orig.tar.gz), то, как я понимаю, клиентское соединение кодируется в файле Client.cpp в каталоге src с помощью обычного системного вызова connect ()? Я полагаю, что отчеты закодированы в файле Reporter.c, но для меня это слишком сложно понять. Может, кто-нибудь объяснит (с примерами кода), как клиент Iperf 2.x определяет количество отправленного трафика?

0

Решение

Прежде чем смотреть на исходный код, это казалось довольно простым. Клиент должен знать, сколько вещей он отправил. В конце концов, это послало это. Таким образом, он должен посмотреть на системные часы, узнать, сколько времени ушло на отправку заданного количества данных, и определить скорость.

И теперь, посмотрев на Reporter.c — как и ожидалось, в него добавлены различные системные вызовы gettimeofday (), которые захватывают значение системных часов.

Количество трафика, которое отправляет эта утилита, не может быть такой большой загадкой. В конце концов, это послало это, таким образом это должно знать, сколько было.

3

Другие решения

Вы можете отслеживать возвращаемые значения send(), write() or *printf() для общей суммы написано … затем каждый X количество времени печатать (текущий — последний), а затем установить последний на текущий.

В iperf это делается с помощью звонков int iperf_tcp_send() (аналогичная функция для udp)

Возвращаемые значения для write(), send() and the *printf() функции — это количество написанных символов. Если вы используете эти функции без использования возвращаемого значения, целесообразно ставить перед ними префикс (void), но большая часть кода, который я видел, игнорирует его, что заставляет многих программистов предполагать, что они являются функциями void.

Кроме того, вызов write не гарантирует отправку всех данных, поэтому возвращаемое значение действительно полезно для обеспечения полной записи всего буфера. Чтобы увидеть хороший пример этого проверить Реализация робота Лэндли в Toybox функции writeall ()

1

По вопросам рекламы [email protected]