Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
IPERF3(1)			  User Manuals			       IPERF3(1)

NAME
     iperf3 - perform network throughput tests

SYNOPSIS
     iperf3 -s [ options ]
     iperf3 -c server [ options ]

DESCRIPTION
     iperf3  is  a  tool for performing network throughput measurements.  It can
     test TCP, UDP, or SCTP throughput.  To perform an iperf3 test the user must
     establish both a server and a client.

     The iperf3 executable contains both client and  server  functionality.   An
     iperf3  server  can  be started using either of the -s or --server command-
     line parameters, for example:

	    iperf3 -s

	    iperf3 --server

     Note that many iperf3 parameters have both short (-s) and	long  (--server)
     forms.   In  this	section we will generally use the short form of command-
     line flags, unless only the long form of a flag is available.

     By default, the iperf3 server listens on TCP port 5201 for connections from
     an iperf3 client.	A custom port can be specified by using the -p flag, for
     example:

	    iperf3 -s -p 5002

     After the server is started, it will listen  for  connections  from  iperf3
     clients  (in  other  words,  the  iperf3  program run in client mode).  The
     client mode can be started using the -c command-line option, which also re-
     quires a host to which iperf3 should connect.  The host can be specified by
     hostname, IPv4 literal, or IPv6 literal:

	    iperf3 -c iperf3.example.com

	    iperf3 -c 192.0.2.1

	    iperf3 -c 2001:db8::1

     If the iperf3 server is running on a non-default TCP port, that port number
     needs to be specified on the client as well:

	    iperf3 -c iperf3.example.com -p 5002

     The initial TCP connection is used to exchange test parameters, control the
     start and end of the test, and to exchange test results.  This is sometimes
     referred to as the "control connection".  The actual test data is sent over
     a separate TCP connection, as a separate flow of UDP packets, or as an  in-
     dependent	SCTP connection, depending on what protocol was specified by the
     client.

     Normally, the test data is sent from the client to the server, and measures
     the upload speed of the client.  Measuring  the  download	speed  from  the
     server  can  be  done by specifying the -R flag on the client.  This causes
     data to be sent from the server to the client.

	    iperf3 -c iperf3.example.com -p 5202 -R

     Results are displayed on both the client and  server.   There  will  be  at
     least one line of output per measurement interval (by default a measurement
     interval  lasts  for one second, but this can be changed by the -i option).
     Each line of output includes (at least) the time since  the  start  of  the
     test,  amount  of data transferred during the interval, and the average bi-
     trate over that interval.	Note that the values for each measurement inter-
     val are taken from the point of view of the endpoint process emitting  that
     output  (in other words, the output on the client shows the measurement in-
     terval data for the client.

     At the end of the test is a set of statistics that shows (at least as  much
     as  possible)  a summary of the test as seen by both the sender and the re-
     ceiver, with lines tagged accordingly.  Recall that by default  the  client
     is  the sender and the server is the receiver, although as indicated above,
     use of the -R flag will reverse these roles.

     The client can be made to retrieve the server-side output for a given  test
     by specifying the --get-server-output flag.

     Either the client or the server can produce its output in a JSON structure,
     useful  for  integration  with  other  programs, by passing it the -J flag.
     Normally the contents of the JSON structure are only completely known after
     the test has finished, no JSON output will be emitted until the end of  the
     test.   By enabling line-delimited JSON multiple objects will be emitted to
     provide a real-time parsable JSON output.

     iperf3 has a (overly) large set of command-line options that can be used to
     set the parameters of a test.  They are given in the "GENERAL OPTIONS" sec-
     tion of the manual page below, as well as summarized in iperf3's help  out-
     put, which can be viewed by running iperf3 with the -h flag.

GENERAL OPTIONS
     -p, --port n
	    Set server port to listen on/connect to to n (default 5201)

     -f, --format [kmgtKMGT]
	    Set format to report: Kbits/Mbits/Gbits/Tbits

     -i, --interval n
	    Pause  n  seconds between periodic throughput reports; default is 1,
	    use 0 to disable.

     -I, --pidfile file
	    Write a file with the process ID.  This option is most  useful  when
	    running as a daemon.

     -F, --file name
	    Use  a  file as the source (on the sender) or sink (on the receiver)
	    of data, rather than just generating  random  data	or  throwing  it
	    away.   This  feature is used for finding whether or not the storage
	    subsystem is the bottleneck for file transfers.  It  does  not  turn
	    iperf3  into  a  file transfer tool.  The length, attributes, and in
	    some cases contents of the received file may not match those of  the
	    original file. This option is unavailable when doing --udp tests.

     -A, --affinity n/n,m
	    Set  the  CPU  affinity,  if  possible  (Linux, FreeBSD, and Windows
	    only).  On both the client and server you can set the local affinity
	    by using the n form of this argument (where n is a CPU number).   In
	    addition,  on the client side you can override the server's affinity
	    for just that one test, using the n,m form of argument.   Note  that
	    when  using  this  feature, a process will only be bound to a single
	    CPU (as opposed to a set containing potentially multiple CPUs).

     -B, --bind host[%dev]
	    Bind to the specific interface associated with address host.  If  an
	    optional  interface  is  specified,  it is treated as a shortcut for
	    --bind-dev dev.  Note that a percent sign and interface device  name
	    are  required  for IPv6 link-local address literals, in order to set
	    the link-local scope.

     --bind-dev dev
	    Bind to the specified network interface.  This option uses	SO_BIND-
	    TODEVICE, and may require root permissions.  (Available on Linux and
	    possibly other systems.)

     -V, --verbose
	    Produce more detailed output.

     -J, --json
	    Output in JSON format instead of the default human-readable output.

     --json-stream
	    Output  in	line-delimited JSON format instead of the default human-
	    readable output. This option overrides the --json  option,	if  that
	    option was also specified.

     --json-stream-full-output
	    Output  in	JSON  format  with  JSON streams enabled. This flag only
	    takes effect if the --json-stream option was also specified.

     --logfile file
	    Send output to a log file.

     --forceflush
	    Force flushing output at every interval.  Used  to	avoid  buffering
	    when sending output to pipe.

     --timestamps[=format]
	    Prepend  a	timestamp at the start of each output line.  By default,
	    timestamps have the format emitted by ctime(1).  Optionally, =  fol-
	    lowed by a format specification can be passed to customize the time-
	    stamps,  see  strftime(3).	 If this optional format is given, the =
	    must immediately follow the --timestamps option with  no  whitespace
	    intervening.

     --rcv-timeout #
	    Set  idle  timeout	for  receiving data during active tests. The re-
	    ceiver will halt a test if no data is received from the  sender  for
	    this number of ms (default to 120000 ms, or 2 minutes).

     --snd-timeout #
	    Set  timeout  for  unacknowledged TCP data (on both test and control
	    connections) This option can be used to force a faster test  timeout
	    in case of a network partition during a test. The required parameter
	    is specified in ms, and defaults to the system settings.  This func-
	    tionality  depends	on  the TCP_USER_TIMEOUT socket option, and will
	    not work on systems that do not support it.

     --use-pkcs1-padding
	    This option is only meaningful when  using	iperf3's  authentication
	    features. Versions of iperf3 prior to 3.17 used PCKS1 padding in the
	    RSA-encrypted  credentials,  which	was vulnerable to a side-channel
	    attack that could reveal a server's  private  key.	 Beginning  with
	    iperf-3.17,  OAEP padding is used, however this is a breaking change
	    that is not compatible with older iperf3 versions.	Use this  option
	    to preserve the less secure, but more compatible, behavior.

     -m, --mptcp
	    Use the MPTCP variant for the current protocol. This only applies to
	    TCP and enables MPTCP usage.

     -d, --debug
	    Emit  debugging  output.   Primarily (perhaps exclusively) of use to
	    developers.

     -v, --version
	    Show version information and quit.

     -h, --help
	    Show a help synopsis.

SERVER SPECIFIC OPTIONS
     -s, --server
	    Run in server mode.

     -D, --daemon
	    Run the server in background as a daemon.

     -1, --one-off
	    Handle (at most) one client connection, then exit.	If an idle  time
	    is	set, the server will exit after that amount of time with no con-
	    nection.

     --idle-timeout n
	    Restart the server after n seconds in case it gets stuck.	In  one-
	    off  mode, this is the number of seconds the server will wait before
	    exiting.

     --server-max-duration
	    The maximum time, in seconds, that an iperf client can  run  against
	    the  server.   When the sum of the client's time and omit values ex-
	    ceeds the max duration set by the server or the client's time  value
	    is 0, the measurement is rejected.

     --server-bitrate-limit n[KMGT][/n]
	    Set  a limit on the server side, which will cause a test to abort if
	    the client specifies a test of more than n bits per  second,  or  if
	    the  average data sent or received by the client (including all data
	    streams) is greater than n bits per second.  The default limit is 0,
	    which implies no limit.  The interval over which to average the data
	    rate is 5 seconds by default, but can be specified	by  adding  a  /
	    character and a number to the bitrate specifier.

     --rsa-private-key-path file
	    Path to the RSA private key (not password-protected) used to decrypt
	    authentication  credentials  from  the client (if built with OpenSSL
	    support).

     --authorized-users-path file
	    Path to the configuration file containing authorized  users  creden-
	    tials  to run iperf tests (if built with OpenSSL support).	The file
	    is a comma separated list of usernames and password hashes; more in-
	    formation on the structure of the file can be found in the	EXAMPLES
	    section.

     --time-skew-threshold seconds
	    Specify  the  allowable time skew threshold (in seconds) between the
	    server and client during the authentication process.

CLIENT SPECIFIC OPTIONS
     -c, --client host[%dev]
	    Run in client mode, connecting to the specified server.  By default,
	    a test consists of sending data from the client to the  server,  un-
	    less  the  -R flag is specified.  If an optional interface is speci-
	    fied, it is treated as a shortcut for --bind-dev dev.  Note  that  a
	    percent  sign  and interface device name are required for IPv6 link-
	    local address literals.

     --sctp
	    Use SCTP for tests rather than TCP (FreeBSD and Linux).   Note  that
	    TCP  communication	is still used for the control connection between
	    client and server.

     -u, --udp
	    Use UDP for tests rather than TCP.	Note that TCP  communication  is
	    still used for the control connection between client and server.

     --connect-timeout n
	    Set  timeout  for establishing the initial control connection to the
	    server, in milliseconds.  The default behavior is the operating sys-
	    tem's timeout for TCP connection establishment.  Providing a shorter
	    value may speed up detection of a down iperf3 server.

     -b, --bitrate n[KMGT]
	    Set target bitrate to n bits/sec (default 1 Mbit/sec for UDP, unlim-
	    ited for TCP/SCTP).  If there are multiple streams	(-P  flag),  the
	    throughput limit is applied separately to each stream.  You can also
	    add  a  '/'  and  a number to the bitrate specifier.  This is called
	    "burst mode".  It will perform the given  number  of  sends  without
	    pausing,  even  if that temporarily exceeds the specified throughput
	    limit.  Setting the target bitrate to 0 will disable bitrate  limits
	    (particularly  useful  for UDP tests).  This throughput limit is im-
	    plemented internally inside iperf3, and is available  on  all  plat-
	    forms.   Compare  with the --fq-rate flag.	This option replaces the
	    --bandwidth flag, which is now deprecated but  (at	least  for  now)
	    still accepted.

     --pacing-timer n[KMGT]
	    Set  pacing  timer	interval in microseconds (default 1000 microsec-
	    onds, or 1 ms).  This controls iperf3's internal  pacing  timer  for
	    the  -b/--bitrate  option.	 The  timer fires at the interval set by
	    this parameter.  Smaller values of the pacing timer parameter smooth
	    out the traffic emitted by iperf3, but potentially at  the	cost  of
	    performance due to more frequent timer processing.

     --fq-rate n[KMGT]
	    Set  a rate to be used with fair-queueing based socket-level pacing,
	    in bits per second.  This pacing (if specified) will be in	addition
	    to	any  pacing due to iperf3's internal throughput pacing (-b/--bi-
	    trate flag), and both can be specified  for  the  same  test.   Only
	    available  on platforms supporting the SO_MAX_PACING_RATE socket op-
	    tion (currently only Linux).  The default is no fair-queueing  based
	    pacing.

     --no-fq-socket-pacing
	    This  option is deprecated and will be removed.  It is equivalent to
	    specifying --fq-rate=0 .

     -t, --time n
	    Set the test duration in seconds (default 10 secs).  The -t , -n  ",
	    and" -k options are mutually exclusive.

     -n, --bytes n[KMGT]
	    Set the number of bytes to transmit.  The -t , -n ", and" -k options
	    are mutually exclusive.

     -k, --blockcount n[KMGT]
	    Set the number of blocks (packets) to transmit.  The -t , -n ", and"
	    -k options are mutually exclusive.

     -l, --length n[KMGT]
	    Set  the  length of the buffer to read or write.  For TCP tests, the
	    default value is 128KB.  In the case of UDP, iperf3 tries to dynami-
	    cally determine a reasonable sending size based on the path MTU;  if
	    that cannot be determined it uses 1460 bytes as a sending size.  For
	    SCTP tests, the default size is 64KB.

     --cport port
	    Bind  data streams to a specific TCP or UDP client port (for TCP and
	    UDP only, default is to use an ephemeral port).

     -P, --parallel n
	    Set the number of parallel client streams  to  run.  Beginning  with
	    iperf-3.16,  iperf3  will  spawn off a separate thread for each test
	    stream.  Using multiple streams may result in higher throughput than
	    a single stream, in cases where network throughput is CPU-limited.

     -R, --reverse
	    Reverse the direction of a test, so that the server  sends	data  to
	    the client.

     --bidir
	    Test  in  both directions (normal and reverse), with both the client
	    and server sending and receiving data simultaneously

     -w, --window n[KMGT]
	    Set t he socket buffer size / window size.	This value gets sent  to
	    the server and used on that side too; on both sides this option sets
	    both the sending and receiving socket buffer sizes.  This option can
	    be	used to set (indirectly) the maximum TCP window size.  Note that
	    on Linux systems, the effective maximum window size is approximately
	    double what is specified by this option.  This behavior is not a bug
	    in iperf3 but a feature of the Linux kernel, as documented by tcp(7)
	    and socket(7)).

     -M, --set-mss n
	    Set the TCP/SCTP maximum segment size (MTU - 40 bytes).

     -N, --no-delay
	    Set the TCP/SCTP no delay option, disabling Nagle's Algorithm.

     -4, --version4
	    Force the use of IPv4.

     -6, --version6
	    Force the use of IPv6.

     -S, --tos n
	    Set the IP type of service bits.  The usual prefixes for  octal  and
	    hex can be used, i.e. 52, 064 and 0x34 all specify the same value.

     --dscp dscp
	    Set  the  IP  DSCP	bits.	Both numeric and symbolic values are ac-
	    cepted. Numeric values can be specified in decimal,  octal	and  hex
	    (see --tos above).

     -L, --flowlabel n
	    Set the IPv6 flow label (currently only supported on Linux).

     -X, --xbind name
	    Bind   SCTP  associations  to  a  specific	subset	of  links  using
	    sctp_bindx(3).  The --B flag will be ignored if this flag is  speci-
	    fied.   Normally SCTP will include the protocol addresses of all ac-
	    tive links on the local host when setting up an association.  Speci-
	    fying  at least one --X name will disable this behaviour.  This flag
	    must be specified for each link to be included in  the  association,
	    and  is supported for both iperf servers and clients (the latter are
	    supported by passing the first --X argument to bind(2)).   Hostnames
	    are accepted as arguments and are resolved using getaddrinfo(3).  If
	    the  --4 or --6 flags are also specified, names which do not resolve
	    to addresses within the specified protocol family will be ignored.

     --nstreams n
	    Set number of SCTP streams.

     -Z, --zerocopy
	    Use a "zero copy" method of sending data, such as  sendfile(2),  in-
	    stead of the usual write(2).

     --skip-rx-copy
	    Ignored  received  packet  data,  using  the  MSG_TRUNC  flag to the
	    recv(2) system call.

     -O, --omit n
	    Perform pre-test for n seconds and omit the pre-test statistics,  to
	    skip past the TCP slow-start period.

     -T, --title str
	    Prefix every output line with the string str.

     --extra-data str
	    Specify an extra data string field to be included in JSON output.

     -C, --congestion algo
	    Set  the  congestion control algorithm (Linux and FreeBSD only).  An
	    older --linux-congestion synonym for this flag is  accepted  but  is
	    deprecated.

     --get-server-output
	    Get  the output from the server.  The output format is determined by
	    the server (in particular, if the server was invoked with the --json
	    flag, the output will be in JSON format, otherwise it will be in hu-
	    man-readable format).  If the client is run with --json, the  server
	    output is included in a JSON object; otherwise it is appended at the
	    bottom  of the human-readable output. Note that the server output is
	    available only if the test completes, not if it is interrupted.

     --udp-counters-64bit
	    Use 64-bit counters in UDP test packets.  The use of this option can
	    help prevent counter  overflows  during  long  or  high-bitrate  UDP
	    tests.   Both  client and server need to be running at least version
	    3.1 for this option to work.  It may become the default behavior  at
	    some point in the future.

     --repeating-payload
	    Use repeating pattern in payload, instead of random bytes.	The same
	    payload  is  used in iperf2 (ASCII '0..9' repeating).  It might help
	    to test and reveal problems in networking gear  with  hardware  com-
	    pression  (including  some	WiFi  access  points),	where iperf2 and
	    iperf3 perform differently, just based on payload entropy.

     --dont-fragment
	    Set the IPv4 Don't Fragment (DF) bit on outgoing packets.  Only  ap-
	    plicable to tests doing UDP over IPv4.

     --username username
	    Specify  username  to use for authentication to the iperf server (if
	    built with OpenSSL support).  The password will be prompted for  in-
	    teractively  when  the  test  is run.  Note the password can also be
	    specified via the  IPERF3_PASSWORD	environment  variable.	If  this
	    variable is present, the password prompt will be skipped.

     --rsa-public-key-path file
	    Set  path  to the RSA public key used to encrypt authentication cre-
	    dentials (if built with OpenSSL support).

EXAMPLES
   Authentication - RSA Keypair
     The authentication feature of iperf3 requires an RSA public  keypair.   The
     public  key is used to encrypt the authentication token containing the user
     credentials, while the private key is used to  decrypt  the  authentication
     token.   The  private  key  must be in PEM format and additionally must not
     have a password set.  The public key must be in PEM format and use Subject-
     PrefixKeyInfo encoding.  An example of a set of UNIX/Linux  commands  using
     OpenSSL to generate a correctly-formed keypair follows:

	    > openssl genrsa -des3 -out private.pem 2048
	    > openssl rsa -in private.pem -outform PEM -pubout -out public.pem
	    > openssl rsa -in private.pem -out private_not_protected.pem \
	      -outform PEM

     After  these  commands,  the  public key will be contained in the file pub-
     lic.pem and the private key will be contained in the file	private_not_pro-
     tected.pem.

   Authentication - Authorized users configuration file
     A	simple	plaintext file must be provided to the iperf3 server in order to
     specify the authorized user credentials.  The file  is  a	simple	list  of
     comma-separated pairs of a username and a corresponding password hash.  The
     password  hash is a SHA256 hash of the string "{$user}$password".	The file
     can also contain commented lines (starting with the # character).	An exam-
     ple of commands to generate the password hash on  a  UNIX/Linux  system  is
     given below:

	    > S_USER=mario S_PASSWD=rossi
	    > echo -n "{$S_USER}$S_PASSWD" | sha256sum | awk '{ print $1 }'

     An  example  of  a  password file (with an entry corresponding to the above
     username and password) is given below:

	    > cat credentials.csv
       # file format: username,sha256
       mario,bf7a49a846d44b454a5d11e7acfaf13d138bbe0b7483aa3e050879700572709b

AUTHORS
     A list of the contributors to iperf3 can be found within the  documentation
     located at https://software.es.net/iperf/dev.html#authors.

SEE ALSO
     libiperf(3), https://software.es.net/iperf

ESnet				  November 2025 		       IPERF3(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=iperf3&manpath=FreeBSD+15.1-RELEASE+and+Ports>

home | help