信道丢包率、带宽


iperf

  1. 安装
  • windows端

Windows分为32位和64位的,对应自己的系统版本下载,下载解压完成之后,将解压得到的文件复制到%systemroot%目录下,就能够直接使用了。

Windows的%systemroot%目录是C:\Windows\System32

不管是使用CMD还是Powershell,都必须要以管理员身份运行,否则无法正常使用

  • linux端
    sudo apt-get install iperf3
  1. 测试时记得关闭防火墙或者自行配置防火墙规则,为了快速测试,这里就直接关闭防火墙

systemctl stop firewalld

  1. 安装完iperf后,在Server端执行
iperf3   -s -i 1 -f  m
		-s表示server,-i表示显示时间间隔,-f表示显示格式化的单位
  1. 在Client端执行如下命令
    iperf3 -c 10.241.18.1 -i 1 -t 30 -f m
     -c表示客户端,后面接server的地址,-t代表运行的时间

    通用参数:

  • -p, —port #,Server 端监听、Client 端连接的端口号;
  • -f, —format [kmgKMG],报告中所用的数据单位,Kbits, Mbits, KBytes, Mbytes;
  • -i, —interval #,每次报告的间隔,单位为秒;
  • -F, —file name,测试所用文件的文件名。如果使用在 Client 端,发送该文件用作测试;如果使用在

    Server 端,则是将数据写入该文件,而不是丢弃;

  • -A, —affinity n/n,m,设置 CPU 亲和力;
  • -B, —bind ,绑定指定的网卡接口;
  • -V, —verbose,运行时输出更多细节;
  • -J, —json,运行时以 JSON 格式输出结果;

—logfile f,输出到文件;

  • -d, —debug,以 debug 模式输出结果;
  • -v, —version,显示版本信息并退出;
  • -h, —help,显示帮助信息并退出。

    Server 端参数:

  • -s, —server,以 Server 模式运行;
  • -D, —daemon,在后台以守护进程运行;
  • -I, —pidfile file,指定 pid 文件;
  • -1, —one- -off,只接受 1 次来自 Client 端的测试,然后退出。

    Client 端参数

  • -c, —client ,以 Client 模式运行,并指定 Server 端的地址;
  • -u, —udp,以 UDP 协议进行测试;
  • -b, —bandwidth #[KMG][/#],限制测试带宽。UDP 默认为 1Mbit/秒,TCP 默认无限制;
  • -t, —time #,以时间为测试结束条件进行测试,默认为 10 秒;
  • -n, —bytes #[KMG],以数据传输大小为测试结束条件进行测试;
  • -k, —blockcount #[KMG],以传输数据包数量为测试结束条件进行测试;
  • -l, —len #[KMG],读写缓冲区的长度,TCP 默认为 128K,UDP 默认为 8K

—cport ,指定 Client 端运行所使用的 TCP 或 UDP 端口,默认为临时端口;

  • -P, —parallel #,测试数据流并发数量;
  • -R, —reverse,反向模式运行(Server 端发送,Client 端接收);
  • -w, —window #[KMG],设置套接字缓冲区大小,TCP 模式下为窗口大小;
  • -C, —congestion ,设置 TCP 拥塞控制算法(仅支持 Linux 和 FreeBSD );
  • -M, —set- -mss #,设置 TCP/SCTP 最大分段长度(MSS,MTU 减 40 字节);
  • -N, —no- -delay,设置 TCP/SCTP no delay,屏蔽 Nagle 算法;
  • -4, —version4,仅使用 IPv4;
  • -6, —version6,仅使用 IPv6;
  • -S, —tos N,设置 IP 服务类型(TOS,Type Of Service);
  • -L, —flowlabel N,设置 IPv6 流标签(仅支持 Linux);
  • -Z, —zerocopy,使用 “zero copy”(零拷贝)方法发送数据;
  • -O, —omit N,忽略前 n 秒的测试;
  • -T, —title str,设置每行测试结果的前缀;

—get- -server- -output,从 Server 端获取测试结果;

—udp- -counters- -64bit,在 UDP 测试包中使用 64 位计数器(防止计数器溢出)。

iperf3 python

tcp

  1. 服务端
    import iperf3
    def iperfserver():
        server = iperf3.Server()
        result = server.run()
        result.remote_host
        print(result)
    iperfserver(received_Mbps)
  2. 客户端
    import iperf3
    
    
    def iperfclient():
        client = iperf3.Client()
        client.duration = 1
        client.server_hostname = '127.0.0.1'
        client.port = 5201
        result = client.run()
        result.sent_Mbps
    iperfclient()

    tips:预先pip install iperf3sudo apt-get install iperf

输出结果

# Bits are measured in 10**3 terms
# Bytes are measured in 2**10 terms
# kbps = Kilobits per second
# Mbps = Megabits per second
# kB_s = kiloBytes per second
# MB_s = MegaBytes per second

self.sent_kbps = self.sent_bps / 1000
self.sent_Mbps = self.sent_kbps / 1000
self.sent_kB_s = self.sent_bps / (8 * 1024)
self.sent_MB_s = self.sent_kB_s / 1024

self.received_kbps = self.received_bps / 1000
self.received_Mbps = self.received_kbps / 1000
self.received_kB_s = self.received_bps / (8 * 1024)
self.received_MB_s = self.received_kB_s / 1024

看一眼源码,然后就拿到了输出数据

  1. bandwidth 目标带宽(以位/秒为单位)
  2. blksize 测试 blksize。
  3. duration 测试持续时间(以秒为单位)。

看了一下最小测试时间为1s,有点长。

udp

服务端

import iperf3
server = iperf3.Server()
server.bind_address = '127.0.0.1'
server.port = 5201
server.verbose = False
while True:
     server.run()

客户端



#!/usr/bin/env python3

import iperf3

client = iperf3.Client()
client.duration = 1
client.server_hostname = '127.0.0.1'
client.port = 5201
client.protocol = 'udp'
client.bind_address="127.0.0.1"

print('Connecting to {0}:{1}'.format(client.server_hostname, client.port))
result = client.run()

if result.error:
    print(result.error)
else:
    print("lost_percent",result.lost_percent)
    print("Bandwidth",result.Mbps)
    print("packets",result.packets)
    print("lost_packets",result.lost_packets)
    print("lost_percent",result.lost_percent)

iperf2

tcp:
iperf -s -p 5001
iperf -c localhost -p 5001 -R -t 0.1 -f s
udp:
iperf -s -p 5001 -u
iperf -c localhost -p 5001 -R -t 0.1 -f s -u -b 10000m
  • -R 双向测试
  • iperf3中则不区分两者区别。
    udp时发现传输带宽只有1.05Mbits/sec

1.05Mbits/sec远低于TCP测试中观察到的值,它也远远低于1GB 的最大出站贷款上限,这是因为默认情况下,iperf讲UDP客户端的贷款限制为每秒1Mbit。

可以用-b标志更改此值,讲数字替换为要测试的最大带宽速率。如果需要测试网络速度,可以将数字设置为高于网络提供商提供的最大带宽上线:

iperf -c 198.51.100.5 -u -b 1000m
这将告诉客户端我们希望尽可能达到每秒1000Mbits的最大值,该-b标志仅在使用UDP连接时有效,因为iperf未在TCP客户端上设置带宽限制。

import os
tmp = os.popen('iperf3 -c localhost -R  -t 0.1 -f s').readlines()
print(tmp[6].split(" ")[12])

输出

110M/bits

tips 后台运行

iperf3 -s -D
# 注意D一定要大写

默认情况下我们进行测试,都是客户端发送数据,服务器端接收数据,这种情况下相当于只对上行带宽进行了测试,如果我们需要检测下行带宽,只需要使用-R命令,即可变为客户端接收,服务器端发送。

参考:

https://iperf.fr/iperf-doc.php

https://github.com/thiezn/iperf3-python

带宽测试

可以通过上述方法获取信道带宽丢包率和时延

print("lost_percent",result.lost_percent)
print("Bandwidth",result.Mbps)
print("packets",result.packets)
print("lost_packets",result.lost_packets)
print("lost_percent",result.lost_percent)

ping


文章作者: 万鲲鹏
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 万鲲鹏 !
评论
  目录