實驗1:SDN拓撲實踐
- 2022 年 9 月 18 日
- 筆記
1.基礎要求
a) 第1步Mininet運行結果截圖

b) 第2步的執行結果截圖



c) 第3步提交修改過的「學號.py」程式碼、Mininet運行結果
#!/usr/bin/env python
from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call
def myNetwork():
net = Mininet( topo=None,
build=False,
ipBase='10.0.0.0/8')
info( '*** Adding controller\n' )
c0=net.addController(name='c0',
controller=Controller,
protocol='tcp',
port=6633)
info( '*** Add switches\n')
s1 = net.addSwitch('s1', cls=OVSKernelSwitch)
s2 = net.addSwitch('s2', cls=OVSKernelSwitch)
info( '*** Add hosts\n')
h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None,cpu=50)
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(h1, s1)
net.addLink(s1, h3)
net.addLink(s1, s2)
net.addLink(s2, h2)
net.addLink(s2, h4)
net.addLink(h1, s1, bw=10, delay='5ms', max_queue_size=100, loss=50, use_htb=True)
info( '*** Starting network\n')
net.build()
info( '*** Starting controllers\n')
for controller in net.controllers:
controller.start()
info( '*** Starting switches\n')
net.get('s1').start([c0])
net.get('s2').start([c0])
info( '*** Post configure switches and hosts\n')
CLI(net)
net.stop()
if __name__ == '__main__':
setLogLevel( 'info' )
myNetwork()

2.進階要求
#!/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.node import RemoteController,CPULimitedHost
from mininet.util import dumpNodeConnections
from mininet.link import TCLink
from mininet.net import Mininet
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
for i in range( L1 ):
sw = self.addSwitch( 's{}'.format( i + 1 ) )
c.append( sw )
# add aggregation ovs
for i in range( L2 ):
sw = self.addSwitch( 's{}'.format( L1 + i + 1 ) )
a.append( sw ) #在列表末尾追加新的sw對象
# add edge ovs
for i in range( L3 ):
sw = self.addSwitch( 's{}'.format( L1 + L2 + i + 1 ) )
e.append( sw )
# add links core aggregation ovs
for i in range( L1 ):
sw1 = c[i]
for sw2 in a[i//2::L1//2]:#整除用//
self.addLink( sw2, sw1 )
# add links aggregation edge ovs
for i in range( 0, L2, 2 ):
for sw1 in a[i:i+2]:
for sw2 in e[i*2:i*2+4]: #aggregation連4台edge
self.addLink( sw2, sw1 )
#add hosts edge 添加主機以及主機和邊緣交換機的鏈路
count = 1
for sw1 in e:
for i in range(2):
host = self.addHost( 'h{}'.format( count ) ,ip='10.0.0.{}'.format( count ),defaultRoute=None)
self.addLink( sw1, host )
count += 1
topos = { 'mytopo': ( lambda: MyTopo() ) }




3.個人總結
a)實驗感想
這次實驗的基礎部分難度不大,按照老師給的pdf教程來就可以完成。中間有遇到一些問題,經過網頁上的查找已將其解決。完成基礎實驗部分後,對mininet的相關操作有了進一步的了解,學會了用mininet的可視化工具來生成拓撲以及用mininet的命令行生成特定拓撲等方法。但在操作過程中,意識到了還有很多命令和零碎知識點是我不熟悉且還未掌握的,日後要加強這方面的學習和探索。在進階實驗部分,對python的掌握基礎不牢固,大部分是按照參考資料敲出來的,略微細節上進行了變動。排錯過程中認識到了編輯縮進格式之嚴謹。之前學過的Python知識大部分都忘記了,要抽空補上這部分的知識空缺。
b)實驗過程中問題及解決辦法
- 在對第一步保存的拓撲文件211802351.py修改後要保存時出錯。
E505: "211802351.py" is read-only (add ! to override)
這個是因為該文件許可權為只讀文件,所以不能直接對其進行修改。
解決方法:(1)用"sudo vi 文件名"進入文件修改介面進行修改(2)用"sudo chmod 777 文件名"將許可權修改為可讀可寫可執行 - 增加一台主機後僅增加了相應鏈路和主機的命令導致部分鏈路ping不通

解決方法:要在原來的交換機上配置新增埠命令以及新增的主機要為其配置ip地址 - 在為其配置ip地址的時候,一開始用的是以下命令

但後來發現,這樣配置會出現僅是h4獲得了IP地址,而未與網路溝通,結果是h4可以ping其他主機,其他主機不能ping通h4。
解決方法:如下圖,但還有些不理解為何此配置就可以pingall都行

- 由於python的格式縮進問題產生的出錯

解決方法:縮進格式要統一。要不都用tab鍵,要不都用空格,不能混用。 - 進階部分進行主機互ping時,發現ping不通

搜索資料後發現是應為該拓撲中存在太多環路,容易產生廣播風暴,所以要啟用抑制環路產生的stp生成樹協議,可以在執行命令的時候加上swtich的指定和屬性。
解決方法:生成拓撲使用此命令sudo mn --custom 211802351_fattree.py --topo mytopo --switch ovsbr,stp=1





