使用mininet创建网络拓扑
基本命令
-
help
-显示可能的mininet命令列表 -
nodes
-显示结点列表 -
net
-显示网络拓扑(ASCII编码) -
dump
-显示每个节点的接口设置和表示每个节点的进程的PID -
<node id> ifconfig
-类似于用于定义网络接口的Linux命令 -
<node id> route
-类似于Linux命令,用于定义节点路由表中的条目 -
iperf <node id> <node id>
-两(2)个节点之间的网络性能测试 -
<node id> ping <node id>
-两(2)个节点之间执行ping测试 -
pingall
-在网络中的所有主机之间执行ping测试 -
xterm <node id>
-启动登录到该指定节点的远程xterm
网络构建启动参数
mn --topo
topo用来建立一个网络拓扑
- single :整个网络拓扑中交换机有且只有一个,其可以下挂一个或多个主机;
mn --topo=single,3 #其中3为拓扑中的主机数量
- linear:交换机呈线性排列,且每个交换机所连接主机数目只有一个
mn --topo=linear,4 #其中数字4为交换机的数量,同时每个交换机有且只有一个下挂主机
- tree:交换机呈树形排列,根据参数决定树的分叉和叶子
mn --topo=tree,depth=2,fanout=2 #其中depth为树的深度,fanout为树的广度,即每个树与子树的分叉
- custom:Python编写的自定义文档-file.py,执行此脚本即可创建定义的拓扑,–custom和–mytopo联用
mn --custom file.py --topo mytopo
file.py为脚本文件,最好使用绝对路径mytopo为脚本中定义的类名,即调用该类
mn --switch
定义mininet要使用的交换机(默认使用OVSK,即OpenVSwitch交换机)
内核态交换机:lxbr
用户态交换机:user
ovsk(OpenVSwitch交换机):ivs
内核态和ovsk的交换机内容量和吞吐量比用户态高,用用户态访问文件内存空间是会受到限制的,内核态是可以访问所有的内存和空间的,他所持有的内存空间不会被抢占,所以内核态和ovsk会比较好
如mn --switch -user
mn --controller
定义要是用的控制器,如果没有指定则使用mininet中默认的控制器
连接远程控制器,可以指定存在于本机或者与之相连通设备上的控制器,指定远程控制器的方法
mn --controller=remote,--ip=[controller IP],--port=[port]
\#分别填入控制器ip和监听的端口
\#IP和端口是可以忽略的,忽略的情况就是使用本地的IP地址和6653(默认)或6633端口
mn --mac
自动设置设备的MAC地址
让MAC地址易读,即设置交换机的mac,主机mac及IP地址从小到大排序,且设置简单为一,不仅让机器容易获取,也容易让肉眼很容易识别其IDmn --topo=tree,depth=2,fanout=2,--mac #即在每次定义网络拓扑后加上--mac参数即可
内部交互命令
当mininet创建网络,进入网络之后,这些就是在网络中进行交互的命令
dump
节点信息
net
查看链接信息,交换机路由器的端口与主机端口连接的状态
intfs
网络接口信息
links
链路健壮性信息,查看每条链路的状态,是否正常连接
nodes
查看网络拓扑中有几个节点,包括主机、交换机、路由器
pingall
验证所有主机的连通性
pingpair
只验证前两个host连通性,只验证h1和h2的连通性,不管网络多复杂
link
禁用或开始节点间链路 link s1 s2 up #或link s1 s2 down(开始或禁用)
dpctl
所有交换机上增删改查流表,在所有交换机上进行流表操作 dpctl dump-flows
iperf
两节点之间进行iperftcp宽带测试 iperf h1 h2 #宽带测试,测试流量
iperfudp
两节点间进行iperfudp宽带测试 iperfudp h1 h2
xterm
节点开启xterm进入可视化操作界面 xterm h1
py
执行Python表达式
py net.addSwitch('s2') #添加一个名为s2的交换机
#根据python文件中的函数执行命令
利用py命令添加一个主机h3
py net.addHost('h3') #添加一个主机h3
py net.addLink(s1,net.get('h3')) #添加一条链路,链接s1,h3,此时还联通不了h3
py s1.attach('s1-eth3') #添加/打开交换机s1上的接口eth3
py net.get('h3').cmd('ifconfig h3-eth0 10.3') #给h3添加ip地址,
#此时h3已经获得了IP地址,但是没有与网络沟通,所以h3可以ping通其他主机,反过来ping却不行
py的其他命令
py help(s1) #查看与交换机有关的命令(详细)
py dir(s1) #查看命令(只有函数)
py help(h1) #查看与主机有关的命令(详细)
创建网络拓扑
可视化工具创建拓扑
cd mininet/examples/
sudo python miniedit.py
命令行创建拓扑
- 最小网络,两(2)台主机连接到一(1)台交换机。
sudo mn –topo minimal
- 每个主机都连接到一个交换机,所有交换机都彼此连接。在本例中,有4个主机和4个交换机。
sudo mn --topo linear,4
- 每个主机都连接到一个交换机。在本例中,有3个主机和1个交换机。
sudo mn --topo single,3
- 具有定义深度和扇出的基于树的拓扑。
sudo mn --topo tree,depth=2,fanout=2
交互式创建拓扑
$ sudo mn -v output
mininet> py net.addHost(‘h3’) 添加主机h3
<Host h3: pid=3405>
mininet> py net.addLink(s1, net.get(‘h3’)) 添加s1和h3之间的链接
<mininet.link.Link object at 0x1737090>
mininet> py s1.attach('s1-eth3’)
mininet> py net.get(‘h3’).cmd(‘ifconfig h3-eth0 10.0.0.3’) h3配置IP地址
mininet> h1 ping -c1 10.0.0.3 h1 ping h3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_req=1 ttl=64 time=1.91 ms
脚本创建任意拓扑
from mininet.net import Mininet
net = Mininet()
# Creating nodes in the network.
c0 = net.addController()
h0 = net.addHost('h0')
s0 = net.addSwitch('s0')
h1 = net.addHost('h1')
# Creating links between nodes in network
net.addLink(h0, s0)
net.addLink(h1, s0)
# Configuration of IP addresses in interfaces
h0.setIP('192.168.1.1', 24)
h1.setIP('192.168.1.2', 24)
设置网络性能限制
from mininet.net import Mininet
from mininet.node import CPULimitedHost
from mininet.link import TCLink
net = Mininet(host=CPULimitedHost, link=TCLink)
c0 = net.addController()
s0 = net.addSwitch('s0’)
h0 = net.addHost('h0’)
h1 = net.addHost('h1', cpu=0.5)
h2 = net.addHost('h2', cpu=0.5)
net.addLink(s0, h0, bw=10, delay='5ms', max_queue_size=1000, loss=10, use_htb=True)
net.addLink(s0, h1)
net.addLink(s0, h2)
net.start()
net.pingAll()
net.stop()
- 注意,addhost()语法允许您指定:
每个虚拟主机的CPU(CPU)分配百分比 - 请注意,addlink()语法允许您指定:
带宽(bw),单位为Mbps
延迟(delay)
最大队列大小(max_queue_size)
损失(loss)百分比
网络测试
# display network information
mininet.util.dumpNodeConnections(net.hosts)
# testing ping from all hosts to all hosts
net.pingall()
# test ping from one host to another host
net.ping(h0, h1)
# test packet performance from one host to
another host
net.iperf((h0,h1))
- 对programmatically机制获得的信息与mininet网络进行测试
mininet.util.dumpnodeconn etions()
用于以可打印的方式返回所有网络信息。mininet.net.mininet.ping all()
是从所有节点到所有节点的ping测试,而mininet.net.mininet.ping()
是从一个主机到另一个主机的ping测试。mininet.net.mininet.iperf(
)是一个基本的包测试
其他
-
net = Mininet(controller=RemoteController, switch=OVSKernelSwitch)
-能够自定义控制器或交换机mininet.node.RemoteController(ip=?, port=?)
提供使用外部OpenFlow控制器(如POX)的机制。mininet.node.UserSwitch
提供使用用户空间交换机而不是默认内核交换机的机制。mininet.node.OVSSwitch
提供一种机制,用于使用预装有MiniNet的OpenVswitch。 -
mininet.cli.CLI(<Mininet object>)
允许脚本进入交互模式,通常放在<Mininet object>.stop()
前面
执行sudo mn -c
会进行清理配置操作,适合故障后恢复。
执行exit
会退出Mininet的cli,同时给出运行时间统计。py cmd
使用python来执行cmd。
测试Mininet启动后立刻关闭的时间可以用sudo mn --test none
。