详解篇(Introduction)

特性

  • 和物理网络隔离
    mininet和真实的网络是互相隔离的,如果想连接物理网络则使用NAT类或者在创建的时候使用--nat参数
    也可以将物理网络直接接在mininet上(参见examples/hwintf.py)
  • 所有的host主机共用一个文件系统和一个PID空间,所以要注意不能随便kill了一个PID
  • 很真实.
    1s就是1s,不像模拟器. 所以那种天马星空的网络是不能模拟的(100Gbps)

API

首先举一个例子,在这个例子中,创建了一个能将n个host连接到一个switch的脚本

#!/usr/bin/python                                                                            
                                                                                             
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.util import dumpNodeConnections
from mininet.log import setLogLevel

class SingleSwitchTopo(Topo):
    "Single switch connected to n hosts."
    def build(self, n=2):
        switch = self.addSwitch('s1')
        # Python's range(N) generates 0..N-1
        for h in range(n):
            host = self.addHost('h%s' % (h + 1))
            self.addLink(host, switch)

def simpleTest():
    "Create and test a simple network"
    topo = SingleSwitchTopo(n=4)
    net = Mininet(topo)
    net.start()
    print "Dumping host connections"
    dumpNodeConnections(net.hosts)
    print "Testing network connectivity"
    net.pingAll()
    net.stop()

if __name__ == '__main__':
    # Tell mininet to print useful information
    setLogLevel('info')
    simpleTest()

Topo类是最基础的类
biuld方法中,build方法被重写. (没有写出的)_init_方法会自动将参数传递给build方法
在addHost方法中,还可以指定host 的性能self.addHost(name, cpu=float)(占整个虚拟机的多少)
在addLink中,self.addLink( node1, node2, bw=10, delay='5ms', max_queue_size=1000, loss=10, use_htb=True)(bw是带宽
)

使用字典批量创建就快多了

neg.get(xxx)使用名称去获得一个节点,接下来就可以对这个节点使用cmd命令(host.cmd()用来获取cmd输出了什么或者发送cmd指令)

from time import sleep
...
print "Starting test..."
h1.cmd('while true; do date; sleep 1; done > /tmp/date.out &')
sleep(10)
print "Stopping test"
h1.cmd('kill %while')
print "Reading output"
f = open('/tmp/date.out')
lineno = 1
for line in f.readlines():
    print "%d: %s" % ( lineno, line.strip() )
    lineno += 1
f.close()

如果不结束启动的进程,即使mininet退出了也会后台继续执行,就很扯.

pid = int( h1.cmd('echo $!') )还可以获取PID
pid = int( h1.cmd('echo $!') )等待执行完成

mininet提供了一个方法,不用获取PID并等待

h.sendCmd("xxx")
message=h.waitOutput()

Mininet的文件共享

所有hosts共享同一个root文件目录,通常是/etc目录,但是会给比如httpd这种服务造成麻烦

如果想要拥有不同的目录,创建的时候使用Host(大写),这样写:

h = Host('h1', privateDirs=['/some/directory'])

更多例子在example/bind.py

Host下的方法

1 IP() 返回一个host的IP或者特定的设备的IP
2 MAC() 返回一个MAC
3 setARP() 把一个ARP条目放进一个host的ARP缓存中
4 setIP() 给一个设备设定IP
5 setMAC() 给一个设备设定MAC

例如:
``print "Host", h1.name, "has IP address", h1,IP(), "and MAC address", h1.MAC()

Mininet的CLI

如果想启动xterm的窗口,就要使用CLI()

from mininet.topo import SingleSwitchTopo
from mininet.net import Mininet
from mininet.cli import CLI

net = Mininet(SingleSwitchTopo(2))
net.start()
CLI(net)
net.stop()

"mn --custom"

sudo mn --custom 引入一个py文件 --topo 里面的类去创建topo --test 使用的方法

使用help(xx)可以返回这个xx的使用方法

线路测试方法:

  1. 带宽:bwm-ng,ethstats
  2. 延迟: ping
  3. 队列:tc
  4. TCP窗口统计: tcp_prove
  5. CPU使用率: top,cpuacct
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容