iperf使用总结与源码分析
- 格式:pdf
- 大小:423.80 KB
- 文档页数:42
iperf 使用总结
Iperf 是一个 TCP/IP 和 UDP/IP 的性能测量工具,能够提供网络吞吐率信息,以及震动、丢包率、最大段和最大传输单元大小等统计信息;从而能够帮助我们测试网络性能,定位网络瓶颈。
参数说明
-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
iperf是client端向server端发送数据
server端显示的是接收速率,最好加i参数,进行速率跟踪
client 显示的是发送速率
server 显示接收速率
-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协议
测试htb的时候最好用udp,udp通信开销小,测试的带宽更准确
-w 指定TCP窗口大小,默认是8KB
如果窗口太小,有可能丢包
-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 单独进行双向传输测试
-b 指定发送带宽,默认是1Mbit/s
在测试qos的时候,这是最有用的参数。
-t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5
默认是10s
-F 指定需要传输的文件
-T 指定ttl值
Iperf 源代码分析(一)
概述
前段时间学习Linux网络编程的有关知识,希望看一看这些网络编程的技术在实际的代码中是如何运用的。正巧实验室的项目中使用了开源网络性能测试软件Iperf,于是便初步分析了Iperf 的源代码。现将分析代码的点滴收获写在我的Blog上,希望各位高人多多指教。
Iperf 是美国伊利诺斯大学(University of Illinois)开发的一种网络性能测试工具。可以用来测试网络节点间TCP或UDP连接的性能,包括带宽、延时抖动(jitter,适用于UDP)以及误码率(适用于UDP)等。关于Iperf的下载、安装以及详细的使用方法,可以参照:
/Projects/Iperf/
Iperf是按照Server-Client范型工作的。在连接的一端使用以下命令启动Server:
iperf -s
在连接的另一端启动Client:
iperf -c 1.1.1.1
此处假设Server端的IP地址为1.1.1.1。经过一段测试时间(默认为10秒),在Server端和Client端就会打印出网络连接的各种性能参数。Iperf作为一种功能完备的测试工具,还提供了各种选项,例如是建立TCP连接还是UDP连接、测试时间、测试应传输的字节总数、测试模式等。而测试模式又分为单项测试(Normal Test)、同时双向测试(Dual Test)和交替双向测试(Tradeoff Test)。此外,用户可以指定测试的线程数。这些线程各自独立的完成测试,并可报告各自的以及汇总的统计数据。对于Iperf的详细使用方法以及命令行参数的意义,请参照上面的网页。
Iperf是用C++语言实现的,对设计中的各种结构和功能单元都按照面向对象的思想进行建模。
它主要用到了 Unix系统编程中两个主要的部分:Socket网络编程和多线程编程。因此,通过
分析Iperf的源代码,我们就可以在实际的例子中学习面向对象编程, Socket网络编程以及多
线程编程的技术。同时,Iperf实现的功能比较简单,代码并不复杂,而且功能比较单一。因此,Iperf是我们研究Unix 系统编程技术的一个很好的学习对象。
我所分析的是Iperf 1.7.0版的源代码。需要说明的是,Iperf的源代码中既包含了对应于Unix
的部分,也包含了对应于Windows的部分。这两部分是通过条件编译的预处理语句分别编译的。我仅对Unix部分的代码进行分析。
Iperf提供的库
在开发Iperf的过程中,开发者把 Socket编程和多线程编程中经常用到的一些系统调用封装成
对象,屏蔽了底层函数的复杂接口,提供了模块化和面向对象的机制,也为我们提供了一些非
常实用的编程工具,我们可以在实现自己的程序时复用这些类。由于这些类实现的源代码都比
较简单,也为我们修改前人的代码实现自己的功能提供了方便。
这些类的定义与实现都在源代码文件夹的lib子文件夹下。主要包括以下一些对象:SocketAddr类:封装了Socket接口中的网络地址结构(sockaddr_in等)以及各种地址转换
的系统调用(gethostbyname、gethostbyaddr、inet_ntop等);
Socket类:封装了socket文件描述符,以及socket、listen、connect等系统调用;
Mutex类以及Condition类:封装了POSIX标准中的mutex和condition(条件变量)线程同
步机制;
Thread类:封装了POSIX标准中的多线程机制,提供了一种简单易用的线程模型;Timestamp类:通过Unix系统调用gettimeofday实现了一个时间戳对象,提供了获得当前时
间戳,计算两个时间戳之间的先后关系等方法。
此外,在lib文件夹中还包括一些Iperf的实现提供的实用工具函数,包括endian.c文件中的字
节序转换函数、gnu_getopt文件中的命令行参数处理函数、snprintf文件中的字符串格式化函数、signal.c文件中的与信号处理有关的函数、 string.c文件中的字符处理函数、
tcp_window_size.c文件中的TCP窗口大小处理函数等。
接下来对lib文件夹中的一些比较重要的类和函数进行说明。