天天看點

Mininet – “懶惰”網絡研究者的福音 概述篇 實戰篇 總結篇

【摘要】在本系列前兩篇文章裡,我們分别介紹了軟體定義網絡的兩大利器——OpenFlow和Open vSwitch。不少研究者可能很有興趣嘗試一下,卻拿不出太多的時間。本文将介紹一套強大的輕量級網絡研究平台——mininet,通過它相信大家可以很好地感受到軟體定義網絡的魅力。

概述篇

作為研究者,你是否想過,在自己的個人筆記本上就可以搭建一套媲美真實硬體環境的複雜網絡,并輕松進行各項實驗?無論是用專業級的硬體實驗平台,還是用傳統的虛拟機,都顯得太過昂貴,且十分不友善進行操作。如果你有類似的需求,不妨試試mininet,絕對是“懶惰”卻又追求效率的研究人員的福音。 stanford大學Nick McKeown的研究小組基于Linux Container架構,開發出了這套程序虛拟化的平台。在mininet的幫助下,你可以輕易的在自己的筆記本上測試一個軟體定義網絡(software-defined Networks),對基于Openflow、Open vSwitch的各種協定等進行開發驗證,或者驗證自己的想法。最令人振奮的是,所有的代碼幾乎可以無縫遷移到真實的硬體環境中,學術界跟産業界再也不是那麼難以溝通了。想想吧,在實驗室裡,一行指令就可以建立一個支援SDN的任意拓撲的網絡結構,并可以靈活的進行相關測試,驗證了設計的正确後,又可以輕松部署到真實的硬體環境中。 mininet作為一個輕量級軟定義網絡研發和測試平台,其主要特性包括

  • 支援Openflow、OpenvSwitch等軟定義網絡部件
  • 友善多人協同開發
  • 支援系統級的還原測試
  • 支援複雜拓撲、自定義拓撲
  • 提供python API
  • 很好的硬體移植性(Linux相容),結果有更好的說服力
  • 高擴充性,支援超過4096台主機的網絡結構

實戰篇

擷取鏡像

官方網站已經提供了配置好相關環境的基于Debian Lenny的虛拟機鏡像,下載下傳位址為http://openflowswitch.org/downloads/OpenFlowTutorial-081910.vmware.zip,壓縮包大小為700M左右,解壓後大小為2.1G左右。虛拟機鏡像格式為vmware的vmdk,可以直接使用vmware workstation或者virtualbox等軟體打開。如果使用QEMU和KVM則需要先進行格式轉換。後面我們就以這個虛拟os環境為例,介紹mininet的相關功能。

登入鏡像

預設使用者名密碼均為openflow,建議通過本地利用ssh登入到虛拟機上使用(可以設定自動登入并将X重定向到本地),比較友善操作。

簡單測試

建立網絡

mininet的操作十分簡單,啟動一個小型測試網絡隻需要下面幾個步驟。 登入到虛拟機指令行界面,打開wireshark,使其背景運作, 指令為sudo wireshark & 啟動mininet,指令為sudo mn,則預設建立如下圖所示的網絡拓撲。

Mininet – “懶惰”網絡研究者的福音 概述篇 實戰篇 總結篇

此時進入以mininet>引導的指令行界面 好了,從現在開始,我們就擁有了一個1台控制節點(controller)、一台交換(switch)、兩台主機(host)的網絡,并且用wireshark進行觀測。下面進行幾項簡單的測試。

檢視資訊

檢視全部節點: mininet> nodes available nodes are: c0 h2 h3 s1 檢視鍊路資訊: mininet> net s1 <-> h2-eth0 h3-eth0 輸出各節點的資訊: mininet> dump c0: IP=127.0.0.1 intfs= pid=1679 s1: IP=None intfs=s1-eth1,s1-eth2 pid=1682 h2: IP=10.0.0.2 intfs=h2-eth0 pid=1680 h3: IP=10.0.0.3 intfs=h3-eth0 pid=1681 對節點進行單獨操作 如果想要對某個節點的虛拟機單獨進行指令操作,也十分簡單,格式為 node cmd。例如檢視交換機s1上的網絡資訊,我們隻需要在執行的ifconfig指令前加上s1主機标志即可,即 s1 ifconfig,同樣,如果我們想用ping 3個包的方法來測試h2跟h3之間連通情況,隻需要執行 h2 ping -c 3 h3 即可。得到的結果為 mininet> h2 ping -c 3 h3 PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data. 64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=7.19 ms 64 bytes from 10.0.0.3: icmp_seq=2 ttl=64 time=0.239 ms 64 bytes from 10.0.0.3: icmp_seq=3 ttl=64 time=0.136 ms — 10.0.0.3 ping statistics — 3 packets transmitted, 3 received, 0% packet loss, time 2006ms rtt min/avg/max/mdev = 0.136/2.523/7.194/3.303 ms 在本操作執行後,可以通過wireshark記錄檢視到建立新的流表項的過程,這也是造成第一個ping得到的結果偏大的原因。更簡單的全網絡互ping測試指令是pingall,會自動所有節點逐對進行ping連通測試。

常用功能

快捷測試

除了cli的互動方式之外,mininet還提供了更友善的自動執行的快捷測試方式,其格式為sudo mn –test cmd,即可自動啟動并執行cmd操作,完成後自動退出。 例如 sudo mn –test pingpair,可以直接對主機連通性進行測試,sudo mn –test iperf啟動後直接進行性能測試。用這種方式很友善直接得到實驗結果。

自定義拓撲

mininet提供了python api,可以用來友善的自定義拓撲結構,在mininet/custom目錄下給出了幾個例子。例如在topo-2sw-2host.py檔案中定義了一個mytopo,則可以通過–topo選項來指定使用這一拓撲,指令為 sudo mn –custom ~/mininet/custom/topo-2sw-2host.py –topo mytopo –test pingall

使用友好的mac編号

預設情況下,主機跟交換機啟動後配置設定的MAC位址是随機的,這在某些情況下不友善查找問題。可以使用–mac選項,這樣主機跟交換機配置設定到的MAC位址跟他們的ID是一緻的,容易通過MAC位址較快找到對應的節點。

使用XTerm

通過使用-x參數,mn在啟動後會在每個節點上自動打開一個XTerm,友善某些情況下的對多個節點分别進行操作。指令為 sudo mn -x 在進入mn cli之後,也可以使用 xterm node 指令指定啟動某些節點上的xterm,例如分别啟用s1跟h2上的xterm,可以用 xterm s1 h2

鍊路操作

在mn cli中,使用link指令,禁用或啟用某條鍊路,格式為 link node1 node2 up/down,例如臨時禁用s1跟h2之間的鍊路,可以用 link s1 h2 down

名字空間

預設情況下,主機節點有用獨立的名字空間(namespace),而控制節點跟交換節點都在根名字空間(root namespace)中。如果想要讓所有節點擁有各自的名字空間,需要添加 –innamespace 參數,即啟動方式為 sudo mn –innamespace

其他操作

執行sudo mn -c會進行清理配置操作,适合故障後恢複。

總結篇

除了使用mn指令進行互動式操作以外,mininet最為強大之處是提供api可以直接通過python程式設計進行靈活的網絡實驗。在mininet/example目錄下給出了幾個python程式的例子,包括使用gui方式建立拓撲、運作多個測試,在節點上運作sshd,建立多個節點的tree結構網絡等等。運作這些程式就可以得到令人信服的結果,而且這些程式大都十分短小,展現了mininet平台的強大易用性。 另外,限于篇幅,本文僅對mininet做了較簡略的介紹,更全面的版本可以從這裡找到。此外,也建議有興趣做深入研究的朋友通過閱讀參考文獻,進一步了解更多有趣内容。 參考 <1> A Network in a Laptop : Rapid Prototyping for Software-Defined Networks, Bob Lantz,  Brandon Heller, Nick Mckeown, ACM Hotnets 2010; <2> http://www.openflowswitch.org/foswiki/bin/view/OpenFlow/Mininet