实验1: SDN拓扑实践
1.使用Mininet可视化工具,生成下图所示的拓扑,并保存拓扑文件名为学号.py。
2.使用 Mininet的命令行 生成如下拓扑:
a) 3台交换机,每个交换机连接1台主机,3台交换机连接成一条线。
即线性拓扑(Linear):
sudo mn --topo=linear,3 # 主机数=交换机数=3
b) 3台主机,每个主机都连接到同1台交换机上。
即简单拓扑 :
sudo mn --topo=single,3
3. 在2 b)的基础上,在Mininet交互界面上新增1台主机并且连接到交换机上,再测试新拓扑的连通性。
py net.addHost('h4')
py net.addLink(h4, s1, 0, 4)
py s1.attach('s1-eth4')
# py h4.setIP('10.0.0.4', 24)
# the above instruction can replace the follow two.
py net.get('h4').cmd('ifconfig h4-eth0 10.0.0.4')
# py net.get('h4').cmd('ifconfig h4-eth0 10.4')
h1 ping h4
# h2/h3 ping h4 is ok.
pingall
4. 编辑(一)中第1步保存的Python脚本,添加如下网络性能限制,生成拓扑:
a) h1 的 cpu 最高不超过50%;
b) h1 和 s1 之间的链路带宽为10,延迟为5 ms,最大队列大小为1000,损耗率50。
info( '*** Add hosts/n')
h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None, cpu = 0.5)
h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)
h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)
h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None)
info( '*** Add links/n')
net.addLink(s1, s2)
net.addLink(s1, h1, bw=10, delay='5ms', max_queue_size=1000, loss=50)
net.addLink(s1, h2)
net.addLink(s2, h3)
net.addLink(s2, h4)
5. Advanced 进阶要求
#!/usr/bin/python
# 创建网络拓扑
"""Custom topology example
Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController, CPULimitedHost
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
class MyTopo(Topo):
def __init__(self):
# Initialize topology
Topo.__init__(self)
L1 = 2
L2 = L1 * 2
L3 = L2 * 2
c = []
a = []
e = []
# add core ovs 核心交换机 Level1 c
for i in range(L1):
sw = self.addSwitch('s{}'.format(i + 1))
c.append(sw)
# add aggregation ovs 聚合交换机 Level2 a
for i in range(L2):
sw = self.addSwitch('s{}'.format(L1 + i + 1))
a.append(sw)
# add edge ovs 边缘交换机 Level3 e
for i in range(L3):
sw = self.addSwitch('s{}'.format(L1 + L2 + i + 1))
e.append(sw)
# add links between core(L1) and aggregation ovs(L2)
for i in range(L1):
sw1 = c[i]
for sw2 in a[0:]:
# self.addLink(sw2, sw1, bw=10, delay='5ms', loss=10, max_queue_size=1000, use_htb=True)
self.addLink(sw2, sw1)
# add links between aggregation(L2) and edge ovs(L3)
for i in range(L2):
sw1 = a[i]
j = i // 2
for sw2 in e[j * 4:j * 4 + 4]:
self.addLink(sw2, sw1)
# add hosts and its links with edge ovs
count = 1
for sw1 in e[0:]:
for i in range(2):
host = self.addHost('h{}'.format(count))
self.addLink(sw1, host)
count += 1
topos = { 'mytopo': (lambda: MyTopo() ) }
6.个人总结
在整个的实验过程中, 操作难度并不高, 按部就班, 参考老师提供的资料, 能够非常顺利地完成实验要求.
在添加客户机host
的时候,碰到了一些问题, 最后参考了 这篇博客, 了解了新客户机配置IP
的必要性.
最后的进阶实验, 需要自学一部分Python
相关知识. 不过那些复杂的import
, 我们都在实验环境配置的实验中下载好了, 这为我们编程来具体实现这个网络的拓扑节约了非常多的精力.
最大的遗憾是最后的一个实验要求没有完全实现. 在pingall
命令下, Terminal
的mininet
显示主机之间不能互相通信, 而其他的命令, 比如nodes
, links
, net
, dump
, 均可以正常显示出用户希望得到的结果.
在后面会考虑抽出时间来具体探寻一下原因.
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/288942.html