0

たとえば を実行すると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 クライアントは、実際には 230k をわずかに超えたのに、250k を超えるデータグラムを送信したと考えました。Token Bucket Filter キューイング規則でトラフィックをポリシングした場合、まったく同じことが当てはまりますtc。つまり、Iperf クライアントによると、実際のトラフィック レートはポリサーによってポリシングされていましたが、100Mbps でトラフィックを送信しました。

Iperf のソース コード ( http://ftp.de.debian.org/debian/pool/main/i/iperf/iperf_2.0.5.orig.tar.gz ) を分析しようとすると、私が理解しているように、クライアント接続は、通常の connect() システム コールを使用して src ディレクトリの Client.cpp ファイルにコーディングされていますか? レポートは Reporter.c ファイルでコーディングされていると思いますが、複雑すぎて理解できません.. Iperf 2.x クライアントが送信したトラフィック量をどのように検出するのか (コード サンプルを使用して) 説明してもらえますか?

4

2 に答える 2

1

書き込まれた合計量の戻り値を追跡できますsend(), write() or *printf()...次に、X時間ごとに印刷し(現在-最後)、最後を現在に設定します。

iperf では、これはint iperf_tcp_send()(udp の同様の関数)への呼び出しで行われます。

関数の戻り値write(), send() and the *printf()は、書き込まれた文字数です。戻り値を使用せずにこれらの関数を使用する場合は、接頭辞 (void) を付けるのが賢明ですが、私が見たコードの多くはそれを無視しており、多くのプログラマーはそれらが void 関数であると推測しています。

さらに、 write の呼び出しはすべてのデータを送信するとは限らないため、戻り値は実際にはバッファー全体が完全に書き込まれることを保証するのに役立ちます。この良い例を見るには、Rob Landley による writeall() の Toybox 実装をチェックしてください。

于 2014-09-05T03:18:38.800 に答える