如何用iperf测试wifi性能、数据包的丢包率和延迟?

网络的主要性能参数包括带宽,时延,抖动和丢包率,这些用一个名词代替,就是QOS(服务质量)。

图中D1,D2分别表示包A和包B的时延。抖动=|D2-D1| 。我们测试时需要发送大量的包,因此计算出来的抖动值就是连续发送时延差值的平均值。

iperf中的可选参数比较多,具体可以参见其用户手册。http://webfolder.wirelessleiden.nl/iperf

一般来说,我们在做性能测试的时候需要指定包长,不同的包长会得到不同的吞吐量,通过-l指定,而使用-b指定带宽。

测试吞吐量,抖动和丢包率

如何需要同时测试以上三个参数,那么只能通过UDP获得。使用-u参数进行UDP测试(iperf默认为TCP)。在测试的最后server端会给出一个报告。

[ 3] local 192.168.1.1 port 2152 connected with 192.168.101.2 port 56768 [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 3] 0.0- 1.0 sec 1.40 MBytes 11.7 Mbits/sec 0.069 ms 0/14671 (0%) [ 3] 1.0- 2.0 sec 1.40 MBytes 11.8 Mbits/sec 0.050 ms 0/14703 (0%) [ 3] 2.0- 3.0 sec 1.40 MBytes 11.8 Mbits/sec 0.052 ms 0/14708 (0%) [ 3] 3.0- 4.0 sec 1.40 MBytes 11.8 Mbits/sec 0.057 ms 0/14704 (0%) [ 3] 4.0- 5.0 sec 1.40 MBytes 11.8 Mbits/sec 0.072 ms 0/14706 (0%) [ 3] 5.0- 6.0 sec 1.40 MBytes 11.8 Mbits/sec 0.075 ms 0/14705 (0%) [ 3] 6.0- 7.0 sec 1.40 MBytes 11.8 Mbits/sec 0.060 ms 0/14707 (0%) [ 3] 7.0- 8.0 sec 1.40 MBytes 11.8 Mbits/sec 0.073 ms 0/14703 (0%) [ 3] 8.0- 9.0 sec 1.40 MBytes 11.8 Mbits/sec 0.073 ms 0/14706 (0%) [ 3] 0.0-10.0 sec 14.0 MBytes 11.8 Mbits/sec 0.064 ms 0/147020 (0%)

测试时延,最简单的办法就是使用Ping程序。我们经常用它来测试特定主机能否通过IP到达,程序会按时间和反应成功的次数,估计丢包率和分组来回时间(即网络时延)。

使用TCP测试带宽应注意的问题

有时候,我们需要使用TCP来测试网络带宽。这里有一个参数需要特别注意,那就是TCP窗口大小,可以使用-w参数指定。 网络通道的容量capacity = bandwidth * round-trip time 而理论TCP窗口的大小就是网络通道的容量。比如,网络带宽为40Mbit/s,回环路径消耗时间是2ms,那么TCP的窗口大小不小于40Mbit/s×2ms = 80kbit = 10Kbytes。 此时我们可以查询iperf默认的TCP窗口大小来决定是否需要设置此参数,在此例中,窗口大小应设计大于10Kbytes,当然,这仅仅是理论值,在实际测试中可能需要作出调整。

参数说明 -s 以server模式启动,eg:iperf -s -c 以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23

通用参数 -f [k|m|K|M] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c 222.35.11.23 -f K -i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 -i 2 [v_error]iperf是client端向server端发送数据 server端显示的是接收速率,最好加i参数,进行速率跟踪 client 显示的是发送速率 server 显示接收速率[/v_error] -l 缓冲区大小,默认是8KB,eg:iperf -c 222.35.11.23 -l 16 可以使用不同的包长,进行测试 -m 显示tcp最大mtu值 -o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o c:iperflog.txt -p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999

-u 使用udp协议 [v_error]测试htb的时候最好用udp,udp通信开销小,测试的带宽更准确[/v_error]

-w 指定TCP窗口大小,默认是8KB [v_error]如果窗口太小,有可能丢包[/v_error] -B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数) -C 兼容旧版本(当server端和client端版本不一样时使用) -M 设定TCP数据包的最大mtu值 -N 设定TCP不延时 -V 传输ipv6数据包

server专用参数 -D 以服务方式运行ipserf,eg:iperf -s -D -R 停止iperf服务,针对-D,eg:iperf -s -R

client端专用参数 -d 同时进行双向传输测试 -n 指定传输的字节数,eg:iperf -c 222.35.11.23 -n 100000 -r 单独进行双向传输测试

[v_warn]-b 指定发送带宽,默认是1Mbit/s 在测试qos的时候,这是最有用的参数。[/v_warn] -t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5 默认是10s -F 指定需要传输的文件 -T 指定ttl值

客户端专用选项的含义命令行参数

-c将iperf以client模式启动 例如:iperf3 -c 192.168.12.168,其中192.168.12.168是server端的IP地址

-u指定使用UDP协议

-b [K|M|G] 指定UDP模式使用的带宽,单位bits/sec。此选项与“-u”选项相关。默认值是1 Mbit/sec

-t 指定传输数据包的总时间。iperf将在指定的时间内,重复发送指定长度的数据包。默认是10秒钟

-n [K|M|G] 指定传输数据包的字节数,例如:iperf3 -c 192.168.12.168 –n 100M

-l 指定读写缓冲区的长度。TCP方式默认大小为8KB,UDP方式默认大小为1470字节

-P 指定客户端与服务端之间使用的线程数。默认是1个线程。需要客户端与服务器端同时使用此参数

-R 切换数据发送接收模式,例如默认客户端发送,服务器端接收,设置此参数后,数据流向变为客户端接收,服务器端发送

-w 指定套接字缓冲区大小,在TCP方式下,此设置为TCP窗口的大小。在UDP方式下,此设置为接受UDP数据包的缓冲区大小,用来限制可以接收数据包的最大值

-B 用来绑定一个主机地址或接口,这个参数仅用于具有多个网络接口的主机。在UDP模式下,此参数用于绑定和加入一个多播组

-M 设置TCP最大信息段的值

-N 设置TCP无延时

[v_error]TCP协议测试不能计算出时延与丢包率,而且还不能指定发送带宽。[/v_error]

服务端: [root@localhost ~]# iperf -s -u #设定此端为服务端 ———————————————————— #本段设置信息 Server listening on UDP port 5001 Receiving 1470 byte datagrams UDP buffer size: 108 KByte (default)

[ 3] local 218.60.1.20 port 5001 connected with 218.241.145.36 port 32784 #如果对端连接上了本端才会出现该信息 [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 3] 0.0-10.6 sec 263 KBytes 204 Kbits/sec 36.314 ms 1518/ 1701 (89%) [ 3] 0.0-10.6 sec 1 datagrams received out-of-order

客户端: [root@localhost ~]# iperf -c 192.168.1.100 -u -i 1 -t 10 -b 2M #指定2M带宽向对端发送数据

Client connecting to 192.168.1.100, UDP port 5001 Sending 1470 byte datagrams UDP buffer size: 108 KByte (default)

[ 3] local 192.200.40.112 port 32784 connected with 218.60.1.20 port 5001 #与对端连接上的信息 [ ID] Interval Transfer Bandwidth #输出行的解释 [ 3] 0.0- 1.0 sec 12.0 GBytes 103 Gbits/sec [ 3] 1.0- 2.0 sec 244 KBytes 2.00 Mbits/sec [ 3] 2.0- 3.0 sec 244 KBytes 2.00 Mbits/sec [ 3] 3.0- 4.0 sec 244 KBytes 2.00 Mbits/sec [ 3] 4.0- 5.0 sec 244 KBytes 2.00 Mbits/sec [ 3] 5.0- 6.0 sec 245 KBytes 2.01 Mbits/sec [ 3] 6.0- 7.0 sec 244 KBytes 2.00 Mbits/sec [ 3] 7.0- 8.0 sec 244 KBytes 2.00 Mbits/sec [ 3] 8.0- 9.0 sec 244 KBytes 2.00 Mbits/sec [ 3] 9.0-10.0 sec 244 KBytes 2.00 Mbits/sec [ 3] 0.0-10.0 sec 12.0 GBytes 10.3 Gbits/sec [ 3] Sent 1702 datagrams [ 3] Server Report: #输出报告 [ 3] 0.0-10.6 sec 263 KBytes 204 Kbits/sec 36.313 ms 1518/ 1701 (89%) #间距 ,传输总字节,速率,时延,丢包率。 [ 3] 0.0-10.6 sec 1 datagrams received out-of-order #乱序

为了模拟更真实的TCP应用,iperf客户端允许从一个特定的文件发送数据,这可以通过“-F”参数实现,通过“-F”参数指定了一个webdata.tar.gz文件作为iperf要传输的数据,在使用此参数时,需要同时指定一个“-t”参数来设置要测试传输的时间,这个时间尽量设置长一些,因为在默认传输时间10秒内,这个文件可能还没有传完。

iperf传输100MB的UDP数据包的输出结果 重点关注虚线下的一段内容,在这段输出中,“Jitter”列表示抖动时间,或者称为传输延迟,“Lost/Total”列表示丢失的数据报和总的数据报数量,后面的0.33%是平均丢包的比率,“Datagrams”列显示的是总共传输数据报的数量。这个输出结果过于简单,要了解更详细的UDP丢包和延时信息,可以在iperf服务端查看,因为在客户端执行传输测试的同时,服务端也会同时显示传输状态。在这个输出中,详细记录了在传输过程中,每个阶段的传输延时和丢包率,在UDP应用中随着传输数据的增大,丢包率和延时也随之增加。对于延时和丢包可以通过改变应用程序来缓解或修复,例如视频流应用,可以通过缓存数据的方式而可以容忍更大的延时。

[v_warn]带宽测试通常采用UDP模式,因为能测出极限带宽、时延抖动、丢包率。在进行测试时,首先以链路理论带宽作为数据发送速率进行测试,例如,从客户端到服务器之间的链路的理论带宽为100Mbps,先用 -b 100M进行测试,然后根据测试结果(包括实际带宽,时延抖动和丢包率),再以实际带宽作为数据发送速率进行测试,会发现时延抖动和丢包率比第一次好很多,重复测试几次,就能得出稳定的实际带宽。[/v_warn]

[v_warn]TCP最基本的调整问题是调整TCP窗口大小,它控制在任何一点在网络中可以有多少数据。如果它太小,发送者将会在一段时间内处于空闲状态,从而影响发送TCP的性能。TCP窗口大小的理论值是:瓶颈带宽与往返延时的乘积,即: bottleneck bandwidth round trip time 例如瓶颈链路是45 Mbit/sec,使用ping命令测量到的往返时延是42ms。那么TCP窗口的理论值是45 Mbit/sec 42 ms = (45e6) * (42e-3) = 1890000 bits= 230 KByte.可以以计算得到的TCP窗口为基准,在这个值(如上面为230KByte)的基础上,升高或者降低TCP窗口大小,可以得到一个性能的提升。[/v_warn]

[v_error]-w, –window #[KM] TCP window size (socket buffer size) window szie 就是socket buffer size,当两端不统一的时候,会造成传输速率下降,影响真实的测量结果 所以建议在iperf测试的时候,在server和client端都加上-w的参数 iperf -s -w 1M iperf -c 192.168.0.1 -w 1M -i 1 -t 5[/v_error]

iperf常用选项   iperf选项分为 通用选项、服务端特定选项以及客户端特定选项

通用选项 -f 报告输出格式。 [kmKM] format to report: Kbits, Mbits, KBytes, MBytes -i 在周期性报告带宽之间暂停n秒。如周期是10s,则-i指定为2,则每隔2秒报告一次带宽测试情况,则共计报告5次 -p 设置服务端监听的端口,默认是5001 -u 使用UDP协议测试 -w n 指定TCP窗口大小 -m 输出MTU大小 -M 设置MTU大小 -o 结果输出至文件

服务端选项 -s iperf服务器模式 -d 以后台模式运行服务端 -U 运行一个单一线程的UDP模式

客户端选项 -b , –bandwidth n[KM] 指定客户端通过UDP协议发送数据的带宽(bit/s)。默认是1Mbit/s -c 以客户端模式运行iperf,并且连接至服务端主机ServerIP。 eg: iperf -c -d 双向测试 -t 指定iperf带宽测试时间,默认是10s。 eg: iperf -c -t 20 -P 指定客户端并发线程数,默认只运行一个线程。 eg,指定3个线程 : iperf -c -P 3 -T 指定TTL值

如果需要进行上下行测试,我们可以直接使用双向测试,测试如下:

[root@master ~]# iperf -s

Server listening on TCP port 5001 TCP window size: 85.3 KByte (default)

[ 4] local 192.168.159.135 port 5001 connected with 192.168.159.136 port 56617

Client connecting to 192.168.159.136, TCP port 5001 TCP window size: 19.3 KByte (default)

[ 5] local 192.168.159.135 port 48055 connected with 192.168.159.136 port 5001 [ ID] Interval Transfer Bandwidth [ 4] 0.0- 2.0 sec 528 MBytes 2.20 Gbits/sec [ 5] 0.0- 2.0 sec 425 MBytes 1.78 Gbits/sec

[root@minion ~]# iperf -c 192.168.159.135 -t 2 -d

Server listening on TCP port 5001 TCP window size: 85.3 KByte (default)


Client connecting to 192.168.159.135, TCP port 5001 TCP window size: 174 KByte (default)

#注意看下面两行: [ 5] local 192.168.159.136 port 56617 connected with 192.168.159.135 port 5001 [ 4] local 192.168.159.136 port 5001 connected with 192.168.159.135 port 48055 [ ID] Interval Transfer Bandwidth [ 5] 0.0- 2.0 sec 528 MBytes 2.21 Gbits/sec [ 4] 0.0- 2.0 sec 425 MBytes 1.77 Gbits/sec

#[5]标志开头的是上行测试,因为server端端口才是5001。相应的,[4]标志开头的是下行测试。后面的带宽测试打印的时候,都是以[5]、[4]标记来区分是上行还是下行的。