官方文檔:http://mininet.org/walkthrough/
翻譯的官方文檔:https://segmentfault.com/a/1190000000669218
ovs-ofctl相關指令:http://blog.csdn.net/rocson001/article/details/73163041
sudo mn --topo-single,3 --mac --switch-ovsk --controller-remote, ip = 192.168.56.1
運行mininet並創建一個簡單的topo(1個switch,3個host);創建的host擁有的mac地址相當於獨立的IP,OpenFlow switch擁有3個端口;創建的switch連接到remote控制器上。
mininet>
1)nodes 查看mininet中節點的狀態
2)help 獲取幫助列表
3)h1 ifconfig 查看host1的IP等信息
4)xterm h1 打開host1的終端
5)exit 退出mininet登錄
6)iperf h1 h2 測試h1和h2之間的帶寬,用TCP
7)net 顯示link狀態
8)h1 ping -c 4 h2 檢查兩個主機間的連通狀態
解釋:該命令只會ping 4次,在命令中出現代表主機的字符串時,即上面的h2,該節點名稱會被其ip地址替代。上面的ping命令能讓我們看到Openflow控制流量。主機h1請求h2的MAC地址的ARP數據包,觸發了上傳控制器的packet_in消息。然后控制器將packet_out消息洪泛到其他交換機端口(這里只有和h2相連的端口),主機h2發現ARP請求進行回復。回復同樣上交控制器,控制器將其發送給h1並下發一條流表項。如下圖的一次完整通信:

現在h1就知道h2的mac地址,並且能ping通了,此時再ping,發現耗時更短。因為交換機中已經有轉發icmp流量的流表項了,所以之后的ping都不會產生控制流量(即發給控制器的),icmp包直接通過交換機流表項快速轉發出去。
9)dump 輸出各節點信息
10)iperfudp 測試帶寬,用UDP
11)dpctl 相關命令
1.dpctl dump-flows 查看topo中的所有流表
2.s1 dpctl dump-flows tcp:127.0.0.1:6634/6654 如果topo只有一個交換機可以執行這個命令,查看屬於s1交換機的流表項【如果在虛擬機跑floodlight就是6654,如果在物理機跑floodlight,需要在建topo時加上listenPort=6654,即
,這樣就可以正常執行這個命令和下一個命令,且端口號是在交換機個數的基礎上疊加的】
例子如下:

【dpctl 【命令】,mininet會對每個交換機執行【命令】,發現上圖s1並沒有對某一個ip+port進行綁定】
3.s1 dpctl add-flow tcp:127.0.0.1:6634/6654 in_port=1,actions=output:2 如果topo只有一個交換機可以執行這個命令,在s1交換機上添加流表項
4.dpctl add-flow in_port=1,actions=output:2 給topo中的所有交換機都添加這個流表項
如果topo中有多個交換機應該執行如下命令做相應操作:
1.在非mininet終端下,執行命令:sudo ovs-ofctl dump-flows s2:查看s2交換機的流表項
2.在非mininet終端下,執行命令:sudo ovs-ofctl add-flow s1 in_port=2,actions=output:1 :給s1交換機添加流表項
流表信息如下: 
12)link s1 s2 down 斷開s1和s2之間的鏈路,此操作后會使經過s1和s2鏈路的主機ping不通,而連在同一個交換機上的主機可以ping通
13)link s1 s2 up 連接s1和s2之間的鏈路
14)sudo mn -c 在非mininet終端下,執行該命令,可以clear上一次退出topo所遺留的文件。在一次exit后,必須執行該命令,否則會導致topo創建不成功。
sudo mn --switch ovs --controller ref --topo tree,depth=2,fanout=8 ---test pingall 指定遠程控制器:【--controller=remote,ip=192.168.199.12,port=6653】
創建一個樹形拓撲,2層,9個交換機,1個核心交換機+8個接入層交換機(星型拓撲),64個主機(每個接入層交換機連8台主機)。
ovs表示用的是Open vSwitch交換機,ref表示用的是Openflow/Stanford reference controller(估計是mininet自帶的)。最后用pingall測試了一下,很耗時,並且pingall結束后,命令行都沒有出來網絡就直接關閉了。
mn命令代表的sh文件,路徑為mininet/bin/mn。文件語言格式確實就是python(#!/usr/bin/env python,多了個env),但好像沒有py后綴?並且mn命令並沒有用到python來編譯(即並不是sudo python mn),這就不太懂了。查了一下,關鍵是python頭部中env的區別,解釋。
如果最后面不加--test pingall,運行后就會進入命令行mininet>模式,而不是pingall結束后就直接將網絡關閉了。
$ sudo mn --test pingall --topo single,3 拓撲:一個交換機連3主機。測試連通性后關閉網絡。 $ sudo mn --test pingall --topo linear,4 拓撲:線性的4交換機4主機,即交換機一條線,每個交換機只連一個主機。 $ sudo mn --test pingall --topo tree,depth=2,fanout=2 拓撲:3個交換機4個主機,構成兩層的樹形結構。
簡單的開啟web服務器和客戶端相關的命令:
mininet>【這里輸命令會由mn處理】 (1) mininet> h1 ping h2 (2) mininet> h2 python –m SimpleHTTPServer 80 >&/tmp/http.log & (3) mininet> h1 wget –O – h2
(4) mininet> h2 kill %python
(1)h1指明發起命令的主機,后面是具體命令,相當於打開了h1的一個虛擬終端,在其中執行h1后面的命令。
(2)表示打開h2的終端,執行一個啟動簡單python服務器(http)的命令。80表示h2開啟的端口號(http),后面看不懂的一串,大概是將日志寫到指定文件,這樣就不會占用cli終端了(解釋:一般執行啟動http服務器的python命令后,cli終端會被日志信息占用,此時無法輸入其他命令,而有了后面一串,該命令就像是在后台運行,可以繼續輸其他命令)。
(3)在(2)服務器開啟的情況下,向h2請求wget(一般用來文件下載)。該命令就是將h2打開的http服務器下的index頁面下載下來了。執行結果如下:(10.0.0.2是h2的ip地址。)

(4)h2關閉服務器。
