实验1:SDN拓扑实践
一、基础要求
* a) 第1步Mininet运行结果截图
* b) 第2步的执行结果截图
* c) 第3步提交修改过的“学号.py”代码、Mininet运行结果
二、进阶要求
代码
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):
# 初始化参数
Topo.__init__(self)
L1 = 2 # 核心层交换机个数
core = [] # 核心层交换数组
L2 = 4 # 汇聚层交换机个数
aggregation = [] # 汇聚层交换数组
L3 = 8 # 边缘层交换机个数
edge = [] # 边缘层交换数组
# 添加核心层交换机
for i in range(L1):
sw = self.addSwitch( 's{}'.format(i + 1))
core.append(sw)
# 添加汇聚层交换机
for i in range(L2):
sw = self.addSwitch( 's{}'.format(L1 + i + 1) )
aggregation.append(sw)
# 添加边缘层交换机
for i in range(L3):
sw = self.addSwitch( 's{}'.format(L1 + L2 + i + 1) )
edge.append(sw)
# 连接核心层、汇聚层
for i in range(L2):
sw = aggregation[i]
self.addLink(sw,core[0])
self.addLink(sw,core[1])
# 连接汇聚层、边缘层
for i in range(L3):
sw = edge[i]
if (i < 4):
self.addLink(sw,aggregation[0])
self.addLink(sw,aggregation[1])
else:
self.addLink(sw,aggregation[2])
self.addLink(sw,aggregation[3])
# 在边缘交换机中,添加其连接的主机
count = 1
for i in range(L3):
sw = edge[i]
for j in range(2):
host = self.addHost('h{}'.format(count))
self.addLink(sw,host)
count +=1
topos = { 'mytopo': ( lambda: MyTopo() ) }
运行截图
三、个人心得
1.实验总结
本次实验的基础要求除了第三步代码不完全之外,其他几步可以正常完成。
在进阶要求中,如果复制参考资源的代码会有报错(语法错误),但这里bug找不到问题所在(不是缩进问题)。
2.问题分享
1.命令行直接添加设备、连接链路,导致pingall报错
在基础要求的第三步中,如果直接按照PPT执行以下命令
mininet> py net.addHost('h4')
mininet> py net.addLink(h4,s1,0,4)
这样虽然可以在links
,和dump
中可以看见h4和s1的接口状态是OK(事实上,dump中显示h4和s1相连的接口没有IP地址),但在pingall中h1、h2、h3会找不到h4的域名。
如果h4要正常连接上拓扑网络、不使其他设备报错,需要设置h4的IP地址,并把这个IP绑定到h4-s1相连的接口,还需要额外执行以下代码
mininet> py s1.attach('s1-eth4') #开启s1的eth4
mininet> py h4.setIP('10.0.0.4',24) #设置h4 IP
mininet> py h4.cmd('ifconfig h4-eth0 10.0.0.4') #将h4的IP地址分给和s1相连的接口
2.Gedit没有配置环境下,不标识语法
(VS Code天下第一)
3.参考资料中的代码语法报错
主要是后面的self.addLink会标识self无法查找问题(但前面可以找到)。并且对于资料中的这种语法不是很熟悉,于是索性把后面的连线部分改了下。