SDN網(wǎng)絡(luò)感知服務(wù)與最短路徑應(yīng)用
本文將介紹RYU中的網(wǎng)絡(luò)感知服務(wù),與基于網(wǎng)絡(luò)服務(wù)的最短路徑應(yīng)用,主要內(nèi)容包括網(wǎng)絡(luò)資源感知模塊,網(wǎng)絡(luò)監(jiān)控模塊和基于網(wǎng)絡(luò)信息的最短路由模塊介紹。在一個(gè)真實(shí)的網(wǎng)絡(luò)環(huán)境下,需掌握網(wǎng)絡(luò)的實(shí)時(shí)動(dòng)態(tài),包括網(wǎng)絡(luò)的資源以及網(wǎng)絡(luò)流量狀況,其中網(wǎng)絡(luò)的信息包括交換機(jī),端口,主機(jī)的信息,以及基于流的流量統(tǒng)計(jì)信息和基于端口的流量統(tǒng)計(jì)信息。在掌握這些關(guān)鍵的網(wǎng)絡(luò)信息后,控制器就可以根據(jù)這些信息作出當(dāng)下最正確的路由決策,完成網(wǎng)絡(luò)的通信。
網(wǎng)絡(luò)資源感知
網(wǎng)絡(luò)資源感知模塊用于感知網(wǎng)絡(luò)資源的實(shí)時(shí)變化,包括拓?fù)湫畔⒁约爸鳈C(jī)信息的變化。任何網(wǎng)絡(luò)應(yīng)用,可達(dá)性都是最基本的要求。SDN網(wǎng)絡(luò)的集中控制,使得控制器可以根據(jù)全局的信息作出***決策而無需在交換節(jié)點(diǎn)上采用分布式的路由算法。所以感知網(wǎng)絡(luò)資源是SDN應(yīng)用最基礎(chǔ)的一項(xiàng)服務(wù)。
實(shí)現(xiàn)該模塊的類為Network_Aware類,該類描述如下:
其中數(shù)據(jù)結(jié)構(gòu)與其作用關(guān)系如下:
link_to_port字典存儲(chǔ)交換機(jī)之間鏈路與端口的映射關(guān)系;
access_table字典存儲(chǔ)主機(jī)的接入信息;
switch_port_table存儲(chǔ)交換機(jī)端口列表;
access_ports存儲(chǔ)外向端口(與終端連接的接口);
interior_ports存儲(chǔ)內(nèi)部端口;
grap存儲(chǔ)網(wǎng)絡(luò)拓?fù)鋱D;
pre_link_to_port等帶有pre前綴的數(shù)據(jù)結(jié)構(gòu)用于保存上一次獲取的信息,用于和當(dāng)前獲取信息做比較。
_discover函數(shù)是主循環(huán)函數(shù)
在_discover函數(shù)中,周期執(zhí)行g(shù)et_topology和是show_topology函數(shù)。在get_topology函數(shù)中,控制器可以獲取到網(wǎng)絡(luò)中的交換機(jī)和端口信息、鏈路信息、主機(jī)接入信息等。此外,控制器通過實(shí)時(shí)檢測網(wǎng)絡(luò)變化的異步事件來更新網(wǎng)絡(luò)資源信息。show_topology函數(shù)則是將網(wǎng)絡(luò)信息格式化地展示在終端中。由于前端開發(fā)能力有限,目前僅僅簡單將后臺(tái)數(shù)據(jù)展現(xiàn)在終端。
Note that:可以通過置位IS_UPDATE來控制是否輸出信息。此外,若拓?fù)湫畔⒉话l(fā)生變化,將不打印,即僅打印拓?fù)湟淮危敝镣負(fù)涓?。可以將判斷中的and 修改為or,即可每次都打印。

圖1.網(wǎng)絡(luò)資源信息
網(wǎng)絡(luò)流量監(jiān)控
網(wǎng)絡(luò)的信息除了物理資源信息以外,還包括邏輯鏈路等信息;獲取流表信息可獲得對應(yīng)的邏輯連接信息。此外,獲取網(wǎng)絡(luò)的數(shù)據(jù)流量的統(tǒng)計(jì)情況對防止網(wǎng)絡(luò)故障,合理優(yōu)化網(wǎng)絡(luò)等方面起到了重要的作用。網(wǎng)絡(luò)流量監(jiān)控模塊實(shí)現(xiàn)了對端口流量和流表項(xiàng)流量的監(jiān)控。應(yīng)用可周期獲取到流量信息,并在終端中輸出展示。
實(shí)現(xiàn)網(wǎng)絡(luò)流量監(jiān)控的類為:Network_Monitor,具體描述如下:
其中數(shù)據(jù)結(jié)構(gòu)的作用如下:
datapaths記錄與控制器連接的datapath;
port_stats保存端口的統(tǒng)計(jì)信息;
port_speed保存端口的速率信息;
flow_stats保存流的統(tǒng)計(jì)信息;
flow_speed保存流的速率信息;
stats保存所有的統(tǒng)計(jì)信息;
port_link保存link的特性信息;
_monitor函數(shù)為主循環(huán)函數(shù);
在主循環(huán)函數(shù)中,周期調(diào)用了self._request_stats和self.show_stat函數(shù),前者用于下發(fā)統(tǒng)計(jì)信息請求報(bào)文,后者用于展現(xiàn)統(tǒng)計(jì)信息。統(tǒng)計(jì)信息回復(fù)報(bào)文處理函數(shù)為:_flow_stats_reply_handler和_port_stats_reply_handler,兩者分別使用的@set_ev_cls裝飾符,注冊監(jiān)聽了對應(yīng)的事件。至此流量統(tǒng)計(jì)模塊已經(jīng)完成了閉環(huán),可以作為底層的服務(wù)為上層的應(yīng)用提供實(shí)時(shí)的流量統(tǒng)計(jì)信息。

圖2. 端口流量統(tǒng)計(jì)信息

圖3.-流表項(xiàng)流量統(tǒng)計(jì)信息
#p#
基于網(wǎng)絡(luò)資源的最短路徑
基于以上的網(wǎng)絡(luò)資源感知模塊與網(wǎng)絡(luò)流量監(jiān)控模塊提供的數(shù)據(jù),我們可以做很多事情,比如負(fù)載均衡等流量調(diào)度應(yīng)用,有比如安全接入等安全應(yīng)用。本小節(jié)介紹基于網(wǎng)絡(luò)資源的最短路徑應(yīng)用。衡量最短路徑的參考系是跳數(shù),稍加修改可以變?yōu)槭S鄮?,延時(shí)或者多參考系加權(quán)的方案。源代碼鏈接:shortest_route最短路徑應(yīng)用流程圖如下:

圖4, 最短路由流程圖
首先,查詢主機(jī)表,若查找成功,則查詢主機(jī)位置表,之后直接由控制器將ARP數(shù)據(jù)包發(fā)送給對應(yīng)的端口,此時(shí)控制器并不做ARP的代理。當(dāng)目標(biāo)主機(jī)回復(fù)ARP時(shí),將數(shù)據(jù)包直接發(fā)送到源主機(jī)的接入端口。從而完成了ARP的學(xué)習(xí)過程。由于此時(shí)已經(jīng)掌握了主機(jī)的接入信息以及網(wǎng)絡(luò)信息,當(dāng)ICMP或其他數(shù)據(jù)包出發(fā)packet_in事件時(shí),則可根據(jù)源目兩個(gè)IP查詢到接入交換機(jī),再依據(jù)拓?fù)湫畔ⅲ?jì)算最短路徑,從而完成最短路由。若希望使用其他的參考標(biāo)準(zhǔn)來計(jì)算最短路徑,只需修改計(jì)算最短路徑的算法即可。
在網(wǎng)絡(luò)初始化時(shí),控制器并沒有辦法發(fā)現(xiàn)沉默的主機(jī),原因在于我們沒有進(jìn)行DHCP分配,導(dǎo)致控制器沒有掌握主機(jī)的IP/MAC信息。所以***步我們需要處理的數(shù)據(jù)包是ARP。處理流程具體如下所示:

圖5. ARP處理流程圖
Note that:本應(yīng)用假設(shè)主機(jī)發(fā)起通信時(shí)需先發(fā)起ARP,不可通過其他途徑獲取到ARP的信息,否則控制器無法獲得目的端主機(jī)接入信息,則無法完成路由。對于域外的主機(jī),只需在找不到目的端時(shí),將其送給出口網(wǎng)關(guān)即可。此時(shí)需使用到子網(wǎng)掩碼,網(wǎng)段,路由等概念。本應(yīng)用僅針對簡單局域網(wǎng)計(jì)算路徑。

圖6. 流表項(xiàng)流量統(tǒng)計(jì)信息
總結(jié)
網(wǎng)絡(luò)感知服務(wù)對于SDN網(wǎng)絡(luò)而言非常重要,是一切網(wǎng)絡(luò)應(yīng)用的基礎(chǔ)。充分利用網(wǎng)絡(luò)資源的信息,可以對網(wǎng)絡(luò)進(jìn)行優(yōu)化,提高網(wǎng)絡(luò)的安全性。以上的Network_aware和monitor模塊均可以直接做為APP的service app(在RYU中需在_CONTEXTS添加)提供數(shù)據(jù)服務(wù),希望可以給有需要的讀者提供一些幫助。