姚 正,魯 兵
傳統(tǒng)的IP網(wǎng)絡(luò)是為實(shí)現(xiàn)端到端的數(shù)據(jù)傳輸而設(shè)計(jì)的[1],IP數(shù)據(jù)包字段中包含源端主機(jī)的IP地址和目標(biāo)主機(jī)的IP地址,網(wǎng)絡(luò)流量基本都是通過TCP/IP協(xié)議傳輸.伴隨網(wǎng)絡(luò)技術(shù)和應(yīng)用業(yè)務(wù)的發(fā)展,數(shù)據(jù)流量呈突發(fā)式增長,應(yīng)用業(yè)務(wù)對(duì)網(wǎng)絡(luò)的服務(wù)質(zhì)量、可靠性、靈活性等提出了更高的要求,傳統(tǒng)網(wǎng)絡(luò)端到端連接和盡力而為的數(shù)據(jù)轉(zhuǎn)發(fā)網(wǎng)絡(luò)架構(gòu)難以實(shí)現(xiàn)新需求.網(wǎng)絡(luò)協(xié)議從最初的TCP/IP模型發(fā)展到現(xiàn)在的TCP/IP協(xié)議簇和各種補(bǔ)丁協(xié)議,網(wǎng)絡(luò)越來越復(fù)雜,但網(wǎng)絡(luò)的核心技術(shù)只有少數(shù)巨頭公司掌握,導(dǎo)致網(wǎng)絡(luò)架構(gòu)處于封閉狀態(tài),制約了新技術(shù)發(fā)展.軟件定義網(wǎng)絡(luò)是一種新型網(wǎng)絡(luò)架構(gòu)[2],它有兩個(gè)重要的屬性,一是控制轉(zhuǎn)發(fā)平面分離以實(shí)現(xiàn)集中式控制;二是網(wǎng)絡(luò)可編程實(shí)現(xiàn)靈活定義.SDN的開放可編程特性有利于打破巨頭生產(chǎn)商對(duì)設(shè)備、協(xié)議和技術(shù)的壟斷,促使網(wǎng)絡(luò)更加開放,滿足新業(yè)務(wù)和新應(yīng)用的需求.傳統(tǒng)交換式網(wǎng)絡(luò)中,交換機(jī)對(duì)數(shù)據(jù)包進(jìn)行解析,并根據(jù)MAC地址表對(duì)IP數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā);但在SDN網(wǎng)絡(luò)中,由于控制平面和轉(zhuǎn)發(fā)平面分離,控制器對(duì)數(shù)據(jù)包進(jìn)行解析生成轉(zhuǎn)發(fā)流表,將流表下發(fā)到交換機(jī),交換機(jī)根據(jù)轉(zhuǎn)發(fā)流表對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā).
為保障交換網(wǎng)絡(luò)的可靠性和轉(zhuǎn)發(fā)效率,在網(wǎng)絡(luò)中構(gòu)建冗余備份鏈路是一種有效方式,但冗余備份鏈路會(huì)產(chǎn)生網(wǎng)絡(luò)環(huán)路,網(wǎng)絡(luò)環(huán)路會(huì)引發(fā)廣播風(fēng)暴導(dǎo)致網(wǎng)絡(luò)癱瘓.為消除SDN交換網(wǎng)絡(luò)中環(huán)路帶來的廣播風(fēng)暴,本文通過對(duì)SDN交換網(wǎng)絡(luò)中的STP協(xié)議和RYU控制器進(jìn)行研究、設(shè)計(jì)、開發(fā)和實(shí)現(xiàn),構(gòu)建邏輯無環(huán)交換網(wǎng)絡(luò).并對(duì)STP協(xié)議在SDN中的應(yīng)用進(jìn)行了實(shí)驗(yàn)驗(yàn)證,結(jié)果表明,本文提出的設(shè)計(jì)和開發(fā)切實(shí)可行,能有效避免網(wǎng)絡(luò)環(huán)路引發(fā)的廣播風(fēng)暴,同時(shí)又提供了冗余備份鏈路,保障了網(wǎng)絡(luò)的可靠性.
SDN可以通過軟件編寫的方式靈活定義網(wǎng)絡(luò)設(shè)備的轉(zhuǎn)發(fā)功能,將網(wǎng)絡(luò)設(shè)備的控制平面和轉(zhuǎn)發(fā)平面分離,并將控制平面集中實(shí)現(xiàn)[3].這種新型網(wǎng)絡(luò)架構(gòu)的部署只需要在控制節(jié)點(diǎn)進(jìn)行集中的軟件升級(jí),即可實(shí)現(xiàn)快速、靈活且可靠的網(wǎng)絡(luò)部署,降低管理和配置的復(fù)雜性,提高網(wǎng)絡(luò)運(yùn)行效率;另外,SDN網(wǎng)絡(luò)架構(gòu)具備很強(qiáng)的開放性,用戶可以根據(jù)上層應(yīng)用實(shí)現(xiàn)個(gè)性化定制功能.SDN基本架構(gòu)如圖1所示.

圖1 SDN基本架構(gòu)
SDN轉(zhuǎn)發(fā)層由通用的網(wǎng)絡(luò)設(shè)備(SDN交換機(jī))組成,主要負(fù)責(zé)數(shù)據(jù)流量的轉(zhuǎn)發(fā);SDN控制層由SDN控制器組成,主要負(fù)責(zé)網(wǎng)絡(luò)拓?fù)浜途W(wǎng)絡(luò)設(shè)備的管理,并下發(fā)轉(zhuǎn)發(fā)策略給網(wǎng)絡(luò)設(shè)備;SDN應(yīng)用層由云管理平臺(tái)和SDN應(yīng)用組成,用戶通過應(yīng)用程序接口開發(fā)不同的應(yīng)用程序,對(duì)網(wǎng)絡(luò)資源進(jìn)行靈活統(tǒng)一管理.北向接口是應(yīng)用層與控制器交互的接口,由于上層應(yīng)用的多樣性,SDN北向接口需要滿足多樣性、合理性和開放性,未形成業(yè)界公認(rèn)的標(biāo)準(zhǔn),不同控制器的廠商設(shè)計(jì)不同的北向接口,通過調(diào)用開放的北向接口,網(wǎng)絡(luò)管理員可以自定義網(wǎng)絡(luò)應(yīng)用.南向接口協(xié)議是控制平面和轉(zhuǎn)發(fā)平面之間的通信協(xié)議[4],實(shí)現(xiàn)控制器對(duì)轉(zhuǎn)發(fā)設(shè)備的集中管理.SDN交換機(jī)需要與控制平面協(xié)同后才能工作,相關(guān)的消息通過南向接口協(xié)議傳達(dá)[5],當(dāng)前SDN已形成的標(biāo)準(zhǔn)接口協(xié)議是OpenFlow協(xié)議,用于控制數(shù)據(jù)平面的轉(zhuǎn)發(fā)行為.控制器(RYU)使用Python語言開發(fā),Python的易學(xué)易用性為RYU控制器的開發(fā)和管理提供便利,且RYU控制器對(duì)OpenFlow協(xié)議的支持范圍也較廣[6].
在實(shí)際網(wǎng)絡(luò)場景中,為了保證網(wǎng)絡(luò)的可靠性,會(huì)在網(wǎng)絡(luò)拓?fù)渲性O(shè)計(jì)冗余路徑,冗余路徑的設(shè)計(jì)可以防御單條鏈路故障引起的網(wǎng)絡(luò)癱瘓.帶有環(huán)路的交換式網(wǎng)絡(luò)如圖2所示.

圖2 帶有環(huán)路的交換式網(wǎng)絡(luò)
使用冗余路徑對(duì)網(wǎng)絡(luò)的可靠運(yùn)行很有幫助,但冗余路徑會(huì)產(chǎn)生網(wǎng)絡(luò)環(huán)路,網(wǎng)絡(luò)環(huán)路導(dǎo)致二層交換機(jī)會(huì)不停地泛洪廣播數(shù)據(jù)、設(shè)備可能會(huì)收到同一數(shù)據(jù)幀的多個(gè)復(fù)制(數(shù)據(jù)幀可能會(huì)通過不同的網(wǎng)段在同一時(shí)間到達(dá))、MAC地址表不穩(wěn)定等諸多問題.以太網(wǎng)交換機(jī)使用生成樹協(xié)議,可以在提高網(wǎng)絡(luò)可靠性的同時(shí)避免環(huán)路帶來的各種問題.生成樹協(xié)議的核心是生成樹算法,STA算法的核心思想是阻塞網(wǎng)絡(luò)中冗余鏈路的端口,構(gòu)建一個(gè)能夠連通全網(wǎng)所有節(jié)點(diǎn)的無環(huán)邏輯拓?fù)?
生成樹算法如下所示:

STP協(xié)議根據(jù)STA算法進(jìn)行根網(wǎng)橋、非根網(wǎng)橋選舉,分配端口的角色(根端口、指定端口、非指定端口),并根據(jù)不同端口的角色確定端口狀態(tài),根端口和指定端口的狀態(tài)是FORWARD,非指定端口的狀態(tài)是BLOCK,設(shè)置BLOCK狀態(tài)端口是為了避免環(huán)路.如圖2中所示,運(yùn)行STP協(xié)議后,STP協(xié)議阻塞交換機(jī)S1的Fa0/24號(hào)端口,其他鏈路端口處于正常FORWARD狀態(tài),構(gòu)建了一個(gè)無環(huán)邏輯拓?fù)?
本文實(shí)驗(yàn)環(huán)境建立在Ubuntu 16.04系統(tǒng)之上,仿真模擬器Mininet2.3.1,OpenvSwitch 2.5.9和RYU4.34控制器.Mininet是一個(gè)用于仿真SDN網(wǎng)絡(luò)的開源軟件,支持創(chuàng)建帶有虛擬主機(jī)、交換機(jī)、鏈路和控制器的SDN環(huán)境.在Mininet中構(gòu)建包含1臺(tái)控制器、3臺(tái)交換機(jī)、4臺(tái)終端主機(jī)且?guī)в协h(huán)路拓?fù)洌琌penvSwitch用于模擬SDN交換機(jī),通過OpenFlow1.3協(xié)議連接OpenSwitch的SDN控制器.實(shí)驗(yàn)拓?fù)淙鐖D3所示.

圖3 實(shí)驗(yàn)拓?fù)?/p>
實(shí)驗(yàn)拓?fù)鋵?duì)應(yīng)的Python文件(3sw-loop.py)源代碼如下:

在Ubuntu系統(tǒng)開啟兩個(gè)終端,一個(gè)終端先運(yùn)行RYU控制器,另一個(gè)終端再運(yùn)行3swloop.py,因?yàn)榫W(wǎng)絡(luò)中交換機(jī)之間存在環(huán)路,會(huì)導(dǎo)致廣播風(fēng)暴并占用帶寬,導(dǎo)致各主機(jī)之間無法進(jìn)行正常通信.主機(jī)之間ping-100%dropped如圖4所示.

圖4 主機(jī)之間ping-100%dropped
3.3.1 編輯3sw_loop_stp.py,附關(guān)鍵代碼
設(shè)置交換機(jī)的優(yōu)先級(jí).

設(shè)置交換機(jī)的活動(dòng)端口狀態(tài).

3.3.2 運(yùn)行帶有STP功能的RYU控制器文件和實(shí)驗(yàn)拓?fù)湮募?/p>
在Ubuntu系統(tǒng)開啟兩個(gè)終端,一個(gè)終端先運(yùn)行帶有STP功能RYU控制器3w_loop_stp.py,另一個(gè)終端再運(yùn)行3sw-loop.py.因?yàn)檫\(yùn)行了帶有STP功能RYU控制器,按照STA算法進(jìn)行網(wǎng)絡(luò)鏈路收斂后,交換機(jī)之間鏈路端口狀態(tài)如圖5所示.實(shí)驗(yàn)拓?fù)滏溌罚╨inks)如圖6所示.

圖5 STP交換機(jī)端口角色和狀態(tài)

圖6 實(shí)驗(yàn)拓?fù)滏溌?/p>
3.3.3 實(shí)驗(yàn)結(jié)果分析
實(shí)驗(yàn)分析依據(jù)是實(shí)驗(yàn)拓?fù)滏溌贰⑸蓸渌惴ㄟM(jìn)行根網(wǎng)橋、根端口、指定端口、非指定端口選舉和確定,并將指定端口設(shè)置為轉(zhuǎn)發(fā)狀態(tài)(FORWARD),非指定端口設(shè)置為阻塞狀態(tài)(BLOCK).
(1)選根網(wǎng)橋.文件3sw_loop_stp.py中設(shè)定了拓?fù)鋱D中各交換機(jī)的優(yōu)先級(jí),S1的優(yōu)先級(jí)(0x1000)最小,所以會(huì)選舉為根網(wǎng)橋,S2和S3是非根網(wǎng)橋.
(2)選根端口.在非根網(wǎng)橋S2和S3上選出一個(gè)根端口,用于連接根網(wǎng)橋S1并處于轉(zhuǎn)發(fā)狀態(tài).S2的優(yōu)先級(jí)(0x2000)較大,選舉為非根網(wǎng)橋,連接S1是3號(hào)端口,所以S2的3號(hào)端口成為根端口(ROOT_PORT);S3的優(yōu)先級(jí)(0x3000)最大,選舉為非根網(wǎng)橋,連接S1是1號(hào)端口,所以S3的1號(hào)端口成為根端口(ROOT_PORT).
(3)選指定端口.根網(wǎng)橋S1所屬的端口都是指定端口(DESIGNATED_PORT),所以S1的1、2、3號(hào)端口都是指定端口;S2的優(yōu)先級(jí)(0x2 000)較大,除了S2的3號(hào)端口是根端口外,其他端口(1、2、4)都是指定端口(DESIGNATED_PORT);S3的3號(hào)連接h4主機(jī),不參與STA運(yùn)算,是轉(zhuǎn)發(fā)狀態(tài)(計(jì)入指定端口).
(4)非指定端口.S3的優(yōu)先級(jí)(0x3000)最大,S3的1號(hào)端口是根端口,2號(hào)端口因?yàn)槎丝贗D較大,成為非指定端口(NON_DESIGNATED_PORT).
STA算法分析結(jié)果如表1所示,實(shí)驗(yàn)運(yùn)行結(jié)果如圖5(STP交換機(jī)端口角色和狀態(tài))所示,兩者保持一致.

表1 STA算法分析結(jié)果
通過代碼文件的運(yùn)行方式,指定了實(shí)驗(yàn)拓?fù)渲蠸3交換機(jī)的2號(hào)端口是非指定端口,并將該端口設(shè)定為阻塞狀態(tài),使得網(wǎng)絡(luò)中環(huán)路斷開,構(gòu)建了一個(gè)邏輯上無環(huán)的拓?fù)?在邏輯無環(huán)網(wǎng)絡(luò)中,消除了廣播風(fēng)暴,主機(jī)之間可以正常通信,主機(jī)之間ping-0%dropped如圖7所示.

圖7 主機(jī)之間ping-0%dropped
本文在Ubuntu 16.04系統(tǒng),仿真模擬器Mininet2.3.1,OpenvSwitch2.5.9和RYU4.34控制器基礎(chǔ)上搭建仿真平臺(tái),通過Python代碼編制網(wǎng)絡(luò)拓?fù)湮募蚏YU控制器文件的方式,實(shí)施SDN中的網(wǎng)絡(luò)環(huán)路設(shè)計(jì),按照STA算法設(shè)計(jì)STP環(huán)路避免,在仿真實(shí)驗(yàn)平臺(tái)運(yùn)行,測試結(jié)果表明,實(shí)現(xiàn)了SDN網(wǎng)絡(luò)中環(huán)路避免.但對(duì)于SDN復(fù)雜網(wǎng)絡(luò)中的環(huán)路避免實(shí)現(xiàn),還需要進(jìn)一步設(shè)計(jì)、實(shí)驗(yàn)和分析,SDN使用代碼方式構(gòu)建和管理網(wǎng)絡(luò),是一種新型網(wǎng)絡(luò)架構(gòu),其目標(biāo)是構(gòu)建和開發(fā)網(wǎng)絡(luò),消除網(wǎng)絡(luò)技術(shù)壁壘,值得深入學(xué)習(xí)和研究.