基于OpenDayLight的SDN網(wǎng)絡(luò)轉(zhuǎn)發(fā)機(jī)制研究
SDN無(wú)疑是當(dāng)前網(wǎng)絡(luò)業(yè)界最熱門的研究課題之一,SDN體現(xiàn)了控制和轉(zhuǎn)發(fā)相分離的原則,為網(wǎng)絡(luò)和業(yè)務(wù)的創(chuàng)新帶來(lái)了蓬勃的生機(jī)和活力。本文通過(guò)構(gòu)建OpenDayLight控制器與Mininet交換模擬器相結(jié)合的測(cè)試環(huán)境,研究了SDN環(huán)境下二/三層網(wǎng)絡(luò)交換的轉(zhuǎn)發(fā)機(jī)制和特性,并對(duì)SDN在網(wǎng)絡(luò)中的應(yīng)用提出了設(shè)想。
一.SDN實(shí)驗(yàn)環(huán)境的選擇和建立
軟件定義網(wǎng)絡(luò)(Software Defined Network, SDN)最早由斯坦福大學(xué)clean slate研究組提出。SDN的核心是控制與承載相分離,實(shí)現(xiàn)網(wǎng)絡(luò)開(kāi)放,使流量可以被靈活控制,從而為上層的業(yè)務(wù)和應(yīng)用提供更優(yōu)化的服務(wù)。SDN的概念提出后,迅速得到了各方面的響應(yīng),在IT界、網(wǎng)絡(luò)屆掀起了一股熱潮。2010年,開(kāi)放網(wǎng)絡(luò)基金會(huì)ONF成立,ONF致力于開(kāi)發(fā)OpenFlow協(xié)議,以規(guī)范控制器與交換機(jī)之間南向接口標(biāo)準(zhǔn)化,目前最新發(fā)布的版本為1.4。
在控制器方面,借鑒在IT和互聯(lián)網(wǎng)上的成功經(jīng)驗(yàn),開(kāi)源成為一股不可抵擋的趨勢(shì)。NOX,POX,F(xiàn)loodlight等均采用公開(kāi)源代碼的形式,任何人都可以學(xué)習(xí)SDN,只要有相應(yīng)的IT編程能力,都可以為SDN的控制器的完善做出貢獻(xiàn)。各大設(shè)備廠商也正視SDN的挑戰(zhàn),2013年4月IBM、Cisco、微軟、NEC、Juniper、BigSwitch(后退出)等多家IT巨頭合作啟動(dòng)了OpenDayLight項(xiàng)目。OpenDayLight采用JAVA開(kāi)發(fā),是一套開(kāi)源的SDN框架。其初期版本已經(jīng)發(fā)布,本次實(shí)驗(yàn)使用的就是這個(gè)版本。該版本支持簡(jiǎn)單轉(zhuǎn)發(fā)應(yīng)用(Simple Forwarding),可以支持二/三層轉(zhuǎn)發(fā)。
光有控制器還不能構(gòu)成完整SDN網(wǎng),但當(dāng)前硬件SDN交換機(jī)還很少,也很難找到。幸好有Mininet推出了基于軟件模擬的交換機(jī)。Mininet項(xiàng)目也是開(kāi)源的軟件,通過(guò)Mininet,在一臺(tái)Linux主機(jī)內(nèi)可以構(gòu)造并模擬多臺(tái)SDN交換機(jī)和終端。使用Python腳本,使用者還可以配置較為復(fù)雜的SDN網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。同時(shí)Mininet還配備了WireShark抓包軟件,方便SDN開(kāi)發(fā)者和學(xué)習(xí)者進(jìn)行開(kāi)發(fā)和研究。
二.OpenDayLight SDN二/三層轉(zhuǎn)發(fā)機(jī)制分析
1)創(chuàng)建和啟動(dòng)SDN網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)
在測(cè)試中我們創(chuàng)建了如下的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),1臺(tái)OpenDayLight控制器(簡(jiǎn)稱Controller,版本為0.1版),2臺(tái)交換機(jī)(SW),每臺(tái)SW分別連接2臺(tái)主機(jī)(Host),一共4臺(tái)主機(jī),這些主機(jī)分屬于2個(gè)不同的網(wǎng)段,交換機(jī)與控制器之間采用OpenFlow協(xié)議(簡(jiǎn)稱OF)。拓?fù)浣Y(jié)構(gòu)如圖所示:
圖1:測(cè)試拓?fù)浣Y(jié)構(gòu)
首先在測(cè)試機(jī)(Windows XP系統(tǒng))上安裝和運(yùn)行OpenDayliht(具體可參考https://wiki.opendaylight.org/view/OpenDaylight_Controller:Installation),然后在VirtualBox[4]中載入Mininet虛擬機(jī)映像并運(yùn)行(具體可參考http://mininet.org/download/)。測(cè)試網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)由Python腳本生成,可將配置文件保存于虛擬機(jī)/mnt/shared目錄下的topo2_2.py文件內(nèi):
啟動(dòng)測(cè)試環(huán)境,使用以下命令生成測(cè)試拓?fù)浣Y(jié)構(gòu): sudo mn –custom /mnt/shared/topo2_2.py –topo mytopo,–controller=remote ip=192.168.56.1。
通過(guò)啟動(dòng)抓包軟件WireShark可以看到SW向Controller的注冊(cè)過(guò)程。在注冊(cè)過(guò)程中,Controller會(huì)要求SW提供OpenFlow版本號(hào),設(shè)備連接的端口等狀態(tài)等信息。如圖所示:SW1將自己所連接的4個(gè)端口情況上報(bào)給Controller(其中包括與Controller相連的端口),同樣SW2也會(huì)上報(bào)自己的狀態(tài)。
圖2:SW通過(guò)OF:Stats Relay向Controller上報(bào)自身的狀態(tài)和接口
當(dāng)SW 設(shè)備完成設(shè)備注冊(cè)后,Controller將進(jìn)行網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)的發(fā)現(xiàn)或更新。當(dāng)網(wǎng)絡(luò)中有一臺(tái)新的SW接入后,Controller通過(guò)OF Packet Out 指令要求SW1在其所有端口上發(fā)出LLDP(Link Layer Discovery Protocol,EEE802.1ab)鏈路探測(cè)包。LLDP的源MAC為Controller分配,這里為00:00:00:00:00:01(對(duì)每一個(gè)交換機(jī),Controller都會(huì)分配一個(gè)這樣的MAC作為SW標(biāo)識(shí)),LLDP目的MAC地址為組播地址。相鄰的SW2將接收到LLDP,SW2由于無(wú)法識(shí)別這條流,會(huì)將OF協(xié)議再發(fā)到Controller上。通過(guò)LLDP的發(fā)送和接收,Controller可計(jì)算出交換機(jī)之間的拓?fù)潢P(guān)系,網(wǎng)絡(luò)的拓?fù)潢P(guān)系可作為轉(zhuǎn)發(fā)流表生成和實(shí)現(xiàn)網(wǎng)絡(luò)可視化的基礎(chǔ)。(注:與交換機(jī)SW相鄰的主機(jī)也會(huì)收到LLDP,但并不會(huì)處理)
圖3:基于LLDP探測(cè)的網(wǎng)絡(luò)拓?fù)浒l(fā)現(xiàn)與計(jì)算
2)SDN網(wǎng)絡(luò)二轉(zhuǎn)發(fā)機(jī)制
生成網(wǎng)絡(luò)拓?fù)浜螅€要在Controller上為每一個(gè)三層網(wǎng)段設(shè)置一個(gè)網(wǎng)關(guān)地址(即使是二層轉(zhuǎn)發(fā)也必須設(shè)置),然后將交換機(jī)的接口與三層網(wǎng)關(guān)相關(guān)聯(lián)。這里將SW1的2號(hào)(連接h1)和SW3的2號(hào)口(連接h2)分別與網(wǎng)關(guān)10.0.0.254關(guān)聯(lián),將SW1的3號(hào)(連接h3)和SW3的3號(hào)口(連接h4)分別與網(wǎng)關(guān)20.0.0.254關(guān)聯(lián)。這一過(guò)程好比在SDN內(nèi)劃分了不的三層網(wǎng)段,并將設(shè)備物理接口與三層對(duì)應(yīng),類似為以太網(wǎng)劃分VLAN和增加三層虛接口的過(guò)程。
圖4:在OpenDayLight Web界面將交換機(jī)的端口與三層網(wǎng)關(guān)相關(guān)聯(lián)
然后對(duì)各個(gè)Host的主機(jī)IP地址、子網(wǎng)掩碼和默認(rèn)網(wǎng)關(guān)進(jìn)行逐一設(shè)置,在Mininet提示符mininet>下如下設(shè)置:
接著讓Host1 PING Host2,輸入h1 ping h2,同時(shí)使用抓包軟件可得到如下的過(guò)程:
圖5:OpenDayLight SDN二層轉(zhuǎn)發(fā)機(jī)制圖解
在SDN網(wǎng)絡(luò)中,處于末端的主機(jī)Host并不會(huì)知道其連接的網(wǎng)絡(luò)是SDN,某臺(tái)主機(jī)要發(fā)送數(shù)據(jù)包到另一臺(tái)主機(jī),仍然需要進(jìn)行IP到MAC地址的ARP解析。但SDN的處理機(jī)制與普通二層以太交換機(jī)洪泛+MAC地址學(xué)習(xí)機(jī)制存在卻存在很大的差異,其過(guò)程如下:
當(dāng)源主機(jī)h1(10.0.0.1)發(fā)出ARP解析h2(10.0.0.2)后,交換機(jī)SW1并不知道如何轉(zhuǎn)發(fā)該包,因此將其通過(guò)OF消息發(fā)送到Controller處理。
Controller發(fā)現(xiàn)這個(gè)ARP消息是h1(10,0,0.1)發(fā)出,它也同時(shí)得到了h1的位置信息(OF包中會(huì)指出是哪個(gè)交換機(jī)的哪個(gè)端口發(fā)出了數(shù)據(jù)包)。此時(shí)Controller可以計(jì)算網(wǎng)絡(luò)拓?fù)洌玫饺W(wǎng)各節(jié)點(diǎn)到10.0.0.1的轉(zhuǎn)發(fā)路徑,并將轉(zhuǎn)發(fā)流表通過(guò)OF Flow Modify消息推送到每一臺(tái)交換機(jī)上。
由于收到了ARP,Controller會(huì)要求每一臺(tái)SW所對(duì)應(yīng)10.0.0.0/8網(wǎng)段的非SW互聯(lián)端口(只有這些端口是連接主機(jī)或傳統(tǒng)網(wǎng)絡(luò)的)發(fā)出ARP來(lái)請(qǐng)求10.0.0.2的MAC地址。這里Controller并不是簡(jiǎn)單的將收到ARP原封不動(dòng)的發(fā)出,而是將源IP改為10.0.0.254,也就是前面我們?cè)贑ontroller上配置的網(wǎng)關(guān)IP地址,然后發(fā)出。
只有h3(10.0.0.2)才會(huì)響應(yīng)ARP,它將ARP Response發(fā)送到SW2。SW2也不知道如何處理,因此將ARP封裝在OF協(xié)議中發(fā)送到Controller。Controller發(fā)現(xiàn)這是ARP響應(yīng),而之前正是10.0.0.1發(fā)送的ARP請(qǐng)求,因此它會(huì)將該ARP通過(guò)OF協(xié)議發(fā)到SW1,同時(shí)指示SW1將其送出的端口(也就是h1對(duì)應(yīng)的端口)。SW1執(zhí)行這一操作。
Controller在收到h3的ARP后也得知了10.0.0.2的位置,它根據(jù)網(wǎng)絡(luò)拓?fù)溆?jì)算,可以得到全網(wǎng)到達(dá)10.0.0.2的轉(zhuǎn)發(fā)路徑,并將流表通過(guò)OF Flow Modify消息推送到每一臺(tái)交換機(jī)上。
h1 收到ARP Response后完成ARP解析過(guò)程,然后它構(gòu)造ICMG PING Request數(shù)據(jù)包,其中源和目MAC分別為h1和h2的MAC,源和目IP分別為h1和h2的IP。由于SW1和SW2都已經(jīng)成功的裝載了到h2(10.0.0.2)的流表,因此該數(shù)據(jù)包將被順利發(fā)送到h2。
h2發(fā)現(xiàn)是ICMP PING Request,源是h1,但是此時(shí)它尚未有h1的MAC,于是還要進(jìn)行一次ARP解析,SW2再次將ARP發(fā)送Controller,Controller已經(jīng)得知h1的MAC,可直接響應(yīng),并通過(guò)OF向SW2返回ARP結(jié)果和所需要送出的端口(h2接入的端口)。
h2學(xué)到ARP后,即可構(gòu)造ICMP Response包,發(fā)送到SW2,SW2根據(jù)h1目的地址匹配轉(zhuǎn)發(fā)表將其轉(zhuǎn)發(fā)到SW1,SW1根據(jù)h1目的地址匹配轉(zhuǎn)發(fā)表將其發(fā)送到h1對(duì)應(yīng)的端口。h1到h2的雙向通道至此完全打通。
3)SDN網(wǎng)絡(luò)三層轉(zhuǎn)發(fā)機(jī)制
在分析完二層轉(zhuǎn)發(fā)機(jī)制后,我們重新啟動(dòng)拓?fù)浣Y(jié)構(gòu),回到初始狀態(tài)(交換機(jī)上無(wú)任何流表),測(cè)試一下SDN如何實(shí)現(xiàn)兩個(gè)不同網(wǎng)段主機(jī)之間的轉(zhuǎn)發(fā)。輸入h1 ping h4,同時(shí)使用WireShark抓包,可發(fā)現(xiàn)如下結(jié)果:
對(duì)于三層轉(zhuǎn)發(fā),主機(jī)首先判斷目的IP與自己不在同一網(wǎng)段內(nèi),因此要將數(shù)據(jù)包發(fā)向默認(rèn)網(wǎng)關(guān),在此之前它必須解析網(wǎng)關(guān)的MAC。h1發(fā)出 ARP,請(qǐng)求網(wǎng)關(guān)10.0.0.254的MAC。SW1不知道如何處理,將其通過(guò)OF協(xié)議發(fā)送到Controller。
Controller上配置了網(wǎng)關(guān)地址10.0.0.254,它即以自己的MAC地址回應(yīng)ARP,并指示SW1將ARP響應(yīng)發(fā)送到與h1相連的接口。同時(shí)Controller也知道了h1的存在,通過(guò)路徑計(jì)算,得到每一臺(tái)交換機(jī)去往10.0.0.1的路徑,并通過(guò)OF Flow Modify將流表推送到每一臺(tái)交換機(jī)上。
主機(jī)h1收到網(wǎng)關(guān)的ARP,它構(gòu)造ICMP PING Request數(shù)據(jù)包,其中源和目MAC分別為h1和網(wǎng)關(guān)10.0.0.254的MAC,源和目IP分別為h1和h4的IP,此包發(fā)向SW1。
SW1上并沒(méi)有到達(dá)20.0.0.2的流表,因此將緩存這個(gè)數(shù)據(jù)包。同時(shí)SW1則也會(huì)將該包通過(guò)OF協(xié)議發(fā)送到Controller,Controlller發(fā)現(xiàn)該包是要去向20.0.0.2,而此目的主機(jī)位置未知。因此Controller會(huì)要求每一臺(tái)SW的對(duì)應(yīng)20.0.0.0/8網(wǎng)段的非SW互聯(lián)端口發(fā)出ARP來(lái)請(qǐng)求20.0.0.2的MAC地址,其中ARP的源IP為20.0.0.0/8的網(wǎng)關(guān)地址20.0.0.254。
只有h4(20.0.0.2)才會(huì)響應(yīng)ARP,它將ARP Response發(fā)送到SW2。SW2不知道如何處理,因此將ARP封裝在OF協(xié)議中發(fā)送到Controller。Controller接到這個(gè)ARP響應(yīng),也同時(shí)得到了h4的位置是處于SW2的某一端口之下。Controller通過(guò)路徑計(jì)算,得到每一臺(tái)交換機(jī)去往20.0.0.2的流表,并通過(guò)OF Flow Modify消息推流表到每一臺(tái)交換機(jī)上。
SW1在裝載流表后可向正確的接口上轉(zhuǎn)發(fā)之前緩存的ICMP數(shù)據(jù)包,當(dāng)然SW2也可順利轉(zhuǎn)發(fā)。SW2還會(huì)該ICMP包的目的MAC地址修改為h4的MAC,以確保主機(jī)正確接收(之前Controller下發(fā)的目的地址10.0.0.1流表中已指出這個(gè)操作)。
圖6:對(duì)20.0.0.2目的地址的流表下發(fā)
注:對(duì)與主機(jī)相鄰的交換機(jī)SW不僅要指該主機(jī)所對(duì)應(yīng)流的出端口,還需要對(duì)目的MAC地址進(jìn)行改寫以匹配主機(jī)MAC,因此下發(fā)的流表內(nèi)有2個(gè)動(dòng)作(Action),對(duì)于二層轉(zhuǎn)發(fā)亦然
此時(shí)h4會(huì)收到ICMP Request,它發(fā)現(xiàn)是不同網(wǎng)段主機(jī)發(fā)出的ICMP請(qǐng)求,因此仍要通過(guò)ARP解析出自己的默認(rèn)網(wǎng)關(guān)。此請(qǐng)求發(fā)送到SW2后仍要通過(guò)OF協(xié)議轉(zhuǎn)發(fā)到Controller,Controller用自己的MAC進(jìn)行響應(yīng),然后通過(guò)OF協(xié)議發(fā)往SW2,并最終發(fā)送到h4。
主機(jī)h4收到ARP后可構(gòu)造ICMP PING Response,其中源和目MAC分別為h4和網(wǎng)關(guān)20.0.0.254的MAC,源和目IP分別為h4和h1的IP。此包發(fā)向SW2,然后經(jīng)過(guò)SW1,同樣SW1在將其轉(zhuǎn)發(fā)到目的端口前會(huì)將目的MAC地址修改為h1的MAC。之后h1和h4之間的通道被完全打通。
圖7:OpenDayLight SDN三層轉(zhuǎn)發(fā)機(jī)制圖解
當(dāng)網(wǎng)絡(luò)的所有主機(jī)都完成一次的通信后,SDN控制器就感知了所有網(wǎng)絡(luò)節(jié)點(diǎn)的狀態(tài)。通過(guò)控制器提供的界面,可以看到網(wǎng)絡(luò)的可視化視圖(http://192.168.56.1:8080),與我們之前給出的網(wǎng)絡(luò)拓?fù)渫耆恢?
圖8:SDN的網(wǎng)絡(luò)拓?fù)?,由OpenDayLight SDN控制界面繪出
讓我們觀察一下各交換機(jī)上的流表,可見(jiàn)每個(gè)交換機(jī)裝載了正確的流表。隨后SW將定期向Controller匯報(bào)流的狀態(tài),如匹配流的數(shù)量,轉(zhuǎn)發(fā)的字節(jié)數(shù)量、生存時(shí)間等。這些流和它們的狀態(tài)在OpenDayLight的控制臺(tái)上都可以看到:
SDN內(nèi)網(wǎng)絡(luò)交換機(jī)的轉(zhuǎn)發(fā)流表
4)特殊網(wǎng)絡(luò)結(jié)構(gòu)下SDN的轉(zhuǎn)發(fā)能力分析
在傳統(tǒng)的以太網(wǎng)中,是不能存在環(huán)路的,即使有環(huán)路,網(wǎng)絡(luò)設(shè)備也將通過(guò)生成樹(shù)協(xié)議Spanning Tree進(jìn)行屏蔽。OpenDayLight控制器具有網(wǎng)絡(luò)拓?fù)涞陌l(fā)現(xiàn)功能,在其算法中也能避免環(huán)路的產(chǎn)生(使用的是最短路徑優(yōu)先算法,但在測(cè)試中仍無(wú)法支持等價(jià)路徑負(fù)載均衡)。
如圖在測(cè)試中構(gòu)建了5臺(tái)交換機(jī)(SW1-SW5)和5臺(tái)主機(jī)(h1-h5),連成環(huán)形拓?fù)?。通過(guò)測(cè)試表明,主機(jī)之間流量轉(zhuǎn)發(fā)正常,并沒(méi)有廣播風(fēng)暴和環(huán)路出現(xiàn),查看各交換機(jī)的流表,均顯示到目的地址采用的是最短路徑。

圖9:OpenDayLight SDN支持有環(huán)路的二層網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)
此外,OpenDayLight控制下的SDN網(wǎng)絡(luò)還可支持以靜態(tài)路由方式與外部網(wǎng)絡(luò)互通,但由于本次測(cè)試是基于軟件交換機(jī)的模擬,因此無(wú)法測(cè)試該功能。
三、總結(jié)
基于對(duì)OpenDayLight控制下SDN網(wǎng)絡(luò)轉(zhuǎn)發(fā)行為分析可以看到:
OpenDayLight的簡(jiǎn)單轉(zhuǎn)發(fā)功能以整網(wǎng)的拓?fù)浣Y(jié)構(gòu)為基礎(chǔ),Controller通過(guò)處理主機(jī)之間、主機(jī)與網(wǎng)關(guān)之間的ARP報(bào)文來(lái)獲得每一臺(tái)主機(jī)的位置,并采用最短路徑優(yōu)先算法計(jì)算到達(dá)目的主機(jī)的流表,并下發(fā)到網(wǎng)絡(luò)內(nèi)的各個(gè)交換機(jī)上。
在OpenDayLight的簡(jiǎn)單轉(zhuǎn)發(fā)功能中,流僅僅基于目的IP地址進(jìn)行配,而不是所有的5元組字段以及優(yōu)先級(jí)字段(當(dāng)然也可以選擇5元組),這點(diǎn)更貼近傳統(tǒng)三層設(shè)備,可以大大減小了流表的規(guī)模,更為貼近實(shí)際生產(chǎn)環(huán)境。
OpenDayLight不僅可以支持二層轉(zhuǎn)發(fā)還可支持三層轉(zhuǎn)發(fā),避免了環(huán)路和廣播風(fēng)暴,優(yōu)于目前其它類型開(kāi)源SDN控制器所能提供的轉(zhuǎn)發(fā)功能。
OpenDayLight實(shí)現(xiàn)了控制和承載相分離,網(wǎng)絡(luò)上已經(jīng)沒(méi)有二/三層設(shè)備之分,網(wǎng)絡(luò)充分扁平化。因此在同一SDN內(nèi),理論上可以在允許的地址范圍內(nèi)為主機(jī)分配任意可用的IP地址。這種做法解除了主機(jī)位置與IP網(wǎng)段物理位置的緊耦合(有點(diǎn)類似LISP,Location-ID Separation Protocol),避免了IP地址段的碎片不能得到利用的尷尬。同時(shí)交換機(jī)與交換機(jī)之間也無(wú)需配置大量互聯(lián)IP地址,又節(jié)約了地址空間。
OpenDayLight支持與外部非SDN網(wǎng)絡(luò)的二/三層互通。
綜上所述,OpenDayLight的基本版已經(jīng)實(shí)現(xiàn)了傳統(tǒng)二/三層交換機(jī)的基本轉(zhuǎn)發(fā)功能,并支持任意網(wǎng)絡(luò)拓?fù)浜妥顑?yōu)路徑轉(zhuǎn)發(fā),達(dá)到了實(shí)用階段。2013年年底,OpenDayLight的完整版本將發(fā)布,屆時(shí)將提供更好的多租戶支持(Tenant),更好的網(wǎng)絡(luò)可視化(Network Virtualization)能力,實(shí)現(xiàn)LISP、BGP、Firewall等網(wǎng)絡(luò)應(yīng)用,成為一款控制能力足以與傳統(tǒng)網(wǎng)絡(luò)設(shè)備匹敵的SDN控制器。
未來(lái)網(wǎng)絡(luò)軟件化的趨勢(shì)將不可阻擋,SDN將在支持?jǐn)?shù)據(jù)中心虛擬化、城域網(wǎng)二/三層轉(zhuǎn)發(fā)和VPN、網(wǎng)絡(luò)安全和流量清洗方面大放異彩。