Mininet

1.

简介:进程虚拟化网络仿真工具,可以创建一个含有主机,交换机,控制器和链路的虚拟网络。其交换机支持OpenFlow,具有高度灵活的自定义软件定义网络。

Mininet可以做什么:

- 为OpenFlow应用程序提供简单便宜的网络测试平台

- 启用复杂的拓扑测试,无需链接物理网络

- 具有拓扑感知和OpenFlow感知的CLI,用于调试或运行网络范围的测试

- 支持任意自定义拓扑,主机数可达4096,并包括一组基本的参数拓扑化。

- 提供用于网络创建和实验可扩展的PythonAPI

(Mininet的控制器有Bug,一般使用真实的控制器)

2.

mininet安装

链接: https://pan.baidu.com/s/1YlNLAvVLsiV40Vls95BthA 提取码: pcrx 

下载完成后解压:

里面有mininet镜像、virtualBox虚拟机、Xshell。

我们要做的是将mininet导入virtualBox。

具体实现可以参考这个教程

https://blog.csdn.net/u013042928/article/details/78751239  像我一样的小白专属

Xshell如果更新不了http://soft.onlinedown.net/soft/1216472.htm

可以在这下载最新版本。

3.

mininet文件结构(打星的是主要的)

 

Mininet_第1张图片

4.

mininet的命令:

Mininet_第2张图片

sudo mn的网络构建参数(共5个):

--topo四种:

①单一拓扑  ②线性拓扑 ③树形拓扑 ④自定义拓扑

Mininet_第3张图片

 

Mininet_第4张图片

--switch 定义mininet要使用的交换机(默认使用OVSK,即OpenVSwitch交换机)

ovsk,内核态:效率高,可以访问所有的内存空间和对象

用户态:效率低,访问受限

Mininet_第5张图片

--controller 定义要使用的控制器,如果没有指定则使用mininet中默认的控制器

连接远程控制器,可以指定存在于本机或者与之相连通设备上的控制器

指定远程控制器的方法:sudo mn --controller=remote,--ip=[controller IP],--port=[port]

若ip和port忽略,默认为本地IP和6653或6633端口

--mac 自动设置设备的MAC地址(由小到大排序)

sudo mn --topo=tree,depth=2,fanout=2,--mac

 

简单的内部交互命令:

- mn 创建一个简单的拓扑网络

- net 查看链接信息

- links 链路健壮性

- nodes 查看节点

- pingall 查看主机host连通性

linus下的shell命令在内部要加上sh

Mininet_第6张图片

使用py 拓展网络拓扑:

mininet@mininet-vm:~/mininet$ sudo mn

mininet> net                     #查看拓扑结构
h1 h1-eth0:s1-eth1
h2 h2-eth0:s1-eth2
s1 lo:  s1-eth1:h1-eth0 s1-eth2:h2-eth0
c0
mininet> py net.addHost('h3')    #添加host3
 
mininet> py net.addLink(s1, net.get('h3'))    #链接s1和host3

mininet> py s1.attach('s1-eth3')                  #给连接分配一个端口
mininet> py net.get('h3').cmd('ifconfig h3-eth0 10.3')  #给host3IP地址
mininet> dump                                     #查看节点信息
 
 
  #这里会发现h3并没有IP地址,这是mininet的一个BUG,需要和别的host  ping一下才可以


 
 
mininet> h1 ping h3                         #发现ping通
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=2.33 ms
64 bytes from 10.0.0.3: icmp_seq=2 ttl=64 time=0.414 ms

mininet> dump
 
 
 
 
 

 

5.

Mininet模拟多数据中心流量带宽实验:

 

Mininet_第7张图片

添加功能的三步骤:编写mininet/net.py文件的mininet类        在mininet/cli.py文件中注册命令    在bin/mn中写命令和函数的映射关系

 

①流量随机模型:主机在网络中的另一任意主机以等概率发送数据包

修改mininet/net.py

首先,先在两个主机之间进行iperf测试,并且在server端记录,实现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 + ' '
        print "***start server***"
        server.cmd( iperfArgs + '-s -i 1' + ' > /home/zg/log/' + filename + '&')
        print "***start client***"
        client.cmd(
            iperfArgs + '-t '+ str(period) + ' -c ' + server.IP() + ' ' + bwArgs
            +' > /home/zg/log/' + 'client' + filename +'&')

接着为mininet添加自定义命令iperfmulti,依次为每一台主机随机选择另一台主机作为iperf的服务器端,通过调用iperf_single,自身以客户端身份按照指定参数发送UDP流,服务器生成的报告以重定向的方式输出到文件中,使用iperfmulti命令,主机随机地向另一台主机发起一条恒定带宽的UDP数据流。

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"

修改mininet/cli.py

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')

修改bin/mn

在mininet/bin目录下修改mn文件,将iperfmulti加入到对应的列表中。

ALTSPELLING = { 'pingall': 'pingAll',
            'pingpair': 'pingPair',
            'iperfudp': 'iperfUdp',
            'iperfUDP': 'iperfUdp',
            'iperfmulti':'iperfMulti' }

最后,进入mininet/util目录,重新编译安装mininet:

~/mininet/util/install.sh -n

 

②概率模型:在网络中,编号为m的主机分别以概率Pt 、Pa 、Pc 、向主机编号为(m+i)、(m+j)、(m+k)的主机发送数据包

 

 

目前的问题:

1.  不同交换机下的主机ping不同

2. 设置流表的进出端口的作用,只是给数据一个传输方向吗

3.人工流量功能添加出现ZIPERROR

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(SDN)