1. 为什么网络性能测试值得你花时间折腾
很多人第一次听到 iperf3 这个名字,第一反应是"我又不是网管,测网速用测速网站不就行了"。这个想法在家庭宽带场景下没毛病,但一旦你开始接触内网传输、NAS 备份、远程桌面卡顿、虚拟机之间通信、跨机房数据同步这些场景,测速网站就完全不够用了。测速网站测的是"你家到公网某个节点"的速度,而 iperf3 测的是"你指定的两台机器之间"的真实吞吐能力,这两件事根本不是一回事。
iperf3 是一个开源的网络带宽测量工具,采用客户端-服务端架构,支持 TCP、UDP、SCTP 三种传输协议,能测吞吐量、抖动、丢包率、重传次数等关键指标。它最核心的价值在于:把网络性能从"感觉卡"变成"数字说话"。你可以精确知道两台机器之间到底能跑多少 Mbps,UDP 打流时丢包率是多少,TCP 窗口调优后重传有没有下降。这些数据是排查网络问题、验证链路质量、做容量规划的基础。
这篇内容适合谁看?如果你是需要排查内网传输瓶颈的运维人员、搭建 NAS 或家庭实验室的折腾党、做分布式系统需要验证节点间通信质量的开发者,或者单纯想搞清楚"我家千兆网到底跑满没有"的技术爱好者,那这篇就是写给你的。我会从 Windows 平台的实际操作出发,把安装、参数、TCP 和 UDP 两种打流方式、结果解读、常见坑全部讲透,所有命令都可以直接复制粘贴使用。
需要提前说明的是,iperf3 的测试结果受 CPU 性能、网卡驱动、防火墙、系统参数等多重因素影响,同一对机器不同时间测出来的数字可能有波动,这很正常。关键是要理解每个参数背后的含义,知道自己在测什么,而不是盲目追求一个好看的峰值数字。
2. iperf3 在 Windows 上的安装方案选型
2.1 三种安装方式对比与选择逻辑
Windows 上装 iperf3 不像 Linux 那样一条apt install就完事,主要有三种路子,各有适用场景。我把它们整理成表格,你可以根据自己的情况对号入座。
| 安装方式 | 获取途径 | 优点 | 缺点 | 适合人群 |
|---|---|---|---|---|
| 官方预编译二进制 | iperf.fr 官网下载 | 免安装、版本新、单文件 | 需手动解压、无自动更新 | 绝大多数人首选 |
| 包管理器安装 | winget / chocolatey / scoop | 命令行一键装、便于批量部署 | 需先装包管理器、版本可能滞后 | 运维、批量环境 |
| 源码编译 | Cygwin / MSYS2 环境 | 可定制、可改源码 | 门槛高、依赖多 | 开发者、特殊需求 |
我个人的建议是:日常使用直接下官方预编译的 zip 包,解压即用,最省心。如果你管理着几十台 Windows 机器需要统一部署,那用 winget 或 chocolatey 更合适。源码编译这条路除非你要改代码或者研究协议实现,否则没必要折腾。
2.2 官方二进制包安装实操
官方发布的 Windows 版本是编译好的可执行文件,下载下来是个 zip 压缩包。解压后你会看到iperf3.exe以及几个依赖的 DLL 文件(比如 cygwin1.dll 之类的运行库)。这里有个关键点:不要只把 iperf3.exe 单独拷出来用,它依赖同目录下的 DLL,单独拿出来会报"找不到 xxx.dll"的错误。
正确的做法是把整个解压出来的文件夹放到一个固定位置,比如C:\Tools\iperf3\,然后把这个路径加到系统环境变量 Path 里。加环境变量的步骤是:右键"此电脑"→属性→高级系统设置→环境变量→在"系统变量"里找到 Path→编辑→新建→填入C:\Tools\iperf3→一路确定。加完之后必须重新打开一个新的命令行窗口,旧窗口不会自动加载新的环境变量,这是新手最常踩的坑。
验证是否装好,打开 PowerShell 或 CMD,输入:
iperf3 --version如果输出了版本号(比如iperf 3.16),说明安装成功。如果提示"不是内部或外部命令",八成是环境变量没生效或者路径写错了,回去检查一下。
2.3 用 winget 一键安装(推荐给批量场景)
Windows 10 1809 之后系统自带 winget,直接一条命令搞定:
winget install iperf3装完之后 winget 会自动处理好路径问题,新开终端就能用。如果你用的是老版本 Windows 没有 winget,可以装 chocolatey,然后:
choco install iperf3 -y包管理器装的好处是升级方便,winget upgrade iperf3就能更新到最新版。不过要注意,包管理器里的版本有时候会比官网滞后一两个小版本,如果你需要某个新特性,还是去官网下最新的。
注意:无论用哪种方式安装,服务端和客户端的 iperf3 版本尽量保持一致。跨大版本(比如 3.1 和 3.16)测试时,某些参数行为可能有差异,导致结果对不上。实测中我遇到过 3.1.3 客户端连 3.16 服务端时 UDP 测试报错的情况,换成同版本就正常了。
3. 核心参数逐个拆解与选择依据
3.1 服务端与客户端的基本角色
iperf3 是典型的 C/S 架构。测试时一台机器跑服务端(-s),另一台跑客户端(-c)主动发起连接。服务端默认监听 5201 端口,这个端口可以在服务端用-p改,客户端连接时也要用同样的-p指定。
服务端启动命令很简单:
iperf3 -s这条命令会让服务端一直运行,等待客户端连接,测完一次后继续等待下一次。如果你想测完一次就退出,加-1参数:
iperf3 -s -1客户端发起测试:
iperf3 -c 192.168.1.100这里的 IP 是服务端的地址。默认情况下客户端跑 TCP 测试,持续 10 秒,单向发送数据。
3.2 测试方向:单向还是双向
默认测试是客户端往服务端发数据(上行)。如果你想测服务端往客户端发(下行),加-R参数:
iperf3 -c 192.168.1.100 -R-R是 reverse 的意思,它会反转数据流向。这个参数在测不对称链路时特别有用,比如你家宽带上传 100M 下载 1000M,测上行和下行结果会差很多。
还有个--bidir参数可以同时双向测试,但这个功能在部分版本上表现不稳定,实测中偶尔会出现结果统计混乱的情况,建议还是分开测两次更可靠。
3.3 协议选择:TCP 和 UDP 的本质区别
这是 iperf3 最核心的一个选择。TCP 和 UDP 测出来的东西完全不一样,很多人搞混。
TCP 测试测的是"在 TCP 协议保证可靠传输的前提下,这条链路能跑多快"。TCP 有拥塞控制、重传机制,会自动适应链路状况。你测出来的数字是"实际有效吞吐",但看不到丢包——因为丢的包 TCP 自己重传了,你只能通过重传次数间接判断链路质量。
UDP 测试测的是"我以固定速率猛发,链路能承受多少,丢了多少"。UDP 不管丢包,发出去就不管了。所以 UDP 测试必须用-b指定发送带宽,否则默认只有 1Mbps,测出来毫无意义。
选择逻辑很简单:想知道链路最大吞吐能力,用 TCP;想测链路质量和丢包,用 UDP。做视频会议、VoIP、游戏这类实时应用的网络评估,UDP 测试更贴近真实场景。
3.4 关键参数速查表
下面这张表是我平时最常用的参数,建议收藏。
| 参数 | 含义 | 典型用法 | 注意事项 |
|---|---|---|---|
-s | 服务端模式 | iperf3 -s | 默认监听 5201 |
-c | 客户端模式 | iperf3 -c IP | 后接服务端地址 |
-p | 指定端口 | -p 8888 | 两端必须一致 |
-t | 测试时长(秒) | -t 30 | 默认 10 秒 |
-i | 报告间隔(秒) | -i 1 | 默认 1 秒,设 0 只出总结 |
-u | 使用 UDP | -u | 必须配-b |
-b | 目标带宽 | -b 1000M | UDP 必填,TCP 可留空 |
-P | 并行连接数 | -P 4 | 测多线程吞吐 |
-R | 反向测试 | -R | 服务端发往客户端 |
-w | TCP 窗口大小 | -w 256K | 影响高延迟链路 |
-l | 缓冲区长度 | -l 128K | 影响包大小 |
-n | 传输字节数 | -n 1G | 替代-t |
-J | JSON 输出 | -J | 便于脚本解析 |
--get-server-output | 获取服务端结果 | 配合-J | 双向数据更全 |
3.5 参数背后的计算逻辑
拿-b举例,为什么 UDP 必须指定?因为 UDP 没有拥塞控制,iperf3 不知道链路能承受多少,只能按你给的速率发。如果你不指定,默认 1Mbps,测出来就是 1Mbps 的丢包情况,完全没参考价值。
那-b该填多少?一般从链路理论带宽的 80% 开始试。比如千兆网,先填-b 800M,看丢包率。如果丢包接近 0,往上加;如果丢包超过 1%,往下减。逐步逼近,找到丢包率在可接受范围内的最大速率,这个值就是这条链路的实际 UDP 承载能力。
再比如-w(TCP 窗口),它的作用和带宽延迟积有关。公式是:窗口大小 = 带宽 × 往返延迟。假设你要在 100ms 延迟的链路上跑满 100Mbps,那窗口至少要 100Mbps × 0.1s = 10Mbit = 1.25MB。如果系统默认窗口只有 64KB,那吞吐就会被限制在 64KB / 0.1s = 5.12Mbps,远达不到链路能力。这就是为什么跨地域测试时经常要手动调大-w。
4. 完整实操流程与现场记录
4.1 环境准备与防火墙放行
假设你有两台 Windows 机器,A 做服务端(IP 192.168.1.100),B 做客户端(IP 192.168.1.101)。第一步不是急着跑命令,而是先确认防火墙放行。
Windows 防火墙默认会拦截入站的 5201 端口。在服务端 A 上,用管理员权限打开 PowerShell,执行:
New-NetFirewallRule -DisplayName "iperf3" -Direction Inbound -Protocol TCP -LocalPort 5201 -Action Allow New-NetFirewallRule -DisplayName "iperf3-udp" -Direction Inbound -Protocol UDP -LocalPort 5201 -Action Allow这两条命令分别放行 TCP 和 UDP 的 5201 端口。如果你改了端口,把 5201 换成你的端口。放行之后可以用Get-NetFirewallRule -DisplayName "iperf3"确认规则存在。
实操心得:测试完记得把这条防火墙规则删掉,命令是
Remove-NetFirewallRule -DisplayName "iperf3"。长期开着 5201 端口虽然风险不大,但没必要留个口子。我一般测完就删,下次测再建,养成习惯。
4.2 TCP 吞吐测试完整过程
服务端 A 启动:
iperf3 -s你会看到类似输出:
----------------------------------------------------------- Server listening on 5201 (test #1) -----------------------------------------------------------客户端 B 发起测试,跑 30 秒,每秒报告一次:
iperf3 -c 192.168.1.100 -t 30 -i 1客户端输出大致是这样:
Connecting to host 192.168.1.100, port 5201 [ 5] local 192.168.1.101 port 51234 connected to 192.168.1.100 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 112 MBytes 940 Mbits/sec 0 512 KBytes [ 5] 1.00-2.00 sec 111 MBytes 931 Mbits/sec 0 512 KBytes ... [ 5] 29.00-30.00 sec 112 MBytes 940 Mbits/sec 0 512 KBytes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-30.00 sec 3.28 GBytes 940 Mbits/sec 0 sender [ 5] 0.00-30.00 sec 3.28 GBytes 940 Mbits/sec receiver这里几个关键字段要会看:Bitrate是实时速率,Retr是重传次数,Cwnd是拥塞窗口大小。千兆网跑出 940Mbps 左右是正常的,因为 TCP/IP 协议头开销大约占 6%,理论峰值就是 940 左右。如果 Retr 一直是 0,说明链路很干净;如果 Retr 持续增长,说明有丢包导致重传。
4.3 UDP 打流测试与丢包分析
UDP 测试是很多人关心的重点,因为"iperf3 使用 UDP 打流"是高频搜索词。服务端还是iperf3 -s,客户端改成:
iperf3 -c 192.168.1.100 -u -b 800M -t 30 -i 1UDP 测试的输出多了抖动和丢包字段:
[ ID] Interval Transfer Bitrate Total Datagrams Lost/Total Lost% [ 5] 0.00-1.00 sec 95.4 MBytes 800 Mbits/sec 69120 0/69120 0% [ 5] 1.00-2.00 sec 95.4 MBytes 800 Mbits/sec 69120 12/69120 0.017% ... [ 5] 0.00-30.00 sec 2.79 GBytes 800 Mbits/sec 2027520 156/2027520 0.0077%Lost%就是丢包率。一般来说,内网有线环境丢包率应该接近 0;如果超过 0.1%,就要查链路了。无线环境丢包率会高一些,1% 以内算正常。抖动(Jitter)字段在部分版本会显示,它反映延迟的稳定性,实时音视频应用对抖动很敏感。
注意:UDP 测试时如果
-b设得过高,比如千兆网直接填-b 1000M,丢包率会飙升,因为协议开销和网卡处理能力限制,实际跑不到理论值。正确做法是从 800M 开始往上试,找到丢包率可接受的临界点。
4.4 多线程并行测试
单线程测试有时候跑不满带宽,因为单个 TCP 连接受窗口和 CPU 单核性能限制。这时候用-P开多个并行连接:
iperf3 -c 192.168.1.100 -P 4 -t 30-P 4表示开 4 个并行流。输出会显示每个流的独立结果和汇总结果。实测中,万兆网单线程可能只能跑到 3-4Gbps,开 4 到 8 个并行流才能跑满。这是因为单个连接的拥塞窗口增长需要时间,多连接能更快占满带宽。
但要注意,并行数不是越多越好。开太多(比如 32 个)反而会因为上下文切换和 CPU 调度开销导致总吞吐下降。一般从 4 开始试,逐步加到吞吐不再增长为止。
4.5 结果导出与自动化
如果你要批量测试或者把结果存档,用-J输出 JSON:
iperf3 -c 192.168.1.100 -t 30 -J > result.jsonJSON 里包含了所有细节,包括每个时间间隔的数据、CPU 占用率、重传统计等。配合--get-server-output还能把服务端的结果也拿过来:
iperf3 -c 192.168.1.100 -t 30 -J --get-server-output > result.json这样一份 JSON 里同时有客户端和服务端的视角,做对比分析很方便。我平时会用 Python 脚本解析这些 JSON,批量跑不同参数组合,自动生成对比表格。
5. 常见问题排查与避坑实录
5.1 连接失败类问题速查
| 现象 | 可能原因 | 排查方法 | 解决方式 |
|---|---|---|---|
| Connection refused | 服务端没启动或端口不对 | 服务端确认iperf3 -s在跑 | 检查端口是否一致 |
| Connection timed out | 防火墙拦截 | telnet IP 5201测试 | 放行防火墙端口 |
| No route to host | 网络不通 | ping服务端 IP | 检查网络配置 |
| 找不到 DLL | 单独拷贝了 exe | 检查同目录 DLL | 整个文件夹一起用 |
| 命令不识别 | 环境变量没生效 | where iperf3 | 重开终端或重设 Path |
5.2 测试结果异常的分析思路
吞吐远低于预期:先确认是不是单线程瓶颈,加-P试试。如果多线程能跑满,说明是单连接窗口限制。如果多线程也上不去,查网卡是不是协商到了低速(比如千兆网卡协商成百兆),用Get-NetAdapter看 LinkSpeed。
重传次数很高:说明链路有丢包。检查网线质量、网卡驱动、交换机端口错误计数。无线环境看信号强度和干扰。
UDP 丢包严重:先降-b值,如果降下来丢包就正常,说明是发送速率超过了链路能力,不是链路故障。如果低速率也丢包,那才是真有问题。
结果波动大:CPU 占用过高会导致测试不准。用-i 1看每秒数据,如果忽高忽低,打开任务管理器看 CPU 是不是跑满了。iperf3 单线程测试时 CPU 单核跑满很常见,这时候测出来的不是网络极限,是 CPU 极限。
5.3 几个容易忽略的细节
测试时长太短没意义。默认 10 秒有时候不够 TCP 窗口爬升到稳定值,建议至少 30 秒。我一般用-t 60,数据更稳。
服务端和客户端时钟不同步不影响结果,因为 iperf3 用的是相对时间。但如果你要对比多台机器的日志,时间戳对不上会很麻烦,建议测试前统一校时。
虚拟机和物理机之间测试要注意虚拟交换机的带宽限制。有些虚拟交换机默认限速,测出来数字偏低是正常的,不是物理网络的问题。
Wi-Fi 测试波动是常态。无线环境受信道干扰、距离、墙体影响极大,同一位置不同时间测出来可能差一倍。测 Wi-Fi 建议多测几次取平均,并且固定位置和方向。
踩坑记录:有一次帮朋友排查 NAS 传输慢的问题,iperf3 测出来只有 300Mbps,但网卡明明是千兆。查了半天发现是网线的问题——那根网线只有 4 芯,虽然能协商到千兆,但实际只能跑百兆多的水平。换了根 8 芯超五类线,直接跑到 940Mbps。所以测出异常先别怀疑软件,物理层的问题占了一大半。
5.4 性能调优的几个方向
如果测试结果不理想,除了查硬件,还可以从系统层面调优。Windows 上可以调整 TCP 参数,比如启用 RSS(接收端缩放)让多核分担网络处理,调整 TCP 窗口自动调优级别。这些操作需要管理员权限,而且不同 Windows 版本命令有差异,建议改之前先记录原始值,方便回滚。
网卡驱动也值得关注。有些老驱动对高吞吐支持不好,更新到厂商最新驱动往往能提升几个百分点。另外网卡的"中断节流"、"大量发送卸载"这些高级属性,不同场景下最优值不一样,可以逐个试。
6. 把 iperf3 用成日常工具的几个思路
iperf3 装好之后,别只当成一次性测试工具。我平时会把它用在几个固定场景里:新机器上架前跑一遍基线测试,记录正常状态下的吞吐数据,以后出问题有对比参照;网络改造前后各测一次,用数据证明改造效果;排查应用卡顿时,先测底层网络,排除网络因素再查应用层。
还有个实用技巧是把常用测试命令写成批处理脚本,双击就能跑。比如建一个test-tcp.bat,内容写上iperf3 -c 192.168.1.100 -t 60 -i 5 -P 4,以后测试不用每次敲命令。服务端也可以做成开机自启的计划任务,需要测的时候直接连,省去每次手动启动的麻烦。
最后分享一个我常用的组合:先用 TCP 多线程测最大吞吐,再用 UDP 从 80% 带宽开始逐步加压找丢包临界点,最后用-R反向测一遍确认双向对称性。这三步走完,一条链路的性能画像基本就清晰了。整个过程熟练之后十分钟以内能搞定,比任何测速网站都靠谱得多。