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文件结构(打星的是主要的)
4.
mininet的命令:
sudo mn的网络构建参数(共5个):
--topo四种:
①单一拓扑 ②线性拓扑 ③树形拓扑 ④自定义拓扑
--switch 定义mininet要使用的交换机(默认使用OVSK,即OpenVSwitch交换机)
ovsk,内核态:效率高,可以访问所有的内存空间和对象
用户态:效率低,访问受限
--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
使用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 #查看节点信息
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/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