iperf – Grundlagen

network switch with cables

Photo by Thomas Jensen on Unsplash

Dateien von Computer zu Computer kopieren dauert lange, telefonieren über IP hat Aussetzer oder der Video-Stream ruckelt – verschiedene Symptome können ihre Ursache im Netzwerk haben. Um eine verlässliche Aussage über die Qualität des Netzwerkes machen zu können empfiehlt es sich, ein dediziertes Tool einzusetzen. Ein solches Tool ist iperf.

Testaufbau
Für einen Testaufbau benötigt man zwei Computer mit iperf. Ein Rechner wird dabei als Server und einer als Client betrieben. Dabei wird per Default vom Client zum Server gemessen.

Versionen
iperf existiert in drei Versionen, wobei die Version 1 seit 2003 (Release 1.7.0) nicht mehr weiterentwickelt wird. Version 2 (aktueller Release 2.0.10) wird noch mit Fehlerbehebungen und Anpassungen unterstützt aber die Weiterentwicklung erfolgt in der Version 3 (aktueller Release 3.5).
Die Versionen 2 und 3 sind dabei nicht miteinander kompatibel. Hingegen können die Builds für verschiedene Betriebssysteme miteinander verwendet werden (z.B. Client auf Windows und Server auf Linux). Dieses Tutorial fokussiert sich auf die Version 3.
Alle Versionen sind in C geschrieben und unter der BSD-Lizenz veröffentlicht.

Grundlegende Parameter
Alle Parameter existieren in einer langen Variante, welche mit –[parameter] angegeben werden. Von den meisten existiert auch eine Kurzvariante, welche mit nur einem – und darauffolgend einem einzelnen Buchstaben als Bezeichner angegeben wird. Sofern beide Varianten existieren werden auch beide in den nachfolgenden Beschreibungen angegeben. In den Beispielen kommt, sofern vorhanden, die Kurzvariante zum Zug.

Version
--version oder -v
Zeigt die Version inklusive Laufzeitumgebung an. Hilfreich, um die Testumgebung zu dokumentieren.

$ iperf3 -v
iperf 3.0.11
Linux ubuntu 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Hilfe
--help oder -h
Zeigt die Hilfe an. Führt alle Parameter und Optionen auf.

$ iperf3 -h
Usage: iperf [-s|-c host] [options]
       iperf [-h|--help] [-v|--version]

Server or Client:
  -p, --port      #         server port to listen on/connect to
  -f, --format    [kmgKMG]  format to report: Kbits, Mbits, KBytes, MBytes
  -i, --interval  #         seconds between periodic bandwidth reports
  -F, --file name           xmit/recv the specified file
  -A, --affinity n/n,m      set CPU affinity
  -B, --bind      <host>    bind to a specific interface
  -V, --verbose             more detailed output
  -J, --json                output in JSON format
  -d, --debug               emit debugging output
  -v, --version             show version information and quit
  -h, --help                show this message and quit
Server specific:
  -s, --server              run in server mode
  -D, --daemon              run the server as a daemon
  -1, --one-off             handle one client connection then exit
Client specific:
  -c, --client    <host>    run in client mode, connecting to <host>
  -u, --udp                 use UDP rather than TCP
  -b, --bandwidth #[KMG][/#] target bandwidth in bits/sec (0 for unlimited)
                            (default 1 Mbit/sec for UDP, unlimited for TCP)
                            (optional slash and packet count for burst mode)
  -t, --time      #         time in seconds to transmit for (default 10 secs)
  -n, --bytes     #[KMG]    number of bytes to transmit (instead of -t)
  -k, --blockcount #[KMG]   number of blocks (packets) to transmit (instead of -t or -n)
  -l, --len       #[KMG]    length of buffer to read or write
                            (default 128 KB for TCP, 8 KB for UDP)
  -P, --parallel  #         number of parallel client streams to run
  -R, --reverse             run in reverse mode (server sends, client receives)
  -w, --window    #[KMG]    set window size / socket buffer size
  -C, --linux-congestion <algo>  set TCP congestion control algorithm (Linux only)
  -M, --set-mss   #         set TCP maximum segment size (MTU - 40 bytes)
  -N, --nodelay             set TCP no delay, disabling Nagle's Algorithm
  -4, --version4            only use IPv4
  -6, --version6            only use IPv6
  -S, --tos N               set the IP 'type of service'
  -L, --flowlabel N         set the IPv6 flow label (only supported on Linux)
  -Z, --zerocopy            use a 'zero copy' method of sending data
  -O, --omit N              omit the first n seconds
  -T, --title str           prefix every output line with this string
  --get-server-output       get results from server

[KMG] indicates options that support a K/M/G suffix for kilo-, mega-, or giga-

iperf3 homepage at: http://software.es.net/iperf/
Report bugs to:     https://github.com/esnet/iperf

Zusätzliche Ausgaben
Mit den folgenden Parametern kann iperf angewiesen werden, zusätzliche Ausgaben beim Ausführen der Messungen auszugeben. Dies kann besonders im Fehlerfall (keine Verbindung, unerwartete Resultate etc.) hilfreich sein.
--verbose oder -V
Gibt detailiertere Ausgaben aus.
--debug oder -d
Gibt Debugging-Ausgaben aus.

Ausblick
Nachdem wir nun die Grundlagen betrachtet haben wollen wir in den nächsten beiden Teilen die Messungen via UDP und TCP genauer betrachten.