特性
- 和物理网络隔离
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的使用方法
线路测试方法:
- 带宽:bwm-ng,ethstats
- 延迟: ping
- 队列:tc
- TCP窗口统计: tcp_prove
- CPU使用率: top,cpuacct