iperf详解 ---- 灌包

摘自:https://zhuanlan.zhihu.com/p/585534080

我们前面介绍过我今天学习了一下3个perf:iperf、netperf和qperf,iperf3是用于执行网络吞吐量测量的工具,可以测试TCP、UDP或SCTP的吞吐量。本文以iperf 3.12为例,介绍一下iperf3命令的详细用法。

 

 

快速用例

 

 

要执行iperf3测试,用户必须同时建立服务器和客户端,我们前面做过不少次示范。iperf3可执行文件同时包含客户端功能和服务器功能,可以使用-s或--server命令行参数启动iperf3服务器:

iperf3 -s [ options ]iperf3 --server [ options ]

 

 

服务器启动后,它将侦听来自iperf3客户端的连接。默认情况下,iperf3服务器通过TCP端口5201侦听来自iperf3客户端的连接;也可以使用-p选项指定自定义端口,例如:

iperf3 -s -p 5002

 

 

客户端模式可以使用-c命令行选项启动,后跟客户端期望连接的服务器主机。

iperf3 -c server [ options ]

主机可以由主机名、IPv4文本或IPv6文本指定:

iperf3 -c tiejunge.com

 

 

iperf3 -c 172.31.0.50iperf3 -c 2001:db8::1

注意,许多iperf3参数同时具有短形式(-s)和长形式(--server)。在本文中,我们通常使用命令行标志的短形式,除非只有长形式的标志可用。

如果iperf3服务器运行在非默认TCP端口上,则还需要在客户端上指定该端口号:

iperf3 -c tiejunge.com -p 5002

初始TCP连接用于交换测试参数、控制测试的开始和结束以及交换测试结果。这有时被称为“控制连接”。实际测试数据通过单独的TCP连接、作为单独的UDP数据包流或作为独立的SCTP连接发送,具体取决于客户端指定的协议。

通常,测试数据从客户端发送到服务器,并测量客户端的上传速度。可以通过在客户端上指定-R标志来测量从服务器下载的速度,这将导致数据从服务器发送到客户端。

iperf3 -c tiejunge.com -p 5002 -R

 

 

结果会同时显示在客户端和服务器上,每个测量间隔至少有一行输出(默认情况下,测量间隔持续一秒,但这可以通过-i选项更改)。每行输出包括(至少)测试开始以来的时间、间隔期间传输的数据量以及该间隔内的平均比特率。注意,每个测量间隔的值是客户端或服务器进程的角度获取的,换句话说,客户端上输出的数据为客户端侧的测量间隔数据,服务器上输出的数据为服务器侧的测量间隔数据。

测试结束时是一组统计数据,显示(至少尽可能多地)发送方和接收方看到的测试摘要,并相应标记行。回想一下,默认情况下,客户端是发送方,服务器是接收方,尽管如上所述,使用-R标志将反转这些角色。

通过指定--get服务器输出标志,可以使客户端检索指定测试的服务器端输出。

客户端或服务器都可以通过传递-J标志以JSON结构生成其输出,这对于与其他程序的集成非常有用。因为JSON结构的内容只有在测试完成后才完全知道,所以在测试结束之前不会发出JSON输出。

iperf3有一组(过度)大的命令行选项,可用于设置测试的参数。它们在下面的“常规选项”部分中给出,并且在iperf3的帮助输出中进行了总结,可以通过使用-h标志运行iperf3来查看。

 

 

常规选项

 

 

-h, --help

显示帮助概要,输出信息是本文档的精简版。

 

 

-v, --version

显示版本信息并退出。

 

 

-p, --port n

将要侦听/连接到的服务器端口设置为n(默认值5201)

-f, --format

[kmgtKMGT]报告格式:Kbits/Mbits/Gbits/Tbits

 

 

-i, --interval n

在周期性吞吐量报告之间间隔n秒;默认值为1,使用0禁用。

 

 

-I, --pidfile file

使用进程ID编写文件,当作为守护进程运行时最有用。

-F, --file name

使用文件作为数据源(在发送方)或接收器(在接收方),而不仅仅是生成随机数据或将其丢弃。此功能用于确定存储子系统是否是文件传输的瓶颈。它不会将iperf3转换为文件传输工具。接收文件的长度、属性以及某些情况下的内容可能与原始文件的内容不匹配。

-A, --affinity n/n,m

如果可能,设置CPU相关性(仅限Linux、FreeBSD和Windows)。在客户端和服务器上,可以使用此参数的n形式(其中n是CPU编号)来设置本地相关性。此外,在客户端,您可以使用n,m形式的参数来覆盖服务器对该测试的相关性。请注意,当使用此功能时,一个进程将仅绑定到一个CPU(而不是一个可能包含多个CPU的集)。

-B, --bind host[%dev]

绑定到与地址主机相关联的特定接口。如果指定了可选接口,则将其视为--bind-dev-dev的快捷方式。请注意,IPv6链路本地地址文本需要百分号和接口设备名称。

--bind-dev dev

绑定到指定的网络接口。此选项使用SO_BINTODEVICE,可能需要根权限。(在Linux和可能的其他系统上可用。)

-V, --verbose

给出更详细的输出。

 

 

-J, --json

JSON格式的输出。

 

 

--logfile file

将输出发送到日志文件。

--forceflush

每个间隔强制冲洗输出,用于在将输出发送到管道时避免缓冲。

--timestamps[=format]

在每个输出行的开头加上时间戳。默认情况下,时间戳具有ctime发出的格式。可选地,可以传递后跟格式规范的=来定制时间戳。如果给定了此可选格式,则=必须紧跟在--timestamps选项之后,中间没有空格。

--rcv-timeout #

设置活动测试期间接收数据的空闲超时。如果在该毫秒数(默认为12000毫秒或2分钟)内没有从发送器接收到数据,则接收器将停止测试。

 

 

--snd-timeout #

为未确认的TCP数据设置超时(在测试和控制连接上)此选项可用于在测试期间网络分区的情况下强制更快的测试超时。所需参数以毫秒为单位指定,默认为系统设置。此功能取决于TCP_USER_TIMEOUT套接字选项,在不支持该选项的系统上不起作用。

-d, --debug

发出调试输出,主要(也许是专门)供开发人员使用。

 

 

 

 

服务器特定选项

 

 

-s, --server

在服务器模式下运行。

-D, --daemon

将服务器作为后台进程运行,此时将不再打印统计信息。

 

 

-1, --one-off

处理一个客户端连接,然后退出。如果设置了空闲时间,则服务器将在该时间段后退出,并且没有连接。

 

 

--idle-timeout n

n秒后重新启动服务器,以防卡住。在一次性模式下,这是服务器在退出前等待的秒数。

 

 

--server-bitrate-limit n[KMGT]

在服务器端设置一个限制,如果客户端指定的测试超过每秒n位,或者客户端发送或接收的平均数据(包括所有数据流)大于每秒n位时,这将导致测试中止。默认限制为零,这意味着没有限制。默认情况下,平均数据速率的间隔为5秒,但可以通过在比特率说明符中添加“/”和数字来指定。

 

 

--rsa-private-key-path file

用于从客户端解密身份验证凭据的RSA私钥(不受密码保护)的路径(如果使用OpenSSL支持构建)。

--authorized-users-path file

包含运行iperf测试的授权用户凭据的配置文件的路径(如果使用OpenSSL支持构建)。该文件是以逗号分隔的用户名和密码哈希列表;有关文件结构的详细信息,请参阅“示例”部分。

--time-skew-thresholdsecond seconds

身份验证过程中服务器和客户端之间的时间偏差阈值(以秒为单位)。

 

 

客户端特定选项

 

 

-c, --client host[%dev]

以客户端模式运行,连接到指定的服务器。默认情况下,测试包括从客户端向服务器发送数据,除非指定了-R标志。如果指定了可选接口,则将其视为--bind-dev-dev的快捷方式。请注意,IPv6链路本地地址文本需要百分号和接口设备名称。

--sctp

使用SCTP而不是TCP(FreeBSD和Linux)。

-u, --udp

使用UDP而不是TCP,UDP的默认发送速率为为1 Mbit/sec。

 

 

--connect-timeout n

设置与服务器建立初始控制连接的超时(毫秒)。默认行为是操作系统建立TCP连接的超时。提供较短的值可以加快对宕机的iperf3服务器的检测。

-b, --bitrate n[KMGT]

将目标比特率设置为n比特/秒(UDP默认为1 Mbit/sec,TCP/SCTP不受限制)。如果有多个流(-P标志),吞吐量限制将分别应用于每个流。还可以向比特率说明符添加“/”和数字,这被称为“突发模式”。它将不暂停地发送给定数量的数据包,即使这暂时超过了指定的吞吐量限制。将目标比特率设置为0将禁用比特率限制(尤其适用于UDP测试)。这个吞吐量限制在iperf3内部实现,在所有平台上都可用。与--fq速率标志进行比较。此选项替换--bandwidth标志,该标志现在已被弃用,但(至少目前)仍被接受。

 

 

--pacing-timer n[KMGT]

以微秒为单位设置起搏计时器间隔(默认为1000微秒或1毫秒)。这控制了iperf3的-b/-比特率选项的内部起搏计时器。计时器按此参数设置的间隔启动。较小的起搏定时器参数值可以平滑iperf3发出的流量,但由于定时器处理更频繁,可能会降低性能。

--fq-rate n[KMGT]

设置用于基于公平排队的套接字级起搏的速率,单位为每秒位。由于iperf3的内部吞吐量起搏(-b/-比特率标志),此起搏(如果指定)将是任何起搏的补充,并且可以为同一测试指定两者。仅在支持SO_MAX_PACING_RATE套接字选项的平台上可用(当前仅限Linux)。默认情况下,没有基于公平排队的起搏。

 

 

--no-fq-socket-pacing

此选项已弃用,将被删除。它相当于指定--fq rate=0。

-t, --time n

传输时间(秒)(默认为10秒)。

 

 

-n, --bytes n[KMGT]

要传输的字节数(而不是-t)。

 

 

-k, --blockcount n[KMGT]

要传输的块(数据包)数(而不是-t或-n),一个块的大小大概是128 KB。

 

 

-l, --length n[KMGT]

要读取或写入的缓冲区长度。对于TCP测试,默认值为128KB。在UDP的情况下,iperf3尝试基于路径MTU动态确定合理的发送大小;如果不能确定,则使用1460字节作为发送大小。对于SCTP测试,默认大小为64KB。

 

 

--cport port

将数据流绑定到特定的客户端端口(仅适用于TCP和UDP,默认情况下使用临时端口)。

 

 

-P, --parallel n

要运行的并行客户端流的数量。请注意,iperf3是单线程的,因此如果您是CPU受限的,这不会产生更高的吞吐量。

 

 

-R, --reverse

反转测试方向,以便服务器向客户端发送数据。

--bidir

双向测试(正常和反向),客户端和服务器同时发送和接收数据。

 

 

-w, --window n[KMGT]

设置套接字缓冲区大小/窗口大小。该值被发送到服务器并在该端使用;在两侧,此选项设置发送和接收套接字缓冲区的大小。此选项可用于(间接)设置最大TCP窗口大小。注意,在Linux系统上,有效的最大窗口大小大约是此选项指定的两倍(此行为不是iperf3中的bug,而是Linux内核的“特性”)。

 

 

-M, --set-mss n

设置TCP/SCTP最大分段大小(MTU-40字节)。

 

 

-N, --no-delay

设置TCP/SCTP无延迟,禁用Nagle算法。

 

 

-4, --version4

仅使用IPv4。

-6, --version6

仅使用IPv6。

-S, --tos n

设置服务的IP类型。可以使用八进制和十六进制的常用前缀,取值范围为十进制的0-255,即52、064和0x34都指定相同的值。

--dscp dscp

设置IP DSCP位,接受数字和符号值,取值范围为十进制的0-63。可以用十进制、八进制和十六进制指定数值(请参阅上面的--tos)。要设置DSCP位和ECN位,请使用--tos。

 

 

-L, --flowlabel n

设置IPv6流标签(当前仅在Linux上受支持)。

-X, --xbind name

使用SCTP_bindx将SCTP关联绑定到特定的链接子集。如果指定了此标志,将忽略--B标志。

通常,当建立关联时,SCTP将包括本地主机上所有活动链路的协议地址。至少指定一个--X名称将禁用此行为。必须为要包含在关联中的每个链接指定此标志,并且iperf服务器和客户端都支持此标志(通过将第一个--X参数传递到bind来支持后者)。主机名被接受为参数,并使用getaddrinfo解析。如果指定了--4或--6标志,则将忽略未解析为指定协议系列内地址的名称。

--nstreams n

设置SCTP流的数量。

-Z, --zerocopy

使用“零拷贝”方法发送数据,例如sendfile,而不是通常的write。

 

 

-O, --omit n

执行N秒的预测试并忽略预测试统计信息,以跳过TCP慢速启动周期。

 

 

-T, --title str

在每个输出行前面加上此字符串。

 

 

--extra-data str

指定要包含在JSON输出中的额外数据字符串字段。

-C, --congestion algo

设置拥塞控制算法(仅限Linux和FreeBSD)。此标志的旧的--linux拥塞同义词已被接受,但已被弃用。

--get-server-output

从服务器获取输出。输出格式由服务器决定(特别是,如果使用--json标志调用服务器,输出将为json格式,否则将为人类可读格式)。如果客户端使用--json运行,则服务器输出包含在json对象中;否则它被附加在人类可读输出的底部。

 

 

--udp-counters-64bit

在UDP测试数据包中使用64位计数器。使用此选项有助于防止长或高比特率UDP测试期间计数器溢出。客户端和服务器都需要至少运行3.1版才能使此选项正常工作。在未来的某个时候,它可能会成为默认行为。

--repeating-payload

在负载中使用重复模式,而不是随机字节。在iperf2中使用了相同的有效载荷(ASCII“0..9”重复)。这可能有助于测试和揭示硬件压缩(包括一些WiFi接入点)网络设备中的问题,其中iperf2和iperf3的性能不同,仅基于有效负载熵。

--dont-fragment

在传出数据包上设置IPv4不分段(Don't Fragment,DF)位,仅适用于通过IPv4执行UDP的测试。

 

 

--username username

用于对iperf服务器进行身份验证的用户名(如果使用OpenSSL支持构建)。运行测试时,将以交互方式提示输入密码。注意,也可以通过IPERF3_password环境变量指定要使用的密码。如果存在此变量,将跳过密码提示。

--rsa-public-key-path file

用于加密身份验证凭据的RSA公钥的路径(如果使用OpenSSL支持构建)。

 

 

示例

 

 

 

 

身份验证-RSA密钥对

iperf3的身份验证功能需要RSA公钥对。公钥用于加密包含用户凭据的身份验证令牌,而私钥用于解密身份验证令牌。私钥必须为PEM格式,并且不能设置密码。公钥必须采用PEM格式,并使用SubjectPrefixKeyInfo编码。使用OpenSSL生成正确格式密钥对的一组UNIX/Linux命令示例如下(也可参考-使用Easy-RSA配置生成SSL证书

> openssl genrsa -des3 -out private.pem 2048> openssl rsa -in private.pem -outform PEM -pubout -out public.pem> openssl rsa -in private.pem -out private_not_protected.pem -outform PEM

在这些命令之后,公钥将包含在文件public中。pem和私钥将包含在文件privatenotprotected.pem中。

 

 

身份验证-授权用户配置文件

为了指定授权用户凭据,必须向iperf3服务器提供一个简单的明文文件。该文件是一个简单的列表,由逗号分隔的用户名和相应的密码散列对组成。密码哈希是字符串“{$user}$password”的SHA256哈希。文件还可以包含注释行(以#字符开头)。在UNIX/Linux系统上生成密码哈希的命令示例如下:

> S_USER=mario S_PASSWD=rossi> echo -n "{$S_USER}$S_PASSWD" | sha256sum | awk '{ print $1 }'

下面给出了密码文件的示例(带有与上述用户名和密码对应的条目):

> cat credentials.csv# file format: username,sha256mario,bf7a49a846d44b454a5d11e7acfaf13d138bbe0b7483aa3e050879700572709b
posted @ 2024-03-27 10:11  LiuYanYGZ  阅读(12)  评论(0编辑  收藏  举报