iperf
是一款非常强大的开源网络性能测试工具,用于测量 TCP 和 UDP 带宽、延迟、抖动和丢包率。“打流”通常指的是进行持续、大流量的网络传输测试,以评估网络的吞吐量、稳定性和承载能力。
以下是 iperf
用于打流(主要是测量最大带宽)的常用命令详解,分为服务端和客户端两部分:
一、服务端 (Server) - 接收数据
在需要接收流量的机器上运行。通常只需指定监听端口。
基本命令:
iperf3 -s
-s
: 以服务器模式运行。默认端口: 5201。
指定监听端口:
iperf3 -s -p <端口号>
-p <端口号>
: 指定服务器监听的端口(例如-p 5001
)。如果防火墙开启,需确保该端口开放。
输出更详细的信息:
iperf3 -s -V
-V
: 输出更详细的调试/运行时信息。
以守护进程/后台模式运行 (Linux):
iperf3 -s -D -D: 作为守护进程在后台运行。
二、客户端 (Client) - 发送数据 (打流)
在需要发送流量的机器上运行。指定服务端的 IP 地址和端口。
通用参数
-c <服务器IP地址>
: 指定 iperf 服务器的 IP 地址或主机名 (必需)。例如-c 192.168.1.100
。-p <端口号>
: 指定连接服务器的端口(默认为 5201)。例如-p 5001
。-t <秒数>
: 设置测试的持续时间(单位:秒)。例如-t 60
表示测试 60 秒。这是打流最关键的参数之一,确保测试持续足够长时间以反映稳定性能。-i <秒数>
: 设置定期带宽报告的间隔时间(单位:秒)。例如-i 5
表示每 5 秒输出一次结果。-V
: 输出更详细的调试/运行时信息。--logfile <文件名>
: 将输出重定向到指定的日志文件。例如--logfile iperf.log
。-P <连接数>
: 指定客户端到服务器使用的并行数据流数量。例如-P 4
表示同时建立 4 个连接进行测试。这是突破单 TCP 流限制、测出接近物理链路最大带宽的关键参数! (通常需要结合服务端的-s
使用)-R
/--reverse
: 反向模式。默认是客户端发送数据到服务器。使用-R
后,客户端将接收数据,服务器将发送数据。用于测试上行/下行的方向转换,无需重启服务端。
TCP 测试参数 (默认协议)
-w <大小>[K|M]
: 设置 TCP 窗口大小 (Socket Buffer Size)。例如-w 256K
或-w 2M
。调整窗口大小对长距离、高带宽链路(高 BDP 网络)的性能至关重要。 理想值应 >= 带宽(Bits/s) * 往返延迟(s) / 8。-M <MTU大小>
: 尝试设置 TCP MSS (Maximum Segment Size) 值。通常不需要手动设置,系统会自动协商。-N
: 设置 TCP no delay 选项 (禁用 Nagle 算法)。对于小数据包的低延迟测试可能有用,但对最大带宽测试影响不大。
UDP 测试参数
-u
: 使用 UDP 协议进行测试 (默认是 TCP)。-b <带宽>[K|M|G]
: 设置目标带宽速率。这是 UDP 打流最核心的参数! 例如:-b 100M
: 目标 100 Mbps。-b 1G
: 目标 1 Gbps。-b 0
: (iperf2 常用) 表示“尽可能快”。iperf3 中 UDP 默认行为就是尽可能快。iperf3 更推荐显式指定-b
值。重要: 不指定
-b
时,UDP 默认会尝试以线路速度发送,可能超过网络承载能力导致大量丢包。建议根据网络预期能力设置一个目标值。
-l <长度>[K|M]
: 设置读写缓冲区的长度 (UDP 包的大小)。例如-l 1400
(字节) 或-l 1K
(1024 字节)。调整包大小可以模拟不同应用场景 (如 VoIP 用小包,视频流用大包),并影响 CPU 负载和丢包率。--get-server-output
: 在客户端结束时,从服务器获取并显示额外的结果报告 (包含服务端视角的丢包统计等,对 UDP 尤其重要)。
三、常用打流命令示例
示例 1:基本 TCP 带宽测试 (30秒)
服务端:
iperf3 -s -p 5001
客户端:
iperf3 -c 192.168.1.100 -p 5001 -t 30 -i 5
示例 2:多线程 TCP 测试 (4个并行流,60秒) - 突破单流瓶颈
服务端:
iperf3 -s -p 5001
客户端:
iperf3 -c 192.168.1.100 -p 5001 -t 60 -P 4
示例 3:UDP 测试 (目标 500Mbps, 包长 1400字节,60秒)
服务端:
iperf3 -s -p 5001
客户端:
iperf3 -c 192.168.1.100 -p 5001 -u -b 500M -l 1400 -t 60 -i 5 --get-server-output --get-server-output 对于查看服务端报告的 UDP 丢包率和抖动至关重要。
示例 4:反向测试 (测试服务器到客户端的带宽)
服务端 (启动监听):
iperf3 -s -p 5001
客户端 (告诉服务器向自己发送数据):
iperf3 -c 192.168.1.100 -p 5001 -t 30 -i 5 -R # 测试下行带宽 # 或者测试多线程下行 iperf3 -c 192.168.1.100 -p 5001 -t 30 -P 4 -R
示例 5:设置 TCP 窗口大小 (256KB)
客户端:
iperf3 -c 192.168.1.100 -p 5001 -t 30 -w 256K
四、结果解读关键点
[ ID] Interval: 测试的时间段。
Transfer: 在该时间段内传输的数据总量。
Bitrate: 该时间段内的平均带宽。这是衡量网络吞吐量的核心指标。单位通常是
bits/sec
(如Gbits/sec
,Mbits/sec
)。Retr: (TCP) 重传次数。过多重传可能指示网络拥塞或不稳定。
Cwnd: (TCP) 拥塞窗口大小 (Congestion Window)。动态变化反映 TCP 的拥塞控制行为。
Jitter: (UDP) 抖动的平均值。表示数据包到达时间间隔的变化量。单位是毫秒 (ms)。值越小,网络越稳定(对实时音视频很重要)。
Lost/Total Datagrams: (UDP) 丢失的数据包数量 / 总发送数据包数量。
Lost %: (UDP) 数据包丢失的百分比。是衡量网络可靠性和拥塞的关键指标。理想情况下应为 0% 或非常低。
Sender/Receiver: 在反向模式 (
-R
) 或使用--get-server-output
时,注意区分结果是从发送端还是接收端统计的。接收端报告的带宽更准确(不受发送端本地性能瓶颈影响),发送端报告的丢包率更准确(知道发了多少包)。
五、重要注意事项
防火墙: 确保服务端监听端口在服务端机器的防火墙和沿途网络设备(如果有)上是放行的。
CPU 性能: 在极高带宽(如 10G+)或小包测试时,
iperf
本身可能成为瓶颈。监控客户端和服务端的 CPU 使用率。如果 CPU 接近 100%,测试结果可能不准确。使用多线程 (-P
) 可以分散 CPU 负载。物理链路限制: 测试结果不可能超过物理链路(网线、光纤、交换机端口、Wi-Fi 标准)的理论最大带宽。
网络拥塞: 测试应在相对空闲的网络进行,避免其他流量干扰结果。在共享网络(如公共 Wi-Fi、办公网)测试结果波动可能很大。
TCP vs UDP:
TCP: 测试的是网络的可靠传输能力。结果受 TCP 拥塞控制算法、窗口大小、往返时延 (RTT) 影响显著。追求最大带宽时务必使用多线程 (
-P
)。UDP: 测试的是网络的原始承载能力和服务质量 (QoS)。可以模拟恒定码率应用(如视频流)。通过
-b
控制发送速率,通过结果看实际达到的速率、丢包率和抖动。
测试方向: 网络的上行(客户端->服务器)和下行(服务器->客户端)带宽可能不对称(如 ADSL、Cable Modem)。使用
-R
或单独测试来区分。持续时间:
-t
参数设置足够长的时间(至少 10-60 秒),让 TCP 流达到稳定状态,并平滑短时波动。对于稳定性测试,可能需要持续数小时甚至更久。版本一致性: 尽量保证客户端和服务端使用相同版本的
iperf
(iperf2 或 iperf3),避免兼容性问题。iperf2 和 iperf3 协议不兼容。
通过灵活组合这些参数,你可以使用 iperf
进行各种复杂的网络“打流”测试,精确评估网络的性能极限和稳定性。如果需要针对特定场景的测试命令,可以提供更多细节。