網(wǎng)絡(luò)的轉(zhuǎn)發(fā)是通信的基本功能,其完成信息在網(wǎng)絡(luò)中傳遞,實(shí)現(xiàn)有序的數(shù)據(jù)交換。通過SDN控制器的集中控制,可以輕松實(shí)現(xiàn)基礎(chǔ)的轉(zhuǎn)發(fā)算法有二層MAC學(xué)習(xí)轉(zhuǎn)發(fā)和基于跳數(shù)的最短路徑算法。然而,網(wǎng)絡(luò)跳數(shù)并不是決定路徑優(yōu)劣的唯一狀態(tài)。除了跳數(shù)以外,還有帶寬,時(shí)延等標(biāo)準(zhǔn)。本文將介紹如何通過SDN控制器Ryu開發(fā)基于流量的最短路徑轉(zhuǎn)發(fā)應(yīng)用。
Forwarding Algorithm目前基于流量的路由算法基本的解決思路有兩種:
(1) 首先基于跳數(shù)計(jì)算最優(yōu)K條路徑,然后在這些路徑中選擇可用帶寬最大的路徑。
(2) 首先基于跳數(shù)計(jì)算最優(yōu)路徑,歸一化路徑的評(píng)價(jià)分?jǐn)?shù),然后基于流量計(jì)算最優(yōu)路徑,歸一化基于帶寬的評(píng)價(jià);設(shè)置跳數(shù)和帶寬的權(quán)重,對(duì)基于跳數(shù)和帶寬的評(píng)分求其加權(quán)總和;按照加權(quán)求和值降序排序,取前K條作為最優(yōu)評(píng)價(jià)路徑。
本文以第一種算法為例,介紹基于網(wǎng)絡(luò)流量的最短路徑轉(zhuǎn)發(fā)應(yīng)用開發(fā)。第二種算法基于前者的基礎(chǔ)修改即可完成。
Network Awareness首先我們需要編寫一個(gè)網(wǎng)絡(luò)感知應(yīng)用,用于發(fā)現(xiàn)網(wǎng)絡(luò)的資源,包括節(jié)點(diǎn),鏈路,終端主機(jī)等。并根據(jù)拓?fù)湫畔⒂?jì)算基于條數(shù)的最短路徑。開發(fā)此應(yīng)用基本步驟如下:
創(chuàng)建繼承app_manager.RyuApp的應(yīng)用network_awareness從topology.switches獲取拓?fù)湫畔ⅲń粨Q機(jī)節(jié)點(diǎn)信息,鏈路信息使用Networkx 創(chuàng)建拓?fù)鋱D的對(duì)象,用于存儲(chǔ)網(wǎng)絡(luò)拓?fù)涫褂肗etworkx的函數(shù)all_simple_paths(G, source, target, cutoff=None)計(jì)算K條最優(yōu)路徑并存儲(chǔ),該函數(shù)實(shí)現(xiàn)了Yen's algorithm示例代碼可由muzixing/ryu/network_awareness獲取。
Note that: 以上的示例代碼中,拓?fù)湫畔⒌拇鎯?chǔ)并沒有使用networkx,所以讀者需要獨(dú)立完成基于networkx的存儲(chǔ)和算法調(diào)用部分。
Network Monitor第二個(gè)應(yīng)用是網(wǎng)絡(luò)流量監(jiān)控應(yīng)用。網(wǎng)絡(luò)流量監(jiān)控應(yīng)用完成網(wǎng)絡(luò)流量的實(shí)時(shí)監(jiān)控,計(jì)算出實(shí)時(shí)的流量統(tǒng)計(jì)數(shù)據(jù)。基于本應(yīng)用的數(shù)據(jù),可以完成轉(zhuǎn)發(fā)算法的第二部分內(nèi)容。示例代碼可由muzixing/ryu/network_monitor獲取。
為了讓其他模塊獲取到最新的流量信息,可在Ryu中自定義事件,具體教程請(qǐng)查看《基于Ryu打造自定義控制器》的自定義事件部分內(nèi)容。不定義事件的情況下,需要將此模塊作為新模塊的CONTEXT。詳情可閱讀《Ryu:模塊間通信機(jī)制分析》的相關(guān)內(nèi)容。
Forwarding Application基于以上兩個(gè)模塊的數(shù)據(jù),轉(zhuǎn)發(fā)應(yīng)用模塊需要完成如下幾個(gè)步驟,從而完成基于流量的最優(yōu)路徑轉(zhuǎn)發(fā)。
獲取network awareness和network monitor的數(shù)據(jù)將network monitor的數(shù)據(jù)整合到networkx存儲(chǔ)的網(wǎng)絡(luò)拓?fù)湫畔⒅斜容^最短K條路徑中各路徑的剩余帶寬,選擇最優(yōu)路徑,剩余路徑為備份路徑和逃生路徑基于路徑信息,安裝流表項(xiàng)整合流量信息代碼示例代碼如下, 其中,link2port為鏈路信息,bw_dict為network monitor模塊的流量數(shù)據(jù)。