使用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

网络构建启动参数

  1. mn --topo topo用来建立一个网络拓扑
  1. single :整个网络拓扑中交换机有且只有一个,其可以下挂一个或多个主机;
    mn --topo=single,3 #其中3为拓扑中的主机数量
  2. storm 拓扑程序的日志怎么看_网络拓扑


  3. linear:交换机呈线性排列,且每个交换机所连接主机数目只有一个
    mn --topo=linear,4 #其中数字4为交换机的数量,同时每个交换机有且只有一个下挂主机
  4. storm 拓扑程序的日志怎么看_IP_02


  5. tree:交换机呈树形排列,根据参数决定树的分叉和叶子
    mn --topo=tree,depth=2,fanout=2 #其中depth为树的深度,fanout为树的广度,即每个树与子树的分叉
  6. storm 拓扑程序的日志怎么看_.net_03


  7. custom:Python编写的自定义文档-file.py,执行此脚本即可创建定义的拓扑,–custom和–mytopo联用
    mn --custom file.py --topo mytopo file.py为脚本文件,最好使用绝对路径mytopo为脚本中定义的类名,即调用该类
  1. mn --switch 定义mininet要使用的交换机(默认使用OVSK,即OpenVSwitch交换机)
    内核态交换机:lxbr
    用户态交换机:user
    ovsk(OpenVSwitch交换机):ivs
    内核态和ovsk的交换机内容量和吞吐量比用户态高,用用户态访问文件内存空间是会受到限制的,内核态是可以访问所有的内存和空间的,他所持有的内存空间不会被抢占,所以内核态和ovsk会比较好
    mn --switch -user
  2. mn --controller 定义要是用的控制器,如果没有指定则使用mininet中默认的控制器
    连接远程控制器,可以指定存在于本机或者与之相连通设备上的控制器,指定远程控制器的方法
mn --controller=remote,--ip=[controller IP],--port=[port]
\#分别填入控制器ip和监听的端口
\#IP和端口是可以忽略的,忽略的情况就是使用本地的IP地址和6653(默认)或6633端口
  1. mn --mac 自动设置设备的MAC地址
    让MAC地址易读,即设置交换机的mac,主机mac及IP地址从小到大排序,且设置简单为一,不仅让机器容易获取,也容易让肉眼很容易识别其ID
    mn --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-flowsiperf
两节点之间进行iperftcp宽带测试 iperf h1 h2 #宽带测试,测试流量iperfudp
两节点间进行iperfudp宽带测试 iperfudp h1 h2xterm
节点开启xterm进入可视化操作界面 xterm h1py
执行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