iperf带宽探测工具

程序地址:iPerf - The TCP, UDP and SCTP network bandwidth measurement tool

源码地址:https://github.com/esnet/iperf

一、什么是iPerf / iPerf3 ?

iPerf3 是一种用于主动测量 IP 网络上可实现的最大带宽的工具。 它支持调整与时间、缓冲区和协议(TCP、UDP、带有 IPv4 和 IPv6 的 SCTP)相关的各种参数。 对于每个测试,它都会报告带宽、丢包和其他参数。 这是一个新的实现,它与原始 iPerf 不共享任何代码,也不向后兼容。 iPerf 最初由 NLANR/DAST 开发。 iPerf3 主要由 ESnet / 劳伦斯伯克利国家实验室开发。 它是在三条款 BSD 许可下发布的。

二、iPerf 功能

  • TCP 和 SCTP

1)、测量带宽

2)、报告 MSS/MTU 大小和观察到的读取大小

3)、通过套接字缓冲区支持 TCP 窗口大小

  • UDP

1)、客户端可以创建指定带宽的 UDP 流

2)、测量丢包

3)、测量延迟抖动

4)、组播能力

  • 跨平台:Windows、Linux、Android、MacOS X、FreeBSD、OpenBSD、NetBSD、VxWorks、Solaris、...

  • 客户端和服务器可以有多个同时连接(-P 选项)

  • 服务器处理多个连接,而不是在一次测试后退出

  • 服务器处理多个连接,而不是在一次测试后退出

  • 服务器处理多个连接,而不是在一次测试后退出

  • 使用代表性流来测试链路层压缩如何影响您的可实现带宽(-F 选项)

  • 服务器同时接受一个客户端 (iPerf3) 同时接受多个客户端 (iPerf2)

  • 新:忽略 TCP 慢启动(-O 选项)

  • 新:为 UDP 和(新)TCP(-b 选项)设置目标带宽

  • 新增:设置 IPv6 流标签(-L 选项)

  • 新增:设置拥塞控制算法(-C 选项)

  • 新:使用 SCTP 而不是 TCP(--sctp 选项)

  • 新:以 JSON 格式输出(-J 选项)

  • 新增:磁盘读取测试(服务器:iperf3 -s / 客户端:iperf3 -c testhost -i1 -F 文件名)

  • 新:磁盘写入测试(服务器:iperf3 -s -F 文件名/客户端:iperf3 -c testhost -i1)

三、IP 信息(终端上)

默认 IP 协议为 IPv4 终端公共 IPv4 地址是:47.74.178.174(反向 DNS:47.74.178.174) 终端公共 IPv6 地址是:您没有 IPv6 连接(反向 DNS:n/a)

四、iPerf 2.0、iPerf 3.0 和 iPerf 3.1

  • iPerf3 当前支持的 iPerf2 功能:

        01)、TCP 和 UDP 测试

        02)、设置端口(-p)

        03)、设置 TCP 选项:无延迟、MSS 等。

        04)、设置 UDP 带宽 (-b)

        05)、设置套接字缓冲区大小 (-w)

        06)、报告间隔 (-i)

        07)、设置 iPerf 缓冲区 (-l)

        08)、绑定到特定接口 (-B)

        09)、IPv6 测试 (-6)

        10)、要传输的字节数 (-n)

        11)、测试长度 (-t)

        12)、并行流 (-P)

        13)、设置 DSCP/TOS 位向量 (-S)

        14)、更改数字输出格式 (-f)

  • iPerf 3.0 中的新功能

        01)、动态服务器(客户端/服务器参数交换)——iPerf2 中的大多数服务器选项现在可以由客户端动态设置

        02)、客户端/服务器结果交换

        03)、iPerf3 服务器同时接受单个客户端(iPerf2 同时接受多个客户端)

        04)、iPerf API (libiperf) – 提供一种简单的方法来使用、自定义和扩展 iPerf 功能

        05)、-R,反向测试模式——服务器发送,客户端接收

        06)、-O, --omit N :省略前 n 秒(忽略 TCP 慢启动)

        07)、-b, --bandwidth n[KM] 用于 TCP(仅 UDP 用于 IPERF 2):将目标带宽设置为 n 位/秒(UDP 默认为 1 Mbit/秒,TCP 无限制)

        08)、V, --verbose :比以前更详细的输出

        09)、-J, --json : 以 JSON 格式输出

        00)、-Z, --zerocopy :使用“零拷贝”sendfile() 方法发送数据。这使用更少的CPU

        11)、-T, --title str : 用这个字符串作为每个输出行的前缀

        12)、-F, --file name : xmit/recv 指定文件

        13)、-A, --affinity n/n,m :设置 CPU 亲和性(核心从 0 开始编号 - 仅限 Linux 和 FreeBSD)

        14)、-k, --blockcount #[KMG] :要传输的块(数据包)数(而不是 -t 或 -n)

        15)、-4, --version4 :仅使用 IPv4

        16)、-6, --version6 :仅使用 IPv6

        17)、-L, --flowlabel :设置 IPv6 流标签(仅限 Linux)

        18)、-C, --linux-congestion :设置拥塞控制算法(仅限 Linux 和 FreeBSD)(iPerf2 中的 -Z)

        19)、-d, --debug :发出调试输出。主要(可能专门)供开发人员使用

        20)、-s, --server : iPerf2 可以处理多个客户端请求。 iPerf3 一次只允许一个 iperf 连接

  • iPerf 3.1 中的新功能

        01)、-I, --pidfile file 使用进程 ID 写入文件,在作为守护进程运行时最有用

        02)、--cport :指定客户端端口

        03)、--sctp 使用 SCTP 而不是 TCP(Linux、FreeBSD 和 Solaris)

        04)、--udp-counters-64bit :支持非常长时间运行的 UDP 测试,这可能导致计数器溢出

        05)、--logfile 文件:将输出发送到日志文件

  • iPerf3 不支持的 iPerf2 功能

        01)、双向测试(-d / -r)

        02)、从标准输入 (-I) 传输的数据

        03)、TTL:生存时间,用于多播 (-T)

        04)、排除 C(连接) D(数据) M(多播) S(设置) V(服务器)报告 (-x)

        05)、报告为逗号分隔值 (-y)

        06)、兼容模式允许与旧版本的 iPerf (-C) 一起使用

五、IPerf3用户文档

  • 常规选项

命令行 描述
-p, --port n 服务器侦听和客户端连接的服务器端口。 这在客户端和服务器中应该是相同的。 默认值为 5201
--cport n 指定客户端端口的选项。 (iPerf 3.1 中的新功能)
-f, --format [kmKM] 指定打印带宽格式,支持的格式:"'k' = Kbits/sec 'K' = KBytes/sec 'm' = Mbits/sec 'M' = MBytes/sec,自适应格式根据需要在千和兆之间进行选择
-i, --interval n 设置周期性带宽、抖动和丢失报告之间的间隔时间(以秒为单位)。 如果非零,则自上次报告以来每隔 interval 秒的带宽进行一次报告。 如果为零,则不打印定期报告。 默认为零。
-F, --file name client-side: 从文件中读取并写入网络,而不是使用随机数据; 服务器端: 从网络读取并写入文件,而不是将数据丢弃。
-A, --affinity n/n,m-F 如果可能,设置 CPU 亲和性(仅限 Linux 和 FreeBSD)。 在客户端和服务器上,您都可以使用此参数的 n 形式(其中 n 是 CPU 编号)设置本地亲和性。 此外,在客户端,您可以使用 n,m 形式的参数覆盖服务器对那个测试的亲和性。 请注意,使用此功能时,进程将仅绑定到单个 CPU(与包含潜在多个 CPU 的集合相反)。
-B, --bind host 绑定到 host,这台机器的地址之一。 对于客户端,这将设置出站接口。 对于服务器,这将设置传入接口。 这仅对具有多个网络接口的多宿主主机有用。
-V, --verbose 给出更详细的输出
-J, --json 以 JSON 格式输出
--logfile file 将输出发送到日志文件(iPerf 3.1 中的新功能)
--d, --debug 发出调试输出。 主要(可能专门)供开发人员使用
-v, --version 显示版本信息并退出
-h, --help 显示帮助概要并退出
  • 服务器特定选项

命令行 描述
-s, --server 在服务器模式下运行 iPerf。 (只允许一个 iperf 连接)
-D, --daemon 在后台运行服务器作为守护进程
-I, --pidfilefile 使用进程 ID 编写文件,在作为守护进程运行时最有用。 (iPerf 3.1 中的新功能)
  • 客户端特定选项

命令行 描述
-c, --client host 在客户端模式下运行 iPerf,连接到在 host 上运行的 iPerf 服务器。
--sctp 使用 SCTP 而不是 TCP(Linux、FreeBSD 和 Solaris)。 (iPerf 3.1 中的新功能)
-u, --udp 使用 UDP 而不是 TCP。 另请参阅 -b 选项。
-b, --bandwidth n[KM] 将目标带宽设置为 n 位/秒(UDP 默认为 1 Mbit/秒,TCP 无限制)。 如果有多个流(-P 标志),带宽限制将分别应用于每个流。 您还可以在带宽说明符中添加“/”和数字。 这称为“突发模式”。 即使暂时超过指定的带宽限制,它也会发送给定数量的数据包而不会暂停。
-t, --time n *传输的时间(以秒为单位)。 iPerf 通常通过在 *time* 秒内重复发送 *len*** 字节数组来工作。 默认值为 10 秒。 另请参阅 -l、-k 和 -n  选项。
-n, --num n[KM] 要传输的缓冲区数。 通常,iPerf 发送 10 秒。 -n 选项会覆盖它并发送一个 len 字节数组 num 次,无论需要多长时间。 另请参阅 -l、-k 和 -t  选项。
-k, --blockcount n[KM] 要传输的块(数据包)的数量。 (而不是 -t 或 -n)另见 -t、-l 和 -n 选项。
-l, --length n[KM] 要读取或写入的缓冲区的长度。 iPerf 通过多次写入 len 字节数组来工作。 TCP 的默认值为 128 KB,UDP 的默认值为 8 KB。 另请参阅 -n、-k 和 -t  选项
-P, --parallel n 与服务器建立的同时连接数。 默认值为 1
-R, --reverse 以反向模式运行(服务器发送,客户端接收)
-w, --window n[KM] 将套接字缓冲区大小设置为指定值。 对于 TCP,这将设置 TCP 窗口大小。 (这也被发送到服务器并在该端使用)
-M, --set-mss n 尝试设置 TCP 最大段大小 (MSS)。 MSS 通常是 MTU - TCP/IP 标头的 40 个字节。 对于以太网,MSS 为 1460 字节(1500 字节 MTU)
-N, --no-delay 设置 TCP 无延迟选项,禁用 Nagle 算法。 通常,这仅对 telnet 等交互式应用程序禁用
-4, --version4 仅使用 IPv4.
-6, --version4 仅使用 IPv6.
-S, --tos n 传出数据包的服务类型。 (许多路由器忽略 TOS 字段。)您可以使用前缀为“0x”的十六进制、前缀为“0”的八进制或十进制指定值。 例如,'0x10' 十六进制 = '020' 八进制 = '16' 十进制。 RFC 1349 中指定的 TOS 编号是:IPTOS_LOWDELAY 最小化延迟 0x10 IPTOS_THROUGHPUT 最大化吞吐量 0x08 IPTOS_RELIABILITY 最大化可靠性 0x04 IPTOS_LOWCOST 最小化成本 0x02
-L, --flowlabel n 设置 IPv6 流标签(目前仅在 Linux 上支持)
-Z, --zerocopy 使用发送数据的“零拷贝”方法,例如 sendfile(2),而不是通常的 write(2)。 这使用更少的CPU
-O, --omit n 省略测试的前 n 秒,以跳过 TCP TCP 慢启动 期间
-T, --title **str** 使用此字符串作为每个输出行的前缀
-C, --linux-congestion algo 设置 拥塞控制算法 (Linux 仅适用于 iPerf 3.0,Linux 和 FreeBSD 适用于 iPerf 3.1)

六、iPerf 2.0.6、iPerf 2.0.7 和 iPerf 2.0.8

  • 2.0.6版本 2014 年 3 月:

01)、增加报告标题的共享内存以减少互斥争用。 需要提高性能。 应独立于平台/操作系统的少量代码更改

  • 2.0.7版本2014年8月

01)、仅支持结束/结束延迟的 Linux 版本(假设时钟同步) 02)、支持更小的报告间隔(5 毫秒或更长) 03)、UDP 的结束/结束延迟(平均值/最小值/最大值),以毫秒为单位显示,分辨率为微秒 04)、套接字读取超时(仅限服务器),因此无论没有收到数据包,都会发生 iperf 报告 05)、报告时间戳现在显示毫秒分辨率 06)、本地绑定支持使用冒号作为分隔符的端口值 (-B 10.10.10.1:60001) 07)、使用 linux 实时调度程序和数据包级时间戳来提高延迟准确性 08)、建议客户端和服务器上的 PTP 将时钟同步到微秒 09)、建议 PTP 大师的质量参考,例如 Spectracom 等公司的 GPS 纪律振荡器

  • 2.0.7版本2015年1月

    01)、修复可移植性,使用 Linux、Win10、Win7、WinXP、MacOS 和 Android 进行编译和测试 02)、客户端现在需要 -u 用于 UDP(不再默认为带有 -b 的 UDP) 03)、维护旧的报告格式 04)、支持 -e 以获得增强的报告 05)、使用令牌桶支持 TCP 速率限制流(通过 -b) 06)、支持以 pps 为单位的每秒数据包 (UDP),(例如 -b 1000pps) 07)、在客户端和服务器报告中显示 PPS (UDP) 08)、支持实时调度程序作为命令行选项(--realtime 或 -z) 09)、改进客户端 tx 代码路径,以便实际提供的 tx 速率将收敛到 -b 值 10)、提高微秒延迟调用的准确性(以独立于平台的方式) 11)、(使用卡尔曼滤波器预测延迟误差并根据预测误差调整延迟) 12)、在初始客户端标头 (UDP) 中显示目标循环时间 13)、修复从服务器发送到客户端 (UDP) 的最终延迟报告 14)、在延迟输出中包含标准偏差 15)、抑制不切实际的延迟输出 (-/-/-/-) 16)、发送时支持 SO_SNDTIMEO,因此套接字写入不会阻塞超出 -t (TCP) 17)、如果可用,使用clock_gettime(优先于gettimeofday()) 18)、TCP 写入和错误计数(Linux 的 TCP 重试和 CWND) 19)、TCP读取计数,TCP读取直方图(8 bins) 20)、服务器将在 -t 秒无流量后关闭套接字

七、iPerf 2 用户文档

  • 常规选项

命令行选项 环境变量选项 描述
-f , --format [bkmaBKMA] $IPERF_FORMAT 一个字母,指定打印带宽数字的格式。支持的格式是 'b' = 比特/秒 'B' = 字节/秒 'k' = 千字节/秒'K' = 千字节/秒 'm' = Mbits/sec 'M' = MBytes/sec 'g' = Gbits/sec 'G' = GBytes/sec 'a' = 自适应比特/秒 'A' = 自适应字节/秒自适应格式根据需要在千和兆之间进行选择。带宽以外的字段总是打印字节,否则遵循请求的格式。默认为“a”。 注意:在处理字节时,这里 Kilo = 1024,Mega = 1024^2 和 Giga = 1024^3。通常在网络中,Kilo = 1000,Mega = 1000^2,Giga = 1000^3,所以我们在处理比特时使用它。如果这真的让您感到困扰,请使用 -fb 并计算一下。
-i , --interval # $IPERF_INTERVAL 设置周期性带宽、抖动和丢失报告之间的间隔时间(以秒为单位)。如果非零,则自上次报告以来每隔间隔 秒的带宽进行一次报告。如果为零,则不打印定期报告。默认为零。
-l , --len #[KM] $IPERF_LEN 要读取或写入的缓冲区的长度。iPerf 通过多次写入一个len字节数组来工作。TCP 的默认值为 8 KB,UDP 的默认值为 1470 字节。请注意,对于 UDP,这是数据报大小,在使用 IPv6 寻址时需要将其降低到 1450 或更少以避免碎片。另请参见-n 和-t 选项。
-m , --print_mss $IPERF_PRINT_MSS 打印报告的 TCP MSS 大小(通过 TCP_MAXSEG 选项)和观察到的通常与 MSS 相关的读取大小。MSS 通常是 MTU - TCP/IP 标头的 40 个字节。由于来自 IP 选项的额外标头空间,通常会报告稍小的 MSS。还打印了与 MTU 对应的接口类型(以太网、FDDI 等)。此选项在许多操作系统上未实现,但读取大小可能仍指示 MSS。
-p,--port# $IPERF_PORT 服务器侦听和客户端连接的服务器端口。这在客户端和服务器中应该是相同的。默认为 5001,与 ttcp 相同。
-u , --udp $IPERF_UDP 使用 UDP 而不是 TCP。另请参见-b 选项。
-w , --window #[KM] $TCP_WINDOW_SIZE 将套接字缓冲区大小设置为指定值。对于 TCP,这将设置 TCP 窗口大小。对于 UDP,它只是接收数据报的缓冲区,因此限制了最大可接收数据报的大小。
-B , --bind host $IPERF_BIND 绑定到主机,这台机器的地址之一。对于客户端,这将设置出站接口。对于服务器,这将设置传入接口。这仅对具有多个网络接口的多宿主主机有用。 对于 UDP 服务器模式下的 iPerf,这也用于绑定和加入多播组。使用 224.0.0.0 到 239.255.255.255 范围内的地址进行多播。另请参见-T 选项。
-C , --compatibility $IPERF_COMPAT 兼容模式允许与旧版本的 iPerf 一起使用。互操作性不需要此模式,但强烈建议使用此模式。在某些情况下,当使用代表性流时,您可能会导致 1.7 服务器崩溃或导致不希望的连接尝试。
-M , --mss #[KM} $IPERF_MSS 尝试通过 TCP_MAXSEG 选项设置 TCP 最大段大小 (MSS)。MSS 通常是 MTU - TCP/IP 标头的 40 个字节。对于以太网,MSS 为 1460 字节(1500 字节 MTU)。此选项未在许多操作系统上实现。
-N , --nodelay $IPERF_NODELAY 设置 TCP 无延迟选项,禁用 Nagle 算法。通常,这仅对 telnet 等交互式应用程序禁用。
-V(从 v1.6 或更高版本开始) . 绑定到 IPv6 地址 服务器端: $ iperf -s -V 客户端: $ iperf -c <服务器 IPv6 地址> -V 注意:在 1.6.3 和更高版本上,特定的 IPv6 地址不需要与-B选项绑定,之前的 1.6 版本需要。此外,在大多数使用此选项的操作系统上,也会使用 IPv4 映射地址响应 IPv4 客户端。
-h,--help 打印出命令摘要并退出。
-v,--version 打印版本信息并退出。如果使用 POSIX 线程编译,则打印“pthreads”,如果使用 Microsoft Win32 线程编译,则打印“win32 线程”,如果没有线程编译,则打印“单线程”。
  • 服务器特定选项

命令行选项 环境变量选项 描述
-s , --server $IPERF_SERVER 在服务器模式下运行 iPerf。(iPerf2 可以处理多个客户端请求)
-D(从 v1.2 或更高版本开始) . 将服务器作为守护程序运行(Unix 平台) 在提供服务的 Win32 平台上,iPerf 将开始作为服务运行
-R(仅适用于 Windows,v1.2 或更高版本) . 删除 iPerf 服务(如果它正在运行)。
-o(仅适用于 Windows,从 v1.2 或更高版本开始) . 将输出重定向到给定文件。
-c , --client host $IPERF_CLIENT 如果 iPerf 处于服务器模式,则使用 -c 指定主机将限制 iPerf 将接受到指定主机的 连接。对 UDP 不适用
-P,--parallel # $IPERF_PARALLEL 关闭前服务器要处理的连接数。默认值为 0(这意味着永远接受连接)
  • 客户端特定选项

命令行选项 环境变量选项 描述
-b , --bandwidth #[KM] $IPERF_BANDWIDTH 要发送的 UDP 带宽,以比特/秒为单位。这意味着 -u 选项。默认值为 1 Mbit/秒。
-c , --client host $IPERF_CLIENT 以客户端模式运行 iPerf,连接到在 host上运行的 iPerf 服务器。
-d , --dualtest $IPERF_DUALTEST 在双重测试模式下运行 iPerf。这将导致服务器在-L选项中指定的端口上连接回客户端 (或默认为客户端连接到服务器的端口)。这是立即完成的,因此同时运行测试。如果您想要交替测试,请尝试-r。
-n , --num #[km] $IPERF_NUM 要传输的缓冲区数。通常,iPerf 发送 10 秒。-n 选项覆盖它并发送一个len 字节数组num次,无论需要多长时间。另请参见-l 和-t 选项。
-r,--tradeoff $IPERF_TRADEOFF 在权衡测试模式下运行 iPerf。这将导致服务器在-L选项中指定的端口上连接回客户端 (或默认为客户端连接到服务器的端口)。这是在客户端连接终止之后完成的,因此交替运行测试。如果您想要同时测试,请尝试 -d。
-t,--time# $IPERF_TIME 传输时间(以秒为单位)。iPerf 通常通过在time秒内重复发送len个字节数组来工作。默认值为 10 秒。另请参见-l 和-n 选项。
-L , --listenport # $IPERF_LISTENPORT 这指定了服务器将连接回客户端的端口。它默认为用于从客户端连接到服务器的端口。
-P,--parallel ​​​​​​​# $IPERF_PARALLEL 与服务器建立的同时连接数。默认值为 1。需要客户端和服务器上的线程支持。
-S , --tos # $IPERF_TOS 传出数据包的服务类型。(许多路由器忽略 TOS 字段。)您可以使用前缀为“0x”的十六进制、前缀为“0”的八进制或十进制指定值。例如,'0x10' 十六进制 = '020' 八进制 = '16' 十进制。RFC 1349 中指定的 TOS 编号为: IPTOS_LOWDELAY 最小化延迟 0x10 IPTOS_THROUGHPUT 最大化吞吐量 0x08 IPTOS_RELIABILITY 最大化可靠性 0x04 IPTOS_LOWCOST 最小化成本 0x02
-T , --ttl # $IPERF_TTL 传出多播数据包的生存时间。这本质上是要经过的路由器跃点数,也用于范围界定。默认值为 1,链接本地。
-F(从 v1.2 或更高版本开始) . 使用有代表性的流来测量带宽,例如:- $ iperf -c -F
-I(从 v1.2 或更高版本开始) . 与 -F 相同,从标准输入输入。

八、调整 TCP 连接

1)、iPerf 的主要目标是帮助调整特定路径上的 TCP 连接。TCP 最基本的调优问题是 TCP 窗口大小,它控制着网络中任一时刻可以有多少数据。如果太小,发送方有时会处于空闲状态,性能不佳。用于 TCP 窗口大小的理论值是带宽延迟积

// 瓶颈带宽*往返时间
bottleneck bandwidth * round trip time

2)、在下面的 modi4/cyclops 示例中,瓶颈链路是 45 Mbit/sec DS3 链路,使用 ping 测量的往返时间是 42 ms。带宽延迟积

45 Mbit/sec * 42 ms
= (45e6) * (42e-3)
= 1890000 位
= 230 KB

这是确定最佳窗口大小的起点;将其设置得更高或更低可能会产生更好的结果。在我们的示例中,超过 130K 的缓冲区大小并没有提高性能,尽管带宽延迟产品为 230K。

3)、请注意,许多操作系统和主机对 TCP 窗口大小都有上限。这些可能低至 64 KB,也可能高达数 MB。iPerf 尝试检测这些情况何时发生并给出实际和请求的窗口大小不相等的警告(如下所示,尽管这是由于 IRIX 中的舍入所致)。有关 TCP 窗口大小的更多信息,请参阅LaFibre.info。这是一个示例会话,在伊利诺伊州的 node1 和北卡罗来纳州的 node2 之间。它们通过 vBNS backbone 和 45 Mbit/sec DS3 链路连接。请注意,我们使用适当的 TCP 窗口大小将带宽性能提高了 3 倍。在允许以字节为单位设置窗口大小的平台上使用自适应窗口大小功能

节点2> iperf -s
-------------------------------------------------- ----------
服务器监听 TCP 端口 5001
TCP 窗口大小:60.0 KB(默认)
-------------------------------------------------- ----------
[4] 本地  端口 5001 与  端口 2357 连接
[ID] 间隔传输带宽
[4] 0.0-10.1 秒 6.5 MBytes    5.2 Mbits/sec
​
节点1> iperf -c 节点2
-------------------------------------------------- ----------
客户端连接到 node1,TCP 端口 5001
TCP 窗口大小:59.9 KB(默认)
-------------------------------------------------- ----------
[ 3] 本地  端口 2357 与  端口 5001 连接
[ID] 间隔传输带宽
[3] 0.0-10.0 秒 6.5 MBytes 5.2 Mbits/sec
节点2> iperf -s -w 130k
-------------------------------------------------- ----------
服务器监听 TCP 端口 5001
TCP 窗口大小:130 KB
-------------------------------------------------- ----------
[4] 本地  端口 5001 与  端口 2530 连接
[ID] 间隔传输带宽
[4] 0.0-10.1 秒 19.7 MBytes   15.7 Mbits/sec
​
节点1> iperf -c 节点2 -w 130k
-------------------------------------------------- ----------
客户端连接到 node2,TCP 端口 5001
TCP 窗口大小:129 KB(警告:请求 130 KB)
-------------------------------------------------- ----------
[ 3] 本地  端口 2530 与  端口 5001 连接
[ID] 间隔传输带宽
[3] 0.0-10.0 秒 19.7 MBytes 15.8 Mbits/sec

4)、另一个测试是运行并行 TCP 流。如果总聚合带宽大于单个流获得的带宽,则说明有问题。要么 TCP 窗口太小,要么操作系统的 TCP 实现有 bug,要么网络本身有缺陷。有关 TCP 窗口大小,请参见上文;否则诊断有点困难。如果 iPerf 使用 pthreads 编译,则单个客户端和服务器可以对此进行测试,否则在不同端口上设置多个客户端和服务器。这是一个示例,其中单个流获得 16.5 Mbit/sec,但两个并行流一起获得 16.7 + 9.4 = 26.1 Mbit/sec,即使使用较大的 TCP 窗口大小:

节点2> iperf -s -w 300k
-------------------------------------------------- ----------
服务器监听 TCP 端口 5001
TCP 窗口大小:300 KB
-------------------------------------------------- ----------
[ 4] 本地  端口 5001 与  端口 6902 连接
[ID] 间隔传输带宽
[4] 0.0-10.2 秒 20.9 兆字节  16.5 兆比特/秒
​
[ 4] 本地  端口 5001 与  端口 6911 连接
[ 5] 本地  端口 5001 与  端口 6912 连接
[ID] 间隔传输带宽
[ 5] 0.0-10.1 秒 21.0 兆字节  16.7 兆比特/秒
[ 4] 0.0-10.3 秒 12.0 兆字节  9.4 兆比特/秒
​
节点1 > ./iperf -c 节点2 -w 300k
-------------------------------------------------- ----------
客户端连接到 node2,TCP 端口 5001
TCP 窗口大小:299 KB(警告:请求 300 KB)
-------------------------------------------------- ----------
[3] 本地  端口 6902 与  端口 5001 连接
[ID] 间隔传输带宽
[3] 0.0-10.2 秒 20.9 MBytes 16.4 Mbits/sec
​
节点1 > iperf -c 节点2 -w 300k -P 2
-------------------------------------------------- ----------
客户端连接到 node2,TCP 端口 5001
TCP 窗口大小:299 KB(警告:请求 300 KB)
-------------------------------------------------- ----------
[ 4] 本地  端口 6912 与  端口 5001 连接
[ 3] 本地  端口 6911 与  端口 5001 连接
[ID] 间隔传输带宽
[ 4] 0.0-10.1 秒 21.0 MBytes 16.6 Mbits/sec
[ 3] 0.0-10.2 秒 12.0 MBytes 9.4 Mbits/sec

5)、TCP 的第二个调整问题是最大传输单元 (MTU)。为了最有效,两台主机都应支持路径 MTU 发现。没有 Path MTU Discovery 的主机通常使用 536 作为 MSS,这样会浪费带宽和处理时间。使用 -m 选项显示正在使用的 MSS,并查看这是否符合您的预期。以太网通常约为 1460 字节。

节点3> iperf -s -m
-------------------------------------------------- ----------
服务器监听 TCP 端口 5001
TCP 窗口大小:60.0 KB(默认)
-------------------------------------------------- ----------
[ 4] 本地  端口 5001 与  端口 1096 连接
[ID] 间隔传输带宽
[ 4] 0.0- 2.0 秒 1.8 MBytes 6.9 Mbits/sec
[4] MSS 大小 1448 字节(MTU 1500 字节,以太网)
 [4] 超过 5% 的读取发生的读取长度:
[4] 952 字节读取 219 次 (16.2%)
[4] 1448字节读取1128次(83.6%)

6)、这是一个不支持路径 MTU 发现的主机。它只会发送和接收 576 字节的小数据包。

节点4> iperf -s -m
-------------------------------------------------- ----------
服务器监听 TCP 端口 5001
TCP 窗口大小:32.0 KB(默认)
-------------------------------------------------- ----------
[ 4] 本地  端口 5001 与  端口 13914 连接
[ID] 间隔传输带宽
[ 4] 0.0- 2.3 秒 632 KB 2.1 Mbits/秒
警告:路径 MTU 发现可能未启用。
[ 4] MSS 大小 536 字节(MTU 576 字节,最小值)
 [ 4] 超过 5% 的读取发生的读取长度:
[4] 536 字节读取 308 次 (58.4%)
[4] 1072 字节读取 91 次 (17.3%)
[4] 1608 字节读取 29 次 (5.5%)

iPerf 支持其他调整选项,这些选项是为特殊网络情况添加的,例如 HIPPI 到 HIPPI over ATM。

九、调整 UDP 连接

1)、iPerf 创建一个恒定比特率的 UDP 流。这是一个非常人工的流,类似于语音通信,但仅此而已。

2)、您需要将数据报大小 (-l) 调整为应用程序使用的大小。

3)、服务器通过数据报中的 ID 号检测 UDP 数据报丢失。通常一个 UDP 数据报会变成几个 IP 数据包。丢失单个 IP 数据包将丢失整个数据报。要测量数据包丢失而不是数据报丢失,请使用 -l 选项使数据报足够小以放入单个数据包中。1470 字节的默认大小适用于以太网。乱序数据包也被检测到。(无序数据包会导致丢失数据包计数的不确定性;iPerf 假设它们不是重复数据包,因此它们被排除在丢失数据包计数之外。)由于 TCP 不会向用户报告丢失,我发现 UDP 测试很有帮助查看沿路径的数据包丢失。

4)、jitter计算由服务器连续计算,如 RFC 1889 中的 RTP 所指定。客户端在数据包中记录一个 64 位秒/微秒的时间戳。服务器将相对传输时间计算为(服务器的接收时间 - 客户端的发送时间)。客户端和服务器的时钟不需要同步;在抖动计算中减去任何差异。抖动是连续传输时间之间差异的平滑平均值。

节点2 > iperf -s -u -i 1
-------------------------------------------------- ----------
服务器监听 UDP 端口 5001
接收 1470 字节数据报
UDP 缓冲区大小:60.0 KB(默认)
-------------------------------------------------- ----------
[ 4] 本地  端口 5001 与  端口 9726 连接
[ID] 间隔传输带宽抖动丢失/总数据报
[ 4] 0.0- 1.0 秒 1.3 MBytes 10.0 Mbits/sec 0.209 ms 1/ 894 (0.11%)
[ 4] 1.0- 2.0 秒 1.3 MBytes 10.0 Mbits/sec 0.221 ms 0/ 892 (0%)
[ 4] 2.0- 3.0 秒 1.3 MBytes 10.0 Mbits/sec 0.277 ms 0/ 892 (0%)
[ 4] 3.0- 4.0 秒 1.3 MBytes 10.0 Mbits/sec 0.359 ms 0/ 893 (0%)
[ 4] 4.0- 5.0 秒 1.3 MBytes 10.0 Mbits/sec 0.251 ms 0/ 892 (0%)
[ 4] 5.0- 6.0 秒 1.3 MBytes 10.0 Mbits/sec 0.215 ms 0/ 892 (0%)
[ 4] 6.0- 7.0 秒 1.3 MBytes 10.0 Mbits/sec 0.325 ms 0/ 892 (0%)
[ 4] 7.0- 8.0 秒 1.3 MBytes 10.0 Mbits/sec 0.254 ms 0/ 892 (0%)
[ 4] 8.0- 9.0 秒 1.3 MBytes 10.0 Mbits/sec 0.282 ms 0/ 892 (0%)
[ 4] 0.0-10.0 秒 12.5 MBytes 10.0 Mbits/sec 0.243 ms 1/ 8922 (0.011%)
节点1> iperf -c 节点2 -u -b 10m
-------------------------------------------------- ----------
客户端连接到 node2,UDP 端口 5001
发送 1470 字节数据报
UDP 缓冲区大小:60.0 KB(默认)
-------------------------------------------------- ----------
[ 3] 本地  端口 9726 与  端口 5001 连接
[ID] 间隔传输带宽
[3] 0.0-10.0 秒 12.5 MBytes 10.0 Mbits/sec
[3]发送8922个数据报

5)、请注意,当使用更大的 32 KB 数据报时,由于数据报重组导致的更高抖动,每个数据报分成 23 个 1500 字节的数据包。这里看到的较高数据报丢失可能是由于流量的突发性,即 23 个背靠背数据包,然后是长时间的停顿,而不是均匀间隔的单个数据包

节点2 > iperf -s -u -l 32k -w 128k -i 1
-------------------------------------------------- ----------
服务器监听 UDP 端口 5001
接收 32768 字节数据报
UDP 缓冲区大小:128 KB
-------------------------------------------------- ----------
[ 3] 本地  端口 5001 与  端口 11303 连接
[ID] 间隔传输带宽抖动丢失/总数据报
[ 3] 0.0- 1.0 秒 1.3 MBytes 10.0 Mbits/sec 0.430 ms 0/ 41 (0%)
[ 3] 1.0- 2.0 秒 1.1 MBytes 8.5 Mbits/sec 5.996 ms 6/ 40 (15%)
[ 3] 2.0- 3.0 秒 1.2 MBytes 9.7 Mbits/sec 0.796 ms 1/ 40 (2.5%)
[ 3] 3.0- 4.0 秒 1.2 MBytes 10.0 Mbits/sec 0.403 ms 0/ 40 (0%)
[ 3] 4.0- 5.0 秒 1.2 MBytes 10.0 Mbits/sec 0.448 ms 0/ 40 (0%)
[ 3] 5.0- 6.0 秒 1.2 MBytes 10.0 Mbits/sec 0.464 ms 0/ 40 (0%)
[ 3] 6.0- 7.0 秒 1.2 MBytes 10.0 Mbits/sec 0.442 ms 0/ 40 (0%)
[ 3] 7.0- 8.0 秒 1.2 MBytes 10.0 Mbits/sec 0.342 ms 0/ 40 (0%)
[ 3] 8.0- 9.0 秒 1.2 MBytes 10.0 Mbits/sec 0.431 ms 0/ 40 (0%)
[ 3] 9.0-10.0 秒 1.2 MBytes 10.0 Mbits/sec 0.407 ms 0/ 40 (0%)
[ 3] 0.0-10.0 秒 12.3 MBytes 9.8 Mbits/sec 0.407 ms 7/ 401 (1.7%)
节点1 > iperf -c 节点2 -b 10m -l 32k -w 128k
-------------------------------------------------- ----------
客户端连接到 node2,UDP 端口 5001
发送 32768 字节数据报
UDP 缓冲区大小:128 KB
-------------------------------------------------- ----------
[ 3] 本地  端口 11303 与  端口 5001 连接
[ID] 间隔传输带宽
[3] 0.0-10.0 秒 12.5 MBytes 10.0 Mbits/sec
[3] 发送401个数据报

十、组播

1)、要测试多播,请运行多个将绑定选项(-B、--bind)设置为多播组地址的服务器。运行客户端,连接到多播组地址并根据需要设置 TTL(-T,--ttl)。与正常的 TCP 和 UDP 测试不同,多播服务器可能在客户端之后启动。在这种情况下,在服务器启动之前发送的数据报在第一次定期报告中显示为丢失(下面 arno 上的 61 个数据报)

节点5 > iperf -c 224.0.67.67 -u --ttl 5 -t 5
-------------------------------------------------- ----------
客户端连接到 224.0.67.67,UDP 端口 5001
发送 1470 字节数据报
将多播 TTL 设置为 5
UDP 缓冲区大小:32.0 KB(默认)
-------------------------------------------------- ----------
[3]本地端口1025与224.0.67.67端口5001相连
[ID] 间隔传输带宽
[ 3] 0.0- 5.0 秒 642 KB 1.0 Mbits/秒
[3]发送447个数据报
节点5> iperf -s -u -B 224.0.67.67 -i 1
-------------------------------------------------- ----------
服务器监听 UDP 端口 5001
绑定到本地地址 224.0.67.67
加入组播组 224.0.67.67
接收 1470 字节数据报
UDP 缓冲区大小:32.0 KB(默认)
-------------------------------------------------- ----------
[3]本地224.0.67.67端口5001与端口1025相连
[ID] 间隔传输带宽抖动丢失/总数据报
[ 3] 0.0- 1.0 秒 131 KB 1.0 Mbits/秒 0.007 毫秒 0/ 91 (0%)
[ 3] 1.0- 2.0 秒 128 KB 1.0 Mbits/秒 0.008 毫秒 0/ 89 (0%)
[ 3] 2.0- 3.0 秒 128 KB 1.0 Mbits/秒 0.010 毫秒 0/ 89 (0%)
[ 3] 3.0- 4.0 秒 128 KB 1.0 Mbits/秒 0.013 毫秒 0/ 89 (0%)
[ 3] 4.0- 5.0 秒 128 KB 1.0 Mbits/秒 0.008 毫秒 0/ 89 (0%)
[ 3] 0.0- 5.0 秒 642 KB 1.0 Mbits/秒 0.008 毫秒 0/ 447 (0%)
节点6> iperf -s -u -B 224.0.67.67 -i 1
-------------------------------------------------- ----------
服务器监听 UDP 端口 5001
绑定到本地地址 224.0.67.67
加入组播组 224.0.67.67
接收 1470 字节数据报
UDP 缓冲区大小:60.0 KB(默认)
-------------------------------------------------- ----------
[3]本地224.0.67.67端口5001与端口1025相连
[ID] 间隔传输带宽抖动丢失/总数据报
[ 3] 0.0- 1.0 秒 129 KB 1.0 Mbits/秒 0.778 毫秒 61/ 151 (40%)
[ 3] 1.0- 2.0 秒 128 KB 1.0 Mbits/秒 0.236 毫秒 0/ 89 (0%)
[ 3] 2.0- 3.0 秒 128 KB 1.0 Mbits/秒 0.264 毫秒 0/ 89 (0%)
[ 3] 3.0- 4.0 秒 128 KB 1.0 Mbits/秒 0.248 毫秒 0/ 89 (0%)
[ 3] 0.0- 4.3 秒 554 KB 1.0 Mbits/秒 0.298 毫秒 61/ 447 (14%)

2)、如上所述启动多个客户端或服务器,将数据发送到同一个多播服务器。(如果您有多个服务器侦听多播地址,则每个服务器都将获取数据)

十一、IPv6 模式

1)、使用“ifconfig”命令获取节点的 IPv6 地址。 2)、使用-V选项表示您正在使用 IPv6 地址 请注意,我们还需要显式绑定服务器地址。

服务器端:
$ iperf -s -V
​
客户端:
$ iperf -c <服务器 IPv6 地址> -V >

注意:iPerf 版本 1.6.2 和更早版本要求 IPv6 地址与服务器的-B选项显式绑定。

十二、使用代表性流测量带宽

1)、使用 -F 或 -I 选项。如果你想测试你的网络如何使用压缩/未压缩的流,只需创建代表流并使用 -F 选项来测试它。这通常是由于链路层压缩数据造成的

2)、-F 选项用于文件输入 3)、-I 选项用于来自标准输入的输入

例如
客户端:$ iperf -c <服务器地址> -F <文件名>
​
客户端:$ iperf -c <服务器地址> -I

十三、将服务器作为守护进程运行

使用 -D 命令行选项将服务器作为守护程序运行。将输出重定向到文件

例如
iperf -s -D > iperflog。

这将使 iPerf 服务器作为守护程序运行,并且服务器消息将记录在 iperfLog 文件中

十四、Win32下使用iPerf作为服务端

Win32有三个选项: 1)、-o 输出文件名 将消息输出到指定文件中 2)、-s -D 将 iPerf 安装为服务并运行它 3)、-s -R 卸载 iPerf 服务

iperf -s -D -o iperflog.txt
将安装 iPerf 服务并运行它。消息将被报告到“%windir%\system32\iperflog.txt”
iperf -s -R
如果安装了 iPerf 服务,将卸载它。

注意:如果您在使用 Microsoft 管理控制台或 Windows 任务管理器杀死 iPerf 服务后不想重新启动它,请确保在服务属性对话框中使用正确的 OPTION。

十五、编译

一旦你有了发行版,在 UNIX 上,使用 gzip 和 tar 解压它。这将创建一个包含源文件和文档的新目录“iperf-”。

iPerf 可以在许多系统上干净地编译,包括 Linux、SGI IRIX、HP-UX、Solaris、AIX 和 Cray UNICOS。使用“ make ”为您的操作系统进行配置并编译源代码。

gunzip -c iperf-.tar.gz | tar -xvf -
cd iperf-
./configure
make

要安装 iPerf,请使用“ make install ”,它会询问您安装它的位置。要重新编译,最简单的方法是重新开始。做' make distclean '然后' ./configure; 制作'。有关更多选项,请参阅 Makefile。

你可能感兴趣的:(小tips,WebRTC,TCP/IP,网络,服务器,tcp/ip)