教學目的與學時建議
- 能夠運用 mininet 可視化工具創建計算機網絡拓撲結構
- 能夠運用 mininet 交互界面創建拓撲結構
- 能夠運用 python 腳本構建計算機網絡拓撲結構
- 建議:2 學時
實驗環境
- 下載并安裝虛擬機 VMware workstation;
- 下載虛擬機鏡像( SDNHub_tutorial_VM_64-bit[NEW](可直接導入 VMware).ova ),百度網盤下載鏈接?提取碼:mhfi
- 因為虛擬機鏡像是ova格式,所以只需要打開即可使用,無需創建新的虛擬機。
- 還有使用命令行、安裝包的方式來安裝,參考文章
技術與知識背景
1,什么是 Mininet?
- Mininet 是由一些虛擬的終端節點(end-hosts)、交換機、路由器連接而成的一個網絡仿真器,是一個輕量級軟件定義網絡和測試平臺;它采用輕量級的虛擬化技術使一個單一的系統看起來像一個完整的網絡運行想過的內核系統和用戶代碼,也可簡單理解為 SDN 網絡。
- 系統中的一種基于進程虛擬化平臺,它支持 OpenFlow、OpenvSwith 等各種協議,Mininet 也可以模擬一個完整的網絡主機、鏈接和交換機在同一臺計算機上且有助于互動開發、測試和演示,尤其是那些使用 OpenFlow 和 SDN 技術;同時也可將此進程虛擬化的平臺下代碼遷移到真實的環境中。
- Mininet 可以很方便地創建一個支持 SDN 的網絡:host 就像真實的電腦一樣工作,可以使用 ssh 登錄,啟動應用程序,程序可以向以太網端口發送數據包,數據包會被交換機、路由器接收并處理。有了這個網絡,就可以靈活地為網絡添加新的功能并進行相關測試,然后輕松部署到真實的硬件環境中。
?2,Mininet 的特性:
- 可以簡單、迅速地創建一個支持用戶自定義的網絡拓撲,縮短開發測試周期
- 可以運行真實的程序,在 Linux 上運行的程序基本上可以都可以在 Mininet 上運行,如 Wireshark
- Mininet 支持 Openflow,在 Mininet 上運行的代碼可以輕松移植到支持OpenFlow 的硬件設備上
- Mininet 可以在自己的電腦,或服務器,或虛擬機,或者云(例如 Amazon EC2)上運行
- Mininet 提供 python API,簡單易用
- Mininet 是開源項目
3,Mininet 部分命令
4,命令操作
- 終端輸入mn,可以創建一個簡單的網絡,創建完成之后,命令行變為mininet>
- Mininet>iperf <node id> <node id>—兩個節點之間的網絡性能測試
-
Mininet><node id> route—類似于Linux命令,用于定義節點路由表中的條目
- Mininet>help
-
Mininet>nodes
- Mininet>net
???????
-
Mininet>pingall
???????
-
Mininet>dump
???????
- Mininet>h1 ping h2
???????
- Mininet>h2 ifconfig
???????
-
Mininet>xterm h1
???????
- Mininet>exit
???????
- 更多操作命令
測試Mininet是否正常工作
- 要快速檢查它是否工作,請鍵入以下命令:
- 此命令將:
- 創建一個單一網絡,其中3臺主機以非交互模式連接到單個交換機。
- 執行從所有主機到所有其他主機的ping。
- 此命令使用默認的交換機與控制器。
sudo mn --test pingall --topo single,3
- ??????????????????命令講解
???????
創建拓撲
- 運用mininet可視化工具創建網絡拓撲結構
- 運用mininet命令行工具創建網絡拓撲結構
- 運用mininet交互界面創建網絡拓撲結構
- 運用python腳本構建網絡拓撲結構
- 參考博客
基本命令行參數 ——后面會用得到
- --topo—在mininet啟動時通過命令行定義拓撲
- --switch—定義要使用的交換機。默認情況下,使用ovsk軟件交換機
- --controller—定義要使用的控制器。如果未指定默認控制器,作為集線器使用
可視化工具創建拓撲
- 導入鏡像后,默認處在/home/ubuntu的位置,可以使用pwd來查看當前的路徑,動態調整。進入/home/ubuntu/mininet/examples文件夾,使用命令cd
- 使用命令sudo su,切換到root身份,執行python miniedit.py啟動可視化界面
- 按照下面的操作步驟和頁面布局進行操作
- 右鍵點擊圖標,選中preferences,對網絡拓撲結構進行相關配置,此處使用默認配置,即不進行任何操作。
- ?“Edit”→“Preferences”,勾選 strat CLI(允許通過交互界面對拓撲結構進行調整),選擇所支持 Openflow 協議版本。
- 保存為 python 文件,選擇“File”→“Export Level 2 Script”,起一個名字,在終端運行保存下來的 python 文件即可。
- 或者點擊左下角的run運行,如果需要停止,則點擊stop即可。
命令行創建拓撲
- 最小網絡,兩臺主機連接到一臺交換機。
- sudo mn –topo minimal
?
- 每個主機都連接到一個交換機,所有交換機都彼此連接。
- 在本例中,有4個主機和4個交換機。
- sudo mn --topo linear,4
- 下圖純屬虛構,請以實物為準
?
- 每個主機都連接到一個交換機。
- 在本例中,有3個主機和1個交換機。
- sudo mn --topo single,3
- 下圖純屬虛構,請以實物為準
?
- 具有定義深度和扇出的基于樹的拓撲。
- sudo mn --topo tree,depth=2,fanout=2
- 下圖純屬虛構,請以實物為準
?
交互式創建拓撲
啟動參數總結
- -h, --help??????? show this help message and exit
- --switch=SWITCH??????? [kernel user ovsk]
- --host=HOST??????? [process]
- --controller=CONTROLLER??????? [nox_dump none ref remote nox_pysw]
- --topo=TOPO??????? [tree reversed single linear minimal],arg1,arg2,...argN
- -c, --clean???????? clean and exit
- --custom=CUSTOM??????? read custom topo and node params from .py file
- --test=TEST??????? [cli build pingall pingpair iperf all iperfudp none]
- -x, --xterms??????? spawn xterms for each node
- --mac??????? set MACs equal to DPIDs
- --arp??????? set all-pairs ARP entries
- -v VERBOSITY, --verbosity=VERBOSITY??????? [info warning critical error debug output]
- --ip=IP??????? [ip address as a dotted decimal string for aremote controller]
- --port=PORT??????? [port integer for a listening remote controller]
- --innamespace??????? sw and ctrl in namespace?
- --listenport=LISTENPORT??????? [base port for passive switch listening controller]
- --nolistenport??????? don't use passive listening port
- --pre=PRE??????? [CLI script to run before tests]
- --post=POST????????? [CLI script to run after tests]
python 腳本定義拓撲
- 用 python 腳本創建與上述對應拓撲,創建完后的文件需要增加可執行權限chmod +x test.py,還是用sudo python test.py執行。
- --topo linear,4
-
操作:
- 新建名字為linear的python文件 touch linear.py
- 賦予權限 chmod +x linear.py
- 對文件進行寫入操作 vi linear.py
- 將下文的代碼復制黏貼到linear.py文件中,先按下i,進行輸入操作;鼠標右鍵,選擇黏貼代碼;按下Esc按鍵,同時按下shift和:按鍵,然后輸入wq保存代碼;*代碼里面不可以包含中文,否則會報錯,也可以添加# -*- coding: utf8 -*-改變編碼格式,解決代碼包含中文的問題
- 運行代碼 sudo python linear.py
- 查看輸出
-
代碼
from mininet.net import Mininet
from mininet.topo import LinearTopo
Linear4 = LinearTopo(k=4)
net = Mininet(topo=Linear4)
net.start()
net.pingAll()
net.stop()
-
實踐
?
- --topo single,3
- 操作:
- 新建名字為single的python文件 touch single.py
- 賦予權限 chmod +x single.py
- 對文件進行寫入操作 vi single.py
- 將下文的代碼復制黏貼到single.py文件中,先按下i,進行輸入操作;鼠標右鍵,選擇黏貼代碼;按下Esc按鍵,同時按下shift和:按鍵,然后輸入wq保存代碼;
- 運行代碼 sudo python single.py
- 查看輸出
- 代碼:
from mininet.net import Mininet
from mininet.topo import SingleSwitchTopo
Single3 = SingleSwitchTopo(k=3)
net = Mininet(topo=Single3)
net.start()
net.pingAll()
net.stop()
- 實踐
?
- --topo tree,depth=2,fanout=2
- 操作:
- 新建名字為tree的python文件 touch tree.py
- 賦予權限 chmod +x tree.py
- 對文件進行寫入操作 vi tree.py
- 將下文的代碼復制黏貼到tree.py文件中,先按下i,進行輸入操作;鼠標右鍵,選擇黏貼代碼;按下Esc按鍵,同時按下shift和:按鍵,然后輸入wq保存代碼;
- 運行代碼 sudo python tree.py
- 查看輸出
- 代碼:
from mininet.net import Mininet
from mininet.topolib import TreeTopo
Tree22 = TreeTopo(depth=2,fanout=2)
net = Mininet(topo=Tree22)
net.start()
net.pingAll()
net.stop()
- 實踐
?
- 對于性能的限制
- 操作:
- 新建名字為test的python文件 touch test.py
- 賦予權限 chmod +x test.py
- 對文件進行寫入操作 vi test.py
- 將下文的代碼復制黏貼到test.py文件中,先按下i,進行輸入操作;鼠標右鍵,選擇黏貼代碼;按下Esc按鍵,同時按下shift和:按鍵,然后輸入wq保存代碼;
- 運行代碼 sudo python test.py
- 查看輸出
- 講解:
除了可以通過Python腳本創建基本的拓撲以外,還能在此基礎上對性能進行限制。觀察下面給出的腳本文件,addHost()語法可以對主機cpu進行設置,以百分數的形式;addLink()語法可以設置帶寬bw、延遲delay、最大隊列的大小max_queue_size、損耗率loss。
- 代碼:
from mininet.net import Mininet
from mininet.node import CPULimitedHost
from mininet.link import TCLink
net = Mininet(host=CPULimitedHost, link=TCLink)
c0 = net.addController()
s0 = net.addSwitch('s0')
h0 = net.addHost('h0')
h1 = net.addHost('h1', cpu=0.5)
h2 = net.addHost('h1', cpu=0.5)
net.addLink(s0, h0, bw=10, delay='5ms',
max_queue_size=1000, loss=10, use_htb=True)
net.addLink(s0, h1)
net.addLink(s0, h2)
net.start()
net.pingAll()
net.stop()
- 實踐
??????????????