流量发生器 (Traffic Generator) 是用来检测网络性能,进行网络相关研究的一个很重要的工具。大家可能用过Iperf或者IxChariot,前者是类UNIX环境下的一个免费、开源的网络性能测试工具,主要用来测试链路速率;后者则是一个非常专业的商业工具,拥有非常友好的图形界面。
作为网络工程师和研究人员,有时我们可能会需要一些具有特定功能的流量发生器,但是目前网络上可以找到的相关工具非常之多,各个软件的使用方式有怎样的不同,到底哪个才是符合自己的要求的呢?这里,我们对目前网络上能够找到的免费的流量发生器进行一个综合性的介绍,希望能够对读者有所帮助。
我们将考察的流量发生器包括以下这些:
为了防止链接今后失效,我所有的软件都存储到了个人的百度网盘分享目录里(http://pan.baidu.com/share/home?uk=3976462948),各位读者可以前往下载。
1. Mtools
基本信息
Mtools有两种基本的工作模式:单向时延测量 (One-way-delay Meter, OWDM) 和往返时延测量 (Rount-trip-time Meter, RTTM)。两种工作模式都很简单:
Mtools支持不同的随机分布,相邻两个报文之间的发送间隔可以是一个常量,也可以服从均匀分布、指数分布、帕累托 (Pateto) 分布;此外UDP报文的有效负荷大小 (payload) 也可以是一个常量,或者符合均匀分布或者指数分布。
由于发布时间比较早,目前Mtools已经不能在较新的Linux环境 (如 Ubuntu 10.04 / gcc 4.4) 下直接编译通过了,需要进行一定的修改,因此这里就不放出相关的截图了。
2. MGEN
基本信息
MGEN (Multi-Generator) 是由美国海军实验室 (United States Naval Research Laboratory) 开发的一款功能强大的开源流量发生器,通过产生TCP / UDP流量测试网络的性能。
MGEN同时支持TCP和UDP、单播和组播、IPv4和IPv6,用户通过编写脚本控制流量发生器的运行,运行完成后产生的日志可以用于进一步的分析,用于计算时延、吞吐量、丢包率等参数。此外,MGEN还支持像ns-2、OPNET这样的仿真环境。在ns-2环境中,用户可以建立MGEN Agent,并且使用TCL脚本对其进行配置。
对于一个流量发生器,通常用户最关心的是它可以产生什么样的流量。在MGEN发布的可执行文件压缩包 (如win32-mgen-5.02.zip中) 里面有一份详细的文档:MGEN User’s and Reference Guide Version 5.0,里面有详细的描述。
根据这个文档,MGEN支持的流量模式 (Pattern)有以下几种:
我们新建一个最简单的脚本文件,发送者向127.0.0.1地址的5000端口发送大小为512字节的报文,每秒发送一个,总共持续3秒,文件名为 simple.mgn,如下所示 (注意最后必须加一个换行符):
# Sender 0.0 ON 1 UDP SRC 5001 DST 127.0.0.1/5000 PERIODIC [1 512] 3.0 OFF 1 # Receiver 0.0 LISTEN UDP 5000
然后执行该脚本:
mgen txlog input simple.mgn
然后就可以看到执行结果了。默认情况下MGEN是不输出SEND消息的,txlog参数保证所有的SEND消息都在日志中进行输出。对MGEN的介绍到此为止,更复杂的功能就有待读者自己尝试了。
3. RUDE & CRUDE
基本信息
RUDE 的全称是 Real-time UDP Data Emitter,CRUDE 的全称是 Collector for RUDE,因此实际上RUDE和CRUDE分别是流量发生器的发送端和接收端,并且只支持UDP数据。
RUDE / CRUDE 的配置和操作和MGEN有些类似,但是并没有使用MGEN的代码。RUDE / CRUDE 设计的初衷是解决MGEN中存在的操作精度问题。在x86 Linux下,通常时间片的取值为10ms,因此定时操作的精度是非常有限的,而该软件通过特殊的设计避免了这个问题。
虽然发布时间比较久远了,但是 rude-0.70 依然能够在 Ubuntu 10.04 下编译成功,但是图形界面不能用了。编译安装完成后,执行rude会看到以下的提示:
执行 crude –h 则会看到以下的提示:
在RUDE源码压缩包的 rude/DOC 目录下有一份示例脚本 example.cfg,我们还是把它精简精简,建立一个最简单的测试脚本,命名为 simple.cfg:
START NOW 1000 0030 ON 5001 127.0.0.1:5000 CONSTANT 1 512 3000 0030 OFF
首先打开接收端CRUDE:
crude -p 5000
然后打开发送端:
rude -s simple.cfg
随后就可以看到执行结果了:
4. UDPgen
Description: A simple UDP TRAFFIC GENERATOR Evaluate % of successful packets compared to transmitted packets Compilation: gcc udpgen.c -o udpgen -O3 There are two types of unsuccessful packages 1. Loss or drop by lower layers. 2. Fail the checksum. This program counts both losses. Usage: ./udpgen [-v] -[s|c] [-n NUM_PACKET] [-l PACKET_LENGTH_IN_BYTES] [-b BANDWIDTH_IN_BYTES_PER_SEC] IPADDRESS PORT -v means verbose -s means server -c means client e.g. ./udpgen -vcl 1000 -b 10000 127.0.0.1 5556 ./udpgen -vsl 1000 127.0.0.1 5556
这里就不再对其进行介绍了。
5. Iperf
基本信息
Iperf 直到今天仍然是一个非常常用的工具,几乎所有的Linux发行版,包括OpenWRT等嵌入式Linux发行版都对其提供支持,Linux之外的Windows、Mac OS等平台上当然也能够运行。Iperf还有一个基于Java的图形界面版本,叫Jperf,后者基本上就是命令行的简单封装,特别需要直接观察速率曲线的用户可以试试。
Iperf 最常见的应用就是测量链路带宽。比如说当买了个千兆以太网卡,或者新的802.11ac路由器时,使用 Iperf 能够快速地对网络的吞吐性能进行评估。
Iperf 有两种工作模式:TCP 和 UDP。Iperf 的默认工作模式为TCP,当在这个模式下工作时,Iperf 客户端会试图以最大的速率向服务器发送数据,用户可以指定一些常见的参数,如窗口大小等。
在下面的例子中,我们首先在路由器中启动 Iperf 服务器,并将TCP窗口大小设置为1MB:
iperf -s -w 1M
然后在PC上启动 Iperf 客户端,并设置统计的间隔为一秒钟:
iperf -c 192.168.1.1 -w 1M -i 1
按下回车后,带宽测试就开始了,运行结果如下图所示:
客户端会每隔一秒汇报一下测量所得的带宽值,而服务器则是在整个测试完成后汇报平均值。
如果工作模式为UDP,那么运行服务器时需要指定-u参数:
iperf -u -s
客户端除了-u参数之外,还需要指定发送的速率,否则会以1Mbps的默认速率发送,这也意味着此时会产生一个基于UDP的CBR数据流:
iperf -u -c 192.168.1.1 -b 3M -i 1
在UDP模式下,Iperf 会额外汇报整个测试的时延、丢包率等情况,这里就不再展示了。
6. D-ITG
基本信息
D-ITG是意大利某大学(Universita' degli Studi di Napoli ''Federico II'')的一个小组开发的一个功能强大的流量发生器。通过对报文大小(Packet Size)、报文间隔(Inter Departure Time)的随机模型进行建模,D-ITG可以产生不同特征的流量。一些预置的类型包括:
D-ITG支持的传输协议包括:
D-ITG支持类似FTP中的“被动模式”,因此可以用于存在NAT的环境中。此外,D-ITG还支持设置IP报文中的TOS和TTL字段。
D-ITG的总体架构如下图所示:
其中的每一个组件实际上都是一个可执行文件。ITGSend程序用于发送数据;ITGRecv用于接收数据;ITGLog用于记录流量日志;ITGDec用于对日志进行分析,对吞吐量、时延等参数进行分析,作者称之为解码(Decode);ITGManager与远程控制ITGSend相关,作用大概类似于IxChariot Console。
D-ITG的编译过程非常简单,进入src目录然后直接执行make即可,生成的文件将出现在bin目录下。下面我们以一个最简单的例子看看D-ITG的运行流程。
首先进入bin目录,运行如下的指令:
feng32@feng32-desktop:~/Downloads/D-ITG/bin$ ./ITGRecv ITGRecv version 2.8.1 (r1023) Compile-time options: bursty multiport Press Ctrl-C to terminate
D-ITG的接收端将开始监听。然后运行如下的指令打开发送端。注意下面的命令行参数中,-a代表目标地址,-c表示报文的大小是100字节,-C代表报文间隔(Inter Departure Time)是一个常数,后面的参数表示每秒钟发送的报文的个数。
feng32@feng32-desktop:~/Downloads/D-ITG/bin$ ./ITGSend -T UDP -a 127.0.0.1 -c 100 -C 10 -t 15000 -l sender.log -x receiver.log ITGSend version 2.8.1 (r1023) Compile-time options: bursty multiport Started sending packets of flow ID: 1 Finished sending packets of flow ID: 1
最后即可使用ITGDec对产生的日志文件进行分析。
更详细的使用信息请参考D-ITG的官方使用手册。