iPerf

iPerf2 vs iPerf3: Differences That Actually Matter

Two tools, not two versions: they do not interoperate, flags collide, and each wins different jobs. Real output from iperf 2.2.1 and 3.18 shows exactly where they differ.
iPerf2 vs iPerf3 comparison feature image with real output from both tools
In: iPerf, Networking

iPerf2 and iPerf3 share a name, a purpose, and almost nothing else. iPerf3 was a ground-up rewrite by ESnet, not an upgrade, and the two do not interoperate - an iPerf2 client cannot test against an iPerf3 server, and they do not even default to the same port (5001 vs 5201). Both are actively maintained today by different teams, which surprises people who assume "3 replaced 2." This article breaks down the real differences, with live output from iperf 2.2.1 and iperf 3.18, as part of our complete iPerf guide.

Two Tools, Not Two Versions

iPerf2 (currently maintained on SourceForge by Bob McMahon) evolved continuously from the original NLANR tool, gaining latency measurement, enhanced reporting, and serious multithreading. iPerf3 (maintained by ESnet on GitHub) was rewritten for a cleaner codebase, a scripting-friendly design, and a library API (libiperf). The rewrite deliberately dropped features iPerf2 users relied on, and iPerf2 development never stopped. Hence: two parallel tools.

The Differences That Change Your Results

Threading

iPerf2 is multithreaded: -P 8 uses multiple cores. Classic iPerf3 runs all streams in a single thread, so on 10G+ links one CPU core often becomes the bottleneck before the network does. Advantage: iPerf2 on very fast links.

Concurrent clients

An iPerf2 server accepts multiple clients at once. iPerf3 handles exactly one test at a time and tells later clients "the server is busy running a test." Advantage: iPerf2 for shared test servers.

Scripting output

iPerf3's -J emits complete JSON. iPerf2 offers CSV (-y) which is thinner. Advantage: iPerf3 for automation.

Reverse and bidirectional

iPerf3 has clean reverse mode (-R) driven entirely from the client. iPerf2 instead has dual/tradeoff modes (-d / -r) that test both directions in one run, which iPerf3 dropped. Different tools for different workflows.

Multicast

iPerf2 tests multicast (bind the server to a group address, set TTL with -T). iPerf3 cannot. Advantage: iPerf2, and it is the only option.

Latency measurement

iPerf2's enhanced mode reports one-way latency, RTT, and derived metrics inline. iPerf3 reports throughput, retransmits, and cwnd, leaving latency to ping. Advantage: iPerf2 for latency-under-load.

You Can See the Philosophy in the Output

Here is real iperf 2.2.1 enhanced output (-e):

$ iperf -c 127.0.0.1 -t 5 -e
------------------------------------------------------------
Client connecting to 127.0.0.1, TCP port 5001 with pid 12365 (1/0 flows/load)
Write buffer size: 131072 Byte
TCP congestion control using cubic
TOS defaults to 0x0 (dscp=0,ecn=0) (Nagle on)
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ ID] Interval        Transfer    Bandwidth       Write/Err  Rtry     InF(pkts)/Cwnd(pkts)/RTT(var)        NetPwr
[  1] 0.0000-5.0161 sec  7.70 GBytes  13.2 Gbits/sec  63063/0    0     0K(0)/319K(10)/135(67) us  12206015

Congestion control algorithm, writes and errors, retries, in-flight data, cwnd in packets, RTT with variance, and a NetPwr figure - all in one line. iPerf2 packs telemetry into human-readable text. iPerf3's equivalent run prints the familiar clean Interval/Transfer/Bitrate/Retr/Cwnd block (see how to use iPerf3 for annotated output) and saves the deep detail for -J JSON, where scripts can parse it reliably.

Feature Support at a Glance

Default portiPerf2: 5001  |  iPerf3: 5201
Interoperable with each otherNo
JSON outputiPerf3 (-J); iPerf2 has CSV -y
Reverse mode from clientiPerf3 (-R)
Simultaneous bidirectional (-d)iPerf2 only (iPerf3 has --bidir in newer builds)
Multicast testingiPerf2 only
Multithreaded parallel streamsiPerf2 (iPerf3 added multithreading only in recent releases)
Multiple clients per serveriPerf2
Library API (libiperf)iPerf3
One-way latency / RTT reportingiPerf2 (-e enhanced mode)
TCP retransmit + cwnd reportingiPerf3 (Retr/Cwnd columns)

Flag Collisions: The Silent Gotcha

Because the tools evolved separately, several flags mean different things, and muscle memory from one tool produces wrong tests in the other. The dangerous ones:

  • -b: UDP-only bandwidth in iPerf2 (and implies -u in old builds); in iPerf3 it rate-limits TCP as well, and UDP needs an explicit -u. An iPerf3 user typing iperf3 -c host -b 10M gets a rate-limited TCP test, not a UDP test.
  • -C: compatibility mode in iPerf2, congestion control algorithm selection in iPerf3.
  • -T: multicast TTL in iPerf2, output line prefix in iPerf3.
  • -Z: realtime scheduler in some iPerf2 builds, zerocopy send in iPerf3.

When reading someone else's test notes, identify the tool before interpreting the flags.

Interop in Practice

If you manage a fleet of test endpoints, standardize hard. A client that hangs while "Connecting to host..." against a server you know is up is very often an iPerf2 client aimed at an iPerf3 port or vice versa; because the port numbers differ (5001 vs 5201) the connection usually just times out or is refused, and nothing in the error says "wrong tool." Baking the tool name and version into your test scripts' output (both tools support -v) saves that half hour. Where both tools must coexist on one server, run them on their native default ports and document it; nothing conflicts since they never share a socket.

Which Should You Use?

Default to iPerf3. It is what most documentation assumes, its JSON output is far better for automation, its Retr/Cwnd columns make TCP behavior visible (invaluable when troubleshooting slow throughput), and packages are current everywhere.

Reach for iPerf2 in four specific cases: multicast testing (no alternative), a shared always-on test server that must accept concurrent clients, latency-under-load measurement with -e, and multi-10G testing where iPerf3's single thread caps out a core (or use several iPerf3 processes on different ports as a workaround). Nothing stops you installing both; they coexist happily since they use different ports and binary names.

Key Takeaways

iPerf3 is a rewrite, not an upgrade: cleaner, scriptable, single-test-at-a-time, and the right default in 2026. iPerf2 remains actively developed and wins on multithreading, multicast, concurrent clients, and inline latency stats. They cannot talk to each other, so match versions across your endpoints and note which tool produced any number you record. For the full command reference and lab-tested examples of both, start at the iPerf complete guide.

Written by
More from Ping Labz
Great! You’ve successfully signed up.
Welcome back! You've successfully signed in.
You've successfully subscribed to Ping Labz.
Your link has expired.
Success! Check your email for magic link to sign-in.
Success! Your billing info has been updated.
Your billing was not updated.