刚搭好一条链路,或者机房割接完,验收时最怕被问一个问题:“这条线带宽到底能不能跑满?”Ping通只能说明三层通,实际跑业务时卡不卡、丢不丢包,完全是另一回事。这时候就需要一个能“灌流量”的工具,也就是打流测试。而iperf3就是这个场景下绕不开的标准工具,它本身就是一款专门用来测网络带宽、抖动、丢包率的打流软件,支持 TCP 和 UDP,跨平台,安装包又小,Windows、Linux、macOS 都能跑。
这篇文章我直接按实际干活的经验来写:从下载安装开始,到 UDP 打流测试的完整操作,再到常见的报错和误判,哪怕你之前完全没碰过iperf3,照着一步步来也能把链路测明白。
1. 打流测试到底在测什么:iperf3 的核心思路
先搞清楚原理再动手,不然你连输出结果里那几行数字什么意思都看不懂。
1.1 为什么不能用“拷大文件”代替打流
很多人觉得测带宽简单,往服务器传个大文件看速度不就完了?这个思路在日常体验上没问题,但严格来说不严谨。文件拷贝的速度受限于磁盘 IO、SMB 协议栈、系统缓存等因素,你拷得快不快,可能根本不是网络瓶颈,而是硬盘先顶不住了。而且拷贝是单向长连接,测不出链路在双向并发、多流并发下的表现。
打流的思路完全不同:用工具主动制造网络流量,让流量尽量只考验网络链路本身。iperf3把数据包从一端灌到另一端,统计单位时间内传了多少字节,从而直接算出一条链路的实际吞吐能力。同时通过 UDP 模式还能额外测出抖动和丢包率,这些都是文件拷贝给不了的关键指标。
1.2 服务端与客户端:一个做接收,一个做发送
iperf3是典型的 C/S 架构。测试时必须先在一台机器上启动服务端(服务器模式),然后在另一台机器上跑客户端命令去连接它。默认端口是 5201,服务端监听这个端口,客户端发起连接后开始灌流量。
这个设计带来了一个容易被忽略的细节:你启动服务端的机器需要能接受入站连接,防火墙必须放行对应端口。很多人第一次跑iperf3卡在“客户端连不上”,九成都是防火墙拦了服务端,而不是软件本身有问题。
1.3 为什么打流测试要分 TCP 和 UDP
TCP 打流测的是“链路的极限可用带宽”。因为 TCP 有拥塞控制机制,链路一旦出现拥塞或丢包,发送端会自动降速,所以 TCP 测出来的是一个比较“温和”的结果——链路在现有条件下的最大稳定吞吐。
UDP 打流则完全不同。UDP 没有拥塞控制,你让它按 500Mbps 发包,它就真的每秒发 500Mbps 的数据出去,链路如果撑不住就直接丢。所以 UDP 打流更适合模拟视频流、组播、语音通话这类“只管发、不重传”的业务场景,能测出一根链路在有损状态下的真实承载能力。这也是很多人专门搜索“iperf3 使用 UDP 打流”的原因。
2. Windows 环境安装:解压即用,但五个地方必须核对
Windows 上安装iperf3可以说是所有系统里最简单的,因为不需要安装程序,解压就能用。但这不代表没有坑,我一个个说。
2.1 下载与解压:注意选 64 位版本
去官网或者项目的 GitHub Release 页面下载 Windows 编译版压缩包(zip 格式),文件名一般会带win64或win32字样。现在是 2025 年,绝大多数机器都是 64 位系统,直接下载win64的包即可。
解压后你会看到几个文件,核心是iperf3.exe,旁边还会跟着cygwin1.dll、cyggcc_s-seh-1.dll之类的动态库。这几个 dll 不能删,iperf3.exe是依赖它们运行的。有人把 exe 单独拷出来放到别的目录,结果双击报错,就是这个原因。
2.2 命令行进入目录的两种方式
iperf3没有图形界面,必须在命令行里执行。进入解压目录有两种方式:
- 在文件夹地址栏输入
cmd,回车,命令行会直接定位到当前目录。 - 打开 CMD 后执行
cd /d 路径,比如cd /d D:\tools\iperf-3.1.3-win64。
建议把解压目录改名为iperf3,路径短、好记,后边写命令也省事。我自己习惯放在D:\tools\iperf3\下。
2.3 把 iperf3 加入系统 PATH
如果你不想每次测试都先cd到目录里,可以把它加进系统环境变量。操作路径:此电脑 → 属性 → 高级系统设置 → 环境变量 → 找到 Path → 编辑 → 新建 → 填入解压目录路径。完成后重开一个 CMD,直接输入iperf3 -v就能看到版本信息,说明配置成功。
这一步不是必须的,但如果你经常要做网络测试,加上会省很多事。
2.4 第一个大坑:运行时错误 216
很多人在老机器或某些精简版系统上运行 iperf 时,会弹出一个对话框提示类似“Runtime Error 216”。我遇到过,这个报错通常和两点有关:一是你下载的是旧版 iperf(比如 2.x 时代的二进制),二是因为老版本二进制与新系统之间的兼容性问题。解决办法很简单:不要用 iperf 2.x,换成 iperf3 的 64 位版本。如果换了还是报错,用管理员身份重新打开 CMD 再执行。实测下来,iperf3.exe新版在 Windows 10、Windows 11 上都很稳。
2.5 第二个大坑:防火墙必须放行 5201
这是 Windows 上安装iperf3后最容易翻车的地方。你启动了服务端,客户端发起连接却一直卡在Connecting to host,说明网络层面根本没通。检查顺序是这样的:
- 服务端是否真的启动了(窗口里能看到
Server listening on 5201类似字样)。 - 两端 IP 能否互相 ping 通。
- 服务端 Windows 防火墙是否放行了 5201 端口。
放行操作:控制面板 → Windows Defender 防火墙 → 高级设置 → 入站规则 → 新建规则 → 端口 → TCP/UDP 填 5201 → 允许连接。注意,如果要测 UDP 打流,入站规则里要同时给 TCP 和 UDP 都放行,如果只放行了 TCP,就会出现很诡异的现象——TCP 测速正常,UDP 测试丢包率极高甚至全丢。
3. Linux 与国产系统安装:包管理器、EPEL、源码编译三条路
Linux 下装iperf3比 Windows 还快,正常发行版基本都有现成包。但国内环境比较特殊,很多跑业务用的是国产 Linux 系统,比如银河麒麟这类,安装命令和通用的 Ubuntu、CentOS 不完全一样。我把几条典型路径都列出来。
3.1 Ubuntu / Debian 系列:apt 一行搞定
sudo apt update sudo apt install iperf3装完执行iperf3 -v验证版本。如果系统里的版本太老,后面测出一些奇怪的结果(比如单线程跑不满),可以考虑卸载后用源码装新版。
3.2 CentOS / RHEL 及基于它的发行版:注意 EPEL 仓库
CentOS 这类系统直接用yum搜iperf3经常搜不到,因为默认软件源里没有。常规做法是先装 EPEL 扩展仓库:
sudo yum install epel-release sudo yum install iperf3系统如果自带dnf,把yum换成dnf即可。这里有个细节:EPEL 仓库里的iperf3版本通常不会太新,但对绝大多数测试场景来说完全够用,没必要追求最新版。
3.3 银河麒麟等国产系统:先判断底子再选命令
国产系统这块我多说两句,因为问的人真的很多。银河麒麟实际上分桌面版和服务器版,底层来自不同的开源体系,安装命令也跟着变:
- 如果底层基于 Debian 体系(比如银河麒麟桌面版 V10 SP1 这类),直接用前面的
apt命令。 - 如果底层基于 CentOS 体系(比如银河麒麟高级服务器版 V10),用
yum或dnf装。 - 如果自带的源里面没有 iperf3,或者安装报找不到包,那就老老实实走源码编译。
判断到底属于哪种体系,执行cat /etc/os-release,看里面的ID和ID_LIKE字段,一目了然。
3.4 源码编译:手动装新版 iperf3 的通用路子
不管什么系统,源码编译都是兜底方案,我实际使用中觉得也没多复杂。先从官网或镜像站下载源码包,比如iperf-3.12.tar.gz,然后按顺序执行:
tar -zxvf iperf-3.12.tar.gz cd iperf-3.12 ./configure make sudo make install sudo ldconfig编译前确保系统里有gcc和make,没有就先装。装完执行which iperf3确认路径,通常会被安装到/usr/local/bin/iperf3。如果执行iperf3提示找不到命令,多半是 PATH 里没有/usr/local/bin,或者ldconfig没刷新动态库缓存,两个都排查一下就行。
3.5 Linux 下用服务模式跑
生产环境测试时,你不可能一直开着终端窗口挂着服务端。可以用-D参数让iperf3以守护进程方式后台运行:
iperf3 -s -D或者干脆写一个 systemd service 文件托管,方便开机自启。这个看个人习惯,我用-D比较多,简单直接。
4. UDP 打流的完整操作流程与结果判读
UDP 打流是iperf3的高阶玩法,也是很多人最想搞明白的部分。下面这组命令是我日常测试用的标准组合,直接抄就可以。
4.1 服务端启动命令
iperf3 -s -p 5201这里的-p 5201可以省略,因为默认就是 5201。如果链路上有多个测试同时进行,建议加-p指定不同端口避免冲突,比如iperf3 -s -p 5210。
4.2 客户端 UDP 打流命令
iperf3 -c 192.168.1.100 -u -b 500M -t 30 -i 1参数拆解:
-c 192.168.1.100:指定服务端 IP。-u:启用 UDP 模式。-b 500M:目标带宽,也就是你希望以多大的码率灌包,单位是 bit 每秒,500M 就是 500Mbps。-t 30:测试持续 30 秒。-i 1:每秒打印一次实时结果。
4.3 服务端输出怎么看:核心三行
UDP 打流时,服务端的输出才是有效结果,因为接收端才能统计真实的丢包率。典型的服务端输出长这样:
[ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams [ 5] 0.00-30.00 sec 1.79 GBytes 513 Mbits/sec 0.021 ms 0/1464245 (0%)逐项解释:
- Bitrate:实际接收速率。这里 513 Mbits/sec,说明实际跑到了 500Mbps 左右,符合预期。
- Jitter:抖动,单位通常是微秒或毫秒。0.021 ms 属于很优秀的水平,如果超过 1ms,说明链路延迟不太稳定。
- Lost/Total Datagrams:丢包数 / 总包数,后面括号里是丢包率。0/1464245 (0%) 代表零丢包,链路质量极好。
4.4 阶梯加压法:找出链路的真实承载能力
UDP 打流最有价值的操作不是一次测完,而是阶梯式加压。思路很简单:
- 先用低码率测,比如
-b 100M。 - 确认零丢包后,涨到
-b 300M、-b 500M、-b 800M、-b 1G。 - 记录第一个出现明显丢包的码率。
假设你在-b 800M时丢包率为 0%,涨到-b 1G时变成 12%,那这条链路的实际有损吞吐能力就在 800Mbps 到 1Gbps 之间。这个临界值对后续业务规划非常重要,比如你要在这条链路上跑视频会议,就该留 30% 左右的冗余,不要贴着临界值用。
4.5 客户端输出怎么看
客户端简单很多,主要看Total Datagrams和Bitrate,它是发送方统计的,不参与丢包判定。测试完成后客户端也会打印一份汇总,但真正写入报告的数据要以服务端为准。
5. 从单线到多流:TCP 测速、双向测速与并发压测的工程玩法
UDP 打流测的是链路极限,TCP 打流测的是可用带宽。日常网络验收里二者都要做,下面把 TCP 场景的完整玩法也过一遍。
5.1 基础 TCP 测速:别画蛇添足加 -b
最基本的 TCP 测试命令:
iperf3 -c 192.168.1.100 -t 10输出重点看两行:
[ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.00 sec 1.09 GBytes 935 Mbits/sec 834 sender [ 5] 0.00-10.00 sec 1.09 GBytes 935 Mbits/sec receiver- Retr:TCP 重传次数。如果数值非常大,说明链路存在丢包或拥塞,TCP 在不停重传,这会直接拉低吞吐。
- sender 和 receiver:发送端和接收端的速率对比。两者差距过大时(比如 sender 显示了很高的速率,receiver 却低很多),链路损耗就很明显。
注意一个常见的错误认知:有人会在 TCP 测试里加-b参数,试图“限制带宽测更稳”。其实 TCP 模式自带拥塞控制,会自适应链路状况,而-b在 TCP 模式下起的是限速作用,测出来的结果反而不是链路的真实能力。TCP 测试就让它放开跑,不要手动限速。
5.2 反向测试与双向测试:别只看单向
很多业务场景是上下行不对称的,比如视频监控回传、P2P 下载,这时只测单向不够。
-R参数:反向测试,流量从服务端反向灌回客户端,也就是测试下行链路。-d参数:双向同时测试,客户端和服务端同时向对方发包。
命令示例:
iperf3 -c 192.168.1.100 -R -t 30 iperf3 -c 192.168.1.100 -d -t 30注意-d和-R在 iperf3 里都有效,但含义不同,一个是“同时双向”,一个是“单方向反过来”。做验收报告时,最好把正向、反向、双向三组数据都测全,避免漏掉链路中的不对称问题。
5.3 多流并发:模拟真实业务的关键参数
单流测试跑不满带宽是很常见的事,因为单线程受限于 CPU 频率和协议栈效率。这时要用-P参数开多流:
iperf3 -c 192.168.1.100 -P 4 -t 30-P 4表示同时开 4 个流。多流测试更接近真实业务场景,因为服务器上的实际业务基本都是多并发。开 4 条流之后吞吐通常会有明显提升,如果加了并发还是上不去,那瓶颈基本就在硬件或者链路本身了。
这里有个人经验要分享:多流测试时得盯着服务端的 CPU。如果服务端 CPU 被打满,吞吐上不去是正常的,不代表链路有问题。反之,如果 CPU 没满但吞吐还上不去,那链路多半真的有瓶颈。
5.4 调优参数:TCP 窗口和测试时长
对于高带宽长距离链路,默认的 TCP 窗口可能不够大,导致吞吐受限。可以用-w调整窗口大小:
iperf3 -c 192.168.1.100 -w 1M -t 30-w 1M把 TCP 窗口调到 1MB。这个参数不是越大越好,得看链路带宽和延迟的乘积(BDP),但实测中如果你发现速率远低于链路标称值,且 CPU 不忙、无重传,试着加大窗口往往能有惊喜。
测试时长建议至少 30 秒,如果链路质量不稳定,甚至测 60 秒以上。短时间测试容易受到突发流量的干扰,数据不够平滑。
5.5 输出 JSON:写脚本和报告时省力
iperf3支持直接输出 JSON 格式结果:
iperf3 -c 192.168.1.100 -J > result.json这条命令会把完整结果保存到文件里,方便你用脚本批量解析和统计。做网络巡检或者多节点批量测试时,这个功能非常实用,不用一条一条复制终端输出。
我列个常用参数速查表,方便现场翻:
| 参数 | 作用 | 示例 |
|---|---|---|
-s | 启动服务端 | iperf3 -s |
-c | 指定客户端连接的服务端 IP | iperf3 -c 192.168.1.100 |
-u | UDP 模式 | iperf3 -c 192.168.1.100 -u |
-b | 目标带宽(UDP 必用) | iperf3 -c 192.168.1.100 -u -b 500M |
-t | 测试时长 | -t 30 |
-i | 打印间隔 | -i 1 |
-P | 并发流数 | -P 4 |
-R | 反向测试 | iperf3 -c 192.168.1.100 -R |
-d | 双向同时测试 | iperf3 -c 192.168.1.100 -d |
-w | TCP 窗口大小 | -w 1M |
-J | JSON 格式输出 | iperf3 -c 192.168.1.100 -J |
-p | 指定端口 | -p 5202 |
6. 实测中容易翻车的细节与排错链路
最后这部分是我最想写的,因为iperf3安装本身没有门槛,真正让人头疼的全是测试过程中的隐藏问题。我踩过的坑基本都在下面。
6.1 客户端卡在 Connecting 不动:先查防火墙和端口监听
现象:客户端执行命令后一直停在Connecting to host ...,最后超时报错。
排查链路按顺序来:
- 先在服务端执行
ss -lntp | grep 5201或netstat -an | grep 5201,确认 5201 端口确实在监听。 - 看服务端是否绑定了错误的网卡。
iperf3 -s默认监听所有接口,但如果服务端有多张网卡,保险起见用iperf3 -s -B 服务器IP指定绑定地址。 - 检查两端是否在同一网段,跨网段的话先确认路由和中间设备的访问控制策略。
- 最后检查防火墙。Windows 看 Defender 入站规则,Linux 看
firewalld或ufw状态。
我遇到最多的情况是第 4 步,服务端防火墙默认拦截了 5201 端口。
6.2 UDP 测试结果“必丢包”:不一定是链路不行
UDP 打流出现丢包时,先别急着下“链路不行”的结论。有几种非链路因素会导致假性丢包:
- 防火墙拦了 UDP:很多防火墙默认对 UDP 的策略比 TCP 严格,先检查服务端入站规则里 UDP 5201 是否放行。
- 服务端 CPU 达到瓶颈:高码率 UDP 打流会大量占用 CPU 处理中断,CPU 满了,接收缓冲区溢出,就出现丢包。用
top或任务管理器确认一下。 - 交换机/路由器的限速策略:有些网络设备的端口有 QoS 或限速配置,导致实际吞吐被人为限制。这种时候打流结果再正常,网络策略也要一并排查。
6.3 Bitrate 单位换算:Mbits/sec 不等于 MB/s
很多人第一次看输出会犯迷糊:500 Mbits/sec为什么不是 50MB/s?因为这里的单位是bit每秒,不是 byte。换算关系是 8 bit = 1 byte,所以 500 Mbps 约等于 62.5 MB/s。跟文件拷贝软件显示的速度对比时,一定要先做这个换算,不然你会以为结果差了好几倍。
6.4 服务端报 Address already in use
如果你先启动过一个服务端没退出,再启动新实例就会报这个错。处理方式:
pkill iperf3或者干脆换个端口启动,比如iperf3 -s -p 5210,客户端对应使用-p 5210连接。注意iperf3一个端口只支持一个服务端实例,不像某些服务可以多进程共享端口。
6.5 Linux 下报错无法启动线程
高并发测试(比如-P 16)时,Linux 下偶尔会报资源不足或创建线程失败。这通常是进程线程数限制太低,执行一下:
ulimit -u unlimited再重试。如果还不行,检查系统ulimit -n是否设置得太低,适当调大文件描述符限制。
6.6 测试结果忽高忽低:先看中间链路
如果每次测试结果差异很大,不要只盯着两端设备。检查交换机端口是否有 CRC 错误计数器在增长、光模块光功率是否在临界值、无线链路是否存在干扰。iperf3只是个测量工具,它能告诉你链路“现在不行”,但具体是哪一段不行,还得靠交换机的统计数据和链路层工具进一步定位。
6.7 报告前多跑两遍,取稳态数据
最后是一个经验之谈:正式测试至少要跑两遍以上,取后程稳定的数据。网络刚建立连接时会有 TCP 慢启动、缓冲区填充的过程,前几秒数据波动大,不具代表性。我一般习惯用-t 60 -i 1拉长测试时间,然后看后 30 秒的输出作为有效数据,前 30 秒当作热身。
写在最后的实操体会
说实话,安装iperf3本身在三分钟之内就能搞定,真正有价值的经验全在参数组合和结果解读上。我自己的习惯是,在正式测试之前,先在本机的回环地址上跑一遍iperf3 -c 127.0.0.1 -u -b 1G,确认软件本身工作正常,再跑到真实链路上去测。这样一旦结果异常,就能排除“工具坏了”这个可能性,直接聚焦到网络设备上。还有一个细节想分享:UDP 打流的时候,不要把-b设置得超过链路标称值太多,否则结果全是丢包,反而不容易看出链路到底能跑多少。从低到高阶梯式测试,找到临界点,比一次压满更有参考价值。