实验1:SDN拓扑实践
实验1:SDN拓扑实践
一、基础实验
1)使用Mininet可视化工具生成拓扑
2)使用Mininet的命令行生成拓扑
a)三台交换机,每台交换机链接一台主机,三台交换机连成一条线
b)三台主机,每个主机都连接到同一台交换机上
3. 在2b)的基础上,在Mininet交互界面上新增一台主机并且链接到交换机上,再测试新拓扑的连通信
结果:
4.编辑(一)中第一步保存的Python脚本,添加网络性能,再测试新拓扑的联通性
a) h1的cpu最高不超过50%
b)h1和s1之间的链路带宽为10,延迟为5ms,最大队列大小为1000,损耗率50
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(h1, s1, bw=10, delay='5ms',max_queue_size=1000, loss=50)
net.addLink(s2, h4)
net.addLink(s2, h3)
net.addLink(s1, h2)
检测连通信并测试带宽:
二、进阶实验
拓扑要求:
实验代码:
from mininet.topo import Topo
class MyTopo(Topo):
def __init__(self):
Topo.__init__(self)
L1 = 2
L2 = L1 * 2
L3 = L2 * 2
core_sw = []
aggregation_sw = []
edge_sw = []
# add core ovs
for i in range(L1):
sw = self.addSwitch('s{}'.format(i + 1))
core_sw.append(sw)
for i in core_sw:
print(i);
# add aggregation ovs
for i in range(L2):
sw = self.addSwitch('s{}'.format(L1 + i + 1))
aggregation_sw.append(sw)
# add edge ovs
for i in range(L3):
sw = self.addSwitch('s{}'.format(L1 + L2 + i + 1))
edge_sw.append(sw)
# add links between core and aggregation ovs
for i in range(L1):
sw1 = core_sw[i]
for sw2 in aggregation_sw:
self.addLink(sw1, sw2)
# add links between aggregation and edge ovs
for i in range(L2):
sw1 = aggregation_sw[i]
for j in range(L2):
sw2 = edge_sw[int(i/2) * L2 + j]
self.addLink(sw1, sw2)
#add hosts and its links with edge ovs
count = 1;
for sw in edge_sw:
for i in range(2):
host = self.addHost('h{}'.format(count))
self.addLink(sw, host)
count += 1
topos = {'mytopo': (lambda: MyTopo())}
实验结果:
三、知识归纳
拓扑生成
最简拓扑:
sudo mn
sudo mn --topo minimal
简单拓扑
sudo mn --topo=single,3
线性拓扑
sudo mn --topo=linear,4
树形拓扑
sudo mn --topo=tree, depth=2, fanout=2 #深度为2,设备下挂主机数为2
mininet交互式命令
py net.addHost('h3')
py net.addSwitch('s2')
py net.addLink(h3, s1, 0, 1)
py net.addLink(h1, h2, 3, 2) #端口号
addHost()可对主机cpu进行设置,以百分数的形式;
addLink()可以设置带宽bw、延迟delay、最大队列的大小max_queue_size、损耗率loss。
net.addHost('h1', cpu=0.5)
net.addLink(h1, s1, bw=10, delay='5ms',max_queue_size=1000, loss=10, use_htb=True)
性能测试
iPerf测试链路带宽
net.iperf((h1, h3))
利用python生成拓扑
code:
from mininet.topo import Topo
class MyTopo(Topo):
def __init__(self):
Topo.__init__(self)
host1 = self.addHost('h1')
host2 = self.addHost('h2')
host3 = self.addHost('h3')
host4 = self.addHost('h4')
switch1 = self.addSwitch('s1')
switch2 = self.addSwitch('s2')
self.addLink(host1, switch1, 1, 1)
self.addLink(host2, switch1, 1, 2)
self.addLink(host3, switch2, 1, 1)
self.addLink(host4, switch2, 1, 2)
topos = {'mytopo':(lambda:MyTopo())}
命令行:
sudo mn --custom yourtopo.py --topo mytopo --mac
四、总结
错误归纳
最开始在完成“在2b)的基础上,在Mininet交互界面上新增一台主机并且链接到交换机上,再测试新拓扑的连通信”任务时,由于没有为新增的h4分配IP,因此在pingall的时候会出现丢包现象。通过观察并为h4分配IP地址后,能够正常ping通。
实验总结
- 这次实验学习了如何生成自定义拓扑,并且学会了如何使用命令来观察网络中的拓扑情况,如:检测带宽、连通信等
- 这次实验提升了我的动手能力,编程能力,使我对网络知识有了更进一步的了解。