做运维和网络调试这几年,我电脑里常驻的工具除了浏览器就是一票命令行小工具,而其中用频率最高的,当属 iperf3。不管是帮朋友排查家里宽带跑到不到理论值,还是机房换完交换机需要验证链路质量,我的第一反应永远是掏出 iperf3,两端一跑,数据说话。它不像在线测速网站那样只给你一个“到互联网某个节点的速度”,而是可以完全控制测试链路里的每一个变量,测TCP极限、测UDP丢包抖动、测多线程并发、测反向带宽,几乎覆盖了日常网络排障和性能验证的所有需求。
这篇就把我这几年用 iperf3 的经验整理成一份完整笔记,覆盖各平台下载安装、TCP/UDP 两种模式的测速姿势、参数解读、常见坑点排查,以及几个真实场景的实战思路。不管你是在折腾 NAS、软路由,还是做网络运维,这篇文章都应该能帮你少走不少弯路。
1. 测个网速而已,为什么要用 iperf3?
很多人第一反应是用 Speedtest 之类的在线测速网站,但这只在“你家的宽带连到互联网”这个场景下有参考意义。当你需要验证局域网内两台设备之间的实际带宽、排查无线信号覆盖问题、评估 NAS 到电脑的传输速度、或者确认新旧交换机有没有跑满应有的速率时,在线测速网站根本派不上用场。因为它们测的是“你到服务商节点的速度”,中间隔了太多次路由跳转,链路里任何一环拥堵都会被算进结果,你根本分不清瓶颈到底出在哪儿。
iperf3 的本质是一个主动打流工具:一端运行服务端(server),另一端运行客户端(client),客户端往服务端发起流量,通过统计单位时间内传输的数据量,得出真实的网络带宽。它的核心价值在于两个字——可控。测试的两端都由你决定,测试流量只在两台设备之间走,不经过任何第三方服务器。这意味着你可以精准验证“这条网线”“这台路由器”“这个无线AP”的实际能跑多快,而不是被外网状态干扰。
它还支持 TCP 和 UDP 两种模式。TCP 模式测最大可用带宽,适合判断链路到底能跑多满;UDP 模式则能测出丢包率和抖动,这两项指标在无线网络和实时音视频场景里,是判断链路质量的关键依据。一条链路 TCP 跑得挺快,不代表它适合跑语音通话,因为 TCP 有重传机制,丢失的包会重发,应用层感觉不到卡顿,但实时性要求高的业务就会露馅。而 UDP 打流一测,丢包率多少、抖动多大,链路底子怎么样直接就暴露了。
适合用 iperf3 的人群也很明确:网络运维、服务器管理员、硬件发烧友、玩软路由和 NAS 折腾党,以及任何想弄清“这条链路到底能跑多快”的人。它轻量、开源、跨平台,Windows、Linux、macOS、Android 都跑得起来,安装包小到离谱,远程排查时直接通过 SSH 两端部署,比拉人到现场快太多了。
2. 环境准备:各平台安装与验证
2.1 Windows 上安装其实不需要“安装”
Windows 下 iperf3 解压即用。官方下载地址是 iperf.fr,进去之后找到 Windows 对应的压缩包,解压后能看到 iperf3.exe 和一堆 dll 文件。注意一点,运行 iperf3.exe 时必须保证它和这些 dll 文件在同一个目录下,否则系统会直接报“无法启动此程序,因为计算机中丢失 xxx.dll”,第一次用的人特别容易踩这个坑。
我的习惯是把整个目录放到一个固定位置,比如 C:\tools\iperf3,然后把这个路径加进系统环境变量 PATH。这样之后打开任意命令行窗口,直接敲 iperf3 -v 就能运行,不用每次 cd 到解压目录。加环境变量的步骤很简单:右键“此电脑”->属性->高级系统设置->环境变量,在系统变量里找到 Path 添加一行就完事。
2.2 Linux 和 macOS 一条命令搞定
Linux 上装 iperf3 基本是一句话的事。Debian/Ubuntu 系用 apt install iperf3,CentOS/RHEL 用 yum install iperf3,Fedora 用 dnf install iperf3。macOS 用户装过 Homebrew 的话执行 brew install iperf3 即可。如果发行版仓库里的版本太老,也可以去 GitHub 上拉源码编译,./configure && make && make install 三步走,编译依赖也就 gcc 和 make 那一套。
这里提醒一句:iperf3 和 iperf2 在部分系统仓库里容易装混。装完务必执行 iperf3 -v 确认输出的版本号是 3.x,而不是显示 iperf version 2.x。这两个版本命令参数不兼容,网上很多老教程实际写的是 iperf2 的用法,照着抄在 iperf3 上执行会直接报错,这也是新手最容易困惑的地方。
2.3 Android 手机上的安装姿势
测 Wi-Fi 带宽时手机是刚需,毕竟绝大多数家里没有第二台有线设备方便挪来挪去。Android 上我常用的方式有两种。如果你的手机装了 Termux 终端模拟器,直接 pkg install iperf3,装出来就是完整命令行版本,用法和 Linux 完全一致。如果不想碰命令行,应用商店里搜“iperf3”也能翻到图形界面 APK,比如 Magic iperf,装上之后输入服务端 IP、填端口、点启动就行。
用第三方图形版 APK 有个小坑:部分 app 会带广告或申请一堆奇怪权限,安装前最好留意一下来源和权限清单。我个人的习惯还是推荐 Termux 方案,命令行看着麻烦,但配合电脑端测试时输出信息更完整,还能顺便验证命令行版本在手机上的兼容性,调试起来更顺手。
2.4 安装完先做个基本验证
装好之后别急着到处跑测试,先在同一台机器上验证一下服务端能不能正常启动。命令行执行 iperf3 -s,正常情况会打印出监听信息,提示服务端在指定端口(默认 5201)开始监听。如果这步直接报错,多半是端口被占用或者缺依赖,先把环境理顺再继续。
服务端起来后,再找一台设备执行 iperf3 -c 服务端IP,只要网络是通的,几秒内就会输出完整的带宽测试报告。到这一步,基本环境就算 OK 了,后面才是真正发挥工具价值的部分。
3. TCP 测速实操:最简单也最常用
3.1 服务端的启动与端口管理
服务端的启动命令简洁到不能再简洁:
iperf3 -s
默认监听 TCP 5201 端口,所有测试流量都走这个端口。有特殊需要时用 -p 指定其他端口,比如 iperf3 -s -p 5001。多组并发测试或者机器上已有服务占用 5201 时,换个端口能避免冲突。
服务端启动后如果客户端连不上,第一个要查的就是防火墙。Windows 要确认防火墙是否放行了 iperf3 或对应端口,Linux 要检查 firewalld 或 iptables 规则。我试过很多次,明明两端 IP 能 ping 通,但 iperf3 就是连不上,一查全是防火墙没放行端口。
还有个小经验:做性能测试时,服务端机器尽量用有线连接交换机或路由器,把服务端本身的网络不确定性降到最低。如果服务端也是走 Wi-Fi,那最终测出的数据是两侧无线链路叠加后的结果,定位问题时会很难分清到底是发送端还是接收端拖了后腿。
3.2 客户端连接与输出解读
服务端就绪后,在另一台设备上执行最基本的测试命令:
iperf3 -c 192.168.1.100
这里的 IP 是服务端的局域网地址。默认测试时长 10 秒,每 1 秒打印一次实时数据。输出内容里,每秒的 Transfer 和 Bitrate 是瞬时吞吐量,最后的 SUM 行是整个测试周期的平均值。除此之外还有个 Window size,表示 TCP 缓存窗口大小,长延迟链路下这个窗口如果太小,吞吐就上不去。
以我实测的电脑到 NAS 之间千兆有线链路为例,最后几行通常是这样的:
[ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.00 sec 1.05 GBytes 900 Mbits/sec 0 sender [ 5] 0.00-10.00 sec 1.05 GBytes 899 Mbits/sec receiver10 秒内传了大约 1GB 数据,吞吐约 900Mbps,Retr 为 0,说明链路干净,TCP 完全不需要重传。如果 Retr 数字很高,比如动辄几百上千,说明链路里存在丢包或拥塞,TCP 在不断重传数据,实际速率自然就被拖慢。这时候再去叠加油管工具,大概率也会出现明显的波动和延迟。
3.3 常用参数组合速查
下面这份组合是我平时用得最多的,直接抄作业没有问题。
| 场景 | 命令示例 | 说明 |
|---|---|---|
| 长时稳定性 | iperf3 -c IP -t 30 -i 2 | 测试 30 秒,每 2 秒打印一次 |
| 多线程并发 | iperf3 -c IP -P 4 | 4 个并发连接,汇总总带宽 |
| 反向测速 | iperf3 -c IP -R | 服务端往客户端发流,测反向方向 |
| 调整 TCP 窗口 | iperf3 -c IP -w 2M | 增大窗口,适配高延迟链路 |
| 输出指定时间间隔 | iperf3 -c IP -i 5 | 每 5 秒打印一次,减少输出量 |
其中 -P 多线程这个参数很值得多聊一句。单线程测试时,如果两端设备的单核性能不强,CPU 本身就可能是瓶颈。我遇到过一台老古董双核路由器,单线程只能跑到 300M,开 4 线程后能到 800M 以上,这就是多核心并行能力的差异。所以想压榨设备极限时,跑多线程是必须的。
-R 反向模式也经常用到。默认测试是客户端往服务端发流,模拟“上传”方向;加上 -R 后变成服务端往客户端发流,模拟“下载”方向。家庭宽带申请时通常下行远大于上行,无线网络里上下行速率也经常不对称,单测一个方向会得出错误结论,两个方向都跑一跑才是完整验证。
4. UDP 打流:测丢包和抖动
4.1 为什么要用 UDP 测试
TCP 是可靠传输协议,有重传机制,速率会自适应网络状况。链路质量差时,TCP 会主动降低速度来保证数据不丢,所以 TCP 测出来的速率只能代表“当前链路能稳定传输的极限”,却无法直观反映链路是否存在丢包和抖动。打个比方,TCP 像是一个谨慎的老司机,前面路况不好就自动减速;UDP 则像是踩死油门的赛车手,根本不管路面坑洼,能跑多少跑多少,跑不过去就散架。
这种特点让 UDP 打流特别适合判断 Wi-Fi 信号覆盖、电磁干扰、路由器队列溢出等问题。信号差、干扰大的无线链路,UDP 丢包率会直线上升,一测便知;而同一场景下 TCP 可能只是降速,看起来像是“慢”,不像是“有问题”,反而误导排查方向。
4.2 基本 UDP 测试命令
UDP 模式用 -u 开启。服务端也要加 -u,客户端命令大致如下:
服务端:iperf3 -s -u 客户端:iperf3 -c 192.168.1.100 -u -b 100M
这里的 -b 是发送目标带宽,单位可以是 K/M/G,直接决定发送端以多大的速率 “打流”。默认情况下 UDP 的发送带宽是 1Mbps,如果忘记指定 -b,测出来的结果会低得离谱,看起来“网速崩了”,其实只是参数没设置对。
我习惯从低到高做几轮试探:先测 100M,再测 300M,再测 500M,逐步提高发送速率,同时观察丢包率变化。丢包率开始明显上升的那个发送速率,就是这条链路的实际可用上限。这个方法对无线路由器的性能排查特别管用,哪个速率开始掉包一目了然。
4.3 重点:UDP 测试到底看 sender 还是 receiver
这是被问得最多的问题:“udp 用 iperf3 跑 tx 时是看 sender 端吗?”
我的结论:如果目标是判断“发送端到接收端的链路质量”,丢包率和抖动必须看 receiver 端;发送速率可以参考 sender 端,但绝不能只看 sender 端就下结论。
原因很简单。UDP 发送端的统计只代表它“吐出”了多少数据,根本不关心接收端实际收到多少。链路如果很烂,发送端照样显示 95Mbps,但接收端可能只收到 30Mbps,中间那 60 多兆就是被丢掉的包。只看 sender 端,你会得出“链路不错”的错误结论,而实际情况是丢包率高到完全没法用。
真正规范的验证方式是把客户端(发流端)和服务端(收流端)两边的输出结合起来看。sender 端确认发送速率是否符合预期,receiver 端确认实际接收速率、丢包率和抖动。两者数据差距越大,说明链路损失越严重。具体输出里,receiver 端会显示类似 0/80002 (0%) 这样的信息,意思是总共发了 80002 个包,丢了 0 个,丢包率 0%。抖动单位是毫秒,数值越小越稳定。语音通话场景下,丢包率超过 1% 就能感知到明显卡顿,超过 5% 基本没法正常对话。
4.4 打流时有个隐藏风险要注意
UDP 打流是真正的“不管不顾”流量,不像 TCP 会主动让路。发送带宽设太高,可能把局域网里的其他设备挤到崩溃,路由器的队列一旦溢出,所有人都会感受到网络卡顿。所以不要在一台正在承载业务的路由器上贸然跑一个大带宽 UDP 打流,冲击力比想象中大得多。
最好是在隔离的测试网络里做这件事情,或者把测试安排在业务低峰期。真要在生产环境测,发送带宽从小往大调,观察对现有业务的影响,摸到底之后再决定要不要继续加压。
5. 进阶玩法:多线程、反向与 Wi-Fi 场景实测
5.1 多线程和反向模式结合起来用
前面讲过的 -P 和 -R 组合起来效果更好。测无线路由器转发性能时,单线程往往很难压满带宽,因为无线和路由器的 CPU 存在单核瓶颈。我实测过一台双频路由,单线程双向测速只有 500M 左右,开 4 线程之后能稳定跑到 900M 附近,这种差异反映的就是设备多核心并行能力的差别。
组合命令示例:
iperf3 -c 192.168.1.1 -P 4 -R -t 20 -i 2
这条命令用 4 个并发连接、反向模式(服务端往客户端发流)、测试 20 秒、每 2 秒打印一次。适合评估下载方向的极限速度,与默认方向形成对照。搞网络测试不能只测一个方向,真实使用时流量是双向的,两个方向都验证才能真正反映链路能力。
5.2 无线环境下的测速姿势与注意事项
拿手机或笔记本测 Wi-Fi 时,变量实在太多了:距离、障碍物、频段(2.4G 还是 5G)、信道干扰、天线方向,都会直接影响结果。想让测试数据有可比性,建议固定一个测试点,保持设备方位一致,再对比不同时间、不同配置下的结果。这不是小题大做,我亲眼见过同一位置手机转个 90 度,天线方向性差异直接让吞吐掉了一半。
另一个容易被忽略的点:笔记本连 Wi-Fi 测速时,最好关闭蓝牙。2.4G 频段下蓝牙和 Wi-Fi 的频段部分重合,蓝牙一开,重传率肉眼可见地上升,测出来的数据严重失真。这个坑我踩过好多次,每次都以为是无线路由器的问题,结果关了蓝牙一切正常。
2.4G 和 5G 频段的差异也是必测项。2.4G 穿墙能力强但干扰多、单流速率上限低,5G 干扰少但衰减快。很多智能家居设备只支持 2.4G,和手机跑到同一频段后,互相之间的竞争会明显拉低手机测得的速率。用 iperf3 分别测两个频段各一轮,基本就能摸清路由器的实际覆盖水平。
5.3 真实案例:一次 Wi-Fi 信号问题排查
某个周末朋友抱怨书房角落的电脑下载只有 5MB/s,而客厅手机却轻轻松松跑满千兆,显然不是宽带的问题。我直接搬出 iperf3 做了次哑铃式排查:电脑连 Wi-Fi 当客户端,NAS 有线连路由器当服务端,单线程 UDP 双向打流。结果发现下行方向丢包率在 10% 左右,而上行几乎为零。
这个结果说明问题出在“从路由器到电脑”的下行链路上。再开无线扫描工具看信道,发现 2.4G 频段上附近好几个路由器挤在同一个信道,互相干扰严重。把路由器信道切到空闲信道后,丢包率降为 0,下载速度立刻恢复到 40MB/s 以上。
这类问题用通用测速工具根本看不出来,因为在线测速服务器在互联网上,链路太复杂,无法定位问题在内网还是外网。而 iperf3 只在局域网内打流,链路里的每个环节都是可控的,问题自然一目了然。这也是我为什么一直强调,iperf3 不只是测速工具,更是排障的显微镜。
6. 常见问题与排查技巧实录
6.1 连不上服务端
客户端执行后一直卡在 Connecting,最经典的原因是防火墙没放行端口。Windows 系统先检查“允许应用通过防火墙”列表,Linux 系统检查 firewalld 或 iptables 规则的对应端口是否放行。另一个原因是服务端只监听了 IPv6 或 IPv4 地址,客户端尝试了错误协议族,可以在服务端启动时加上 -4 强制使用 IPv4,客户端也加上 -4 保持一致。
6.2 同一网段能 ping 通但 iperf3 报错
如果 ping 通但 iperf3 连接报错,八成是版本不匹配或者端口被其他服务占用。iperf3 的版本兼容性比很多人想象中差,大版本号不同的两端经常握手失败。另外确认 5201 端口没有被其他程序占用,可以用 netstat -tlnp 检查。我之前遇到过 Java 应用莫名占用了 5201,导致所有测试全部异常,排查了很久才找到原因。
6.3 测出来的带宽和预期差距很大
先别急着怪网络,检查一下链路里最弱的环节。电脑如果用的百兆网卡,测 900Mbps 永远不可能;网线如果是五类线,最大支持 100M,跑千兆也会掉速。把两端设备用有线连接,逐步替换链路上的设备,可以快速定位瓶颈。还有一个容易被忽略的点:笔记本的电源模式。节能模式下 CPU 降频,单线程测试结果会明显偏低,插上电源并把性能模式调到最高再测,有时候数字直接翻倍。
6.4 UDP 测试报 “unable to receive stream”
这个错误一般是 UDP 模式下客户端和服务端版本不匹配导致的。解决办法是两端尽量使用相同的主版本号,或者直接统一升级到最新版。另外检查服务端是否也用 -u 参数启动,如果服务端没开 UDP 模式,客户端却用 -u 发送,同样会报协议不匹配。
6.5 Windows 下运行报缺 dll
解压出来的 iperf3 目录不能随意清理,运行 exe 需要同目录下的 dll 文件支持。把整个文件夹完整拷贝到目标机器,不要只拷一个 exe,否则运行必然报错。
6.6 测试结果忽高忽低
无线环境下速率波动是常态。建议跑多次取中间值,或者用 -t 60 做长时间测试,观察实时打印的数据分布,比单次 10 秒的结果靠谱得多。多次测试之间还可以稍微改动一下设备位置和方向,看看哪些因素影响最大,这样能更全面地了解链路特性。
7. 最后一个实用小技巧
我后来养成一个习惯:所有自动化测试脚本都加上 --json 参数,让结果以 JSON 格式输出,例如 iperf3 -c IP --json,服务端也可以加。这样得到的是结构化数据,方便用脚本解析、记录到日志,或者后续自动生成趋势曲线。对于需要周期性做网络巡检、对比多设备性能的朋友来说,这个功能省心省力,远不是纯命令行屏幕上那几行数字能比的。
当时第一次跑通 iperf3 端到端测试的时候,其实也折腾了一阵子,主要问题出在 Windows 的 dll 和防火墙设置上。遇到问题先拆分变量,两端配置一条条确认,基本都能解决。不信的话,你下次遇到“网速无故变慢”的玄学问题,先用 iperf3 做一轮 TCP + UDP 双模探测,多半能直接看出端倪。