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

  
 
  

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  or IP_BOUND_IF, and may require root permissions.  (Avail-
	    able 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 n
	    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.

     --gsro
	    Enable UDP Generic Segmentation Offload  (GSO)  on	the  sender  and
	    Generic  Receive  Offload  (GRO) on the receiver, where supported by
	    the operating system and network hardware  (currently  Linux  only).
	    GSO  allows  the  network  stack to aggregate multiple UDP datagrams
	    into larger packets, improving throughput and reducing CPU overhead.
	    This is a client-only option; the client  communicates  the  GSO/GRO
	    settings  to  the server automatically.  This feature is disabled by
	    default and must be explicitly enabled with this flag.

     --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				   April 2026			       IPERF3(1)

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

home | help