[环境搭建]mininet中实现随机流量模型,20180130

[环境搭建]mininet中实现随机流量模型

本文记录了如何实现“mininet拓扑中任意一台主机以等概率随机向另外一台主机发送一条UDP数据流,并将iperf测试结果自动保存到文件”的方法,概括来说则是“为mininet设置一条可实现上述功能的自定义命令‘iperfmulti’”。

  • 1.添加自定义函数及自定义命令

  • 使用nano编辑器打开并编辑“***/mininet/net.py”文件,输入命令:

nano  ***/mininet/net.py

    • 注:由于个人的mininet文件夹所在目录不同,故后文都用“***”表示该部分路径。

  • 在“Mininet”类的类体中添加自定义函数“iperf_single”:

def iperf_single( self,hosts=None, udpBw='10M', period=60, port=5001):

        """Run iperf between two hosts using UDP.

           hosts: list of hosts; if None, uses opposite hosts

           returns: results two-element array of server and client speeds"""

        if not hosts:

            return

        else:

            assert len( hosts ) == 2

        client, server = hosts

        filename = client.name[1:] + '.out'

        output( '*** Iperf: testing bandwidth between ' )

        output( "%s and %s\n" % ( client.name, server.name ) )

        iperfArgs = 'iperf -u '      

        bwArgs = '-b ' + udpBw + ' '   """ 设置UDP模式发送的带宽大小  """

        print "***start server***"

        server.cmd( iperfArgs + '-s -i 1' + ' > /home/zg/log/' + filename + '&')   """ 1.在此编辑服务器端的iperf命令,添加需要的参数;2.设置iperf命令的输出结果被保存到的路径 """

        print "***start client***"

        client.cmd(

            iperfArgs + '-t '+ str(period) + ' -c ' + server.IP() + ' ' + bwArgs

            +' > /home/zg/log/' + 'client' + filename +'&') """ 1.在此编辑客户端的iperf命令,添加需要的参数;2.设置iperf命令的输出结果被保存到的路径 """

  • 下图是“***/mininet/net.py”文件中“Mininet”类部分代码的截图:

  • Image(39)

  • 将自定义函数“iperf_single”的代码添加到“Mininet”类的类代码中:

  • Image(40)

   需要注意的一点是Python语句的缩进,如 Image(41)

“def”前应有4个空格,同时,“def”下面的语句也应保持正确的缩进。

  • 在“Mininet”类的类体中添加自定义命令代码“iperfmulti”:

def iperfMulti(self, bw, period=60):

    base_port = 5001

    server_list = []

    client_list = [h for h in self.hosts]

    host_list = []

    host_list = [h for h in self.hosts]

    cli_outs = []

    ser_outs = []

    _len = len(host_list)

    for i in xrange(0, _len):

        client = host_list[i]

        server = client

        while( server == client ):

            server = random.choice(host_list)

        server_list.append(server)

        self.iperf_single(hosts = [client, server], udpBw=bw, period= period, port=base_port)

        sleep(.05)

        base_port += 1

    sleep(period)

    print "test has done"

  • 仍需注意的是Python语句的缩进。

  • 添加代码后如图所示:

  • Image(42)

  • 保存“***/mininet/net.py”文件,退出nano编辑器

                在键盘上按“CTRL+X”,编辑器下方显示出“是否需要保存”的提示信息,如图:

  • Image(43)

  • 按一次“Y”键,再按一次“ENTER”键,即可保存“***/mininet/net.py”文件同时退出nano编辑器。

  • 2.在CLI类中令注册自定义命

    • 修改“***/mininet/mininet/cli.py”文件

      • 使用nano编辑器打开并编辑“***/mininet/mininet/cli.py”文件,输入命令:

nano ***/mininet/mininet/cli.py

  • 在nano编辑器中添加代码:

def do_iperfmulti( self, line ):

        """Multi iperf UDP test between nodes"""

        args = line.split()

        if len(args) == 1:

            udpBw = args[ 0 ]

            self.mn.iperfMulti(udpBw)

        elif len(args) == 2:

            udpBw = args[ 0 ]

            period = args[ 1 ]

            err = False

            self.mn.iperfMulti(udpBw, float(period))

        else:

            error('invalid number of args: iperfmulti udpBw period\n' +

                   'udpBw examples: 1M 120\n')

  •   注:代码需要添加在“CLI”类的类体中。

  • Image(44)

  • 在键盘上依次按下“CTRL+X”、“Y”键、“ENTER”键,即可保存“***/mininet/mininet/cli.py”文件同时退出nano编辑器。

  • 3.在mininet执行解释器中注册自定义命令与对应执行函数的映射关系

    • 修改“***/mininet/bin/mn”文件

      • 使用nano编辑器打开并编辑“***/mininet/bin/mn”文件,输入命令:

nano ***/mininet/bin/mn

  • 找到“ALTSPELLING”,添加“iperfmulti”及“iperfMulti”如图红框部分:

  • Image(45)

  • 4.重新编译mininet

    • 输入命令:

/***/mininet/util/install.sh -n

  • 5.如何使用自定义命令“iperfmulti”

    • 命令格式: iperfmulti <带宽>

      • 例如:

iperfmulti 150M

  • Image(46)

  • 输入命令并观察到终端输出“test has done”后(如上图),可查看测试结果,由前文自定义函数“iperf_single”的代码可知,测试结果保存在目录"/home/zg/log"下。

  • 观察"/home/zg/log"目录下有什么文件,使用以下2条命令:

cd /home/zg/log

ls

  • Image(47)

  • 由上图知,输出了4个文件,分别对应server1,server2,client1,client2的带宽测试输出文件。输出4个文件是由于作者使用了mininet默认的网络拓扑做实验,网络中只有两台主机,这两台主机分别各当了一次server、client,因此共有两组输出文件。

  • 查看iperf测试结果,使用命令“cat <文件名>”,例如:

cat 1.out

                      观察到输出结果:

  • Image(48)

posted @ 2018-05-27 00:43  hallowC  阅读(2367)  评论(0编辑  收藏  举报