成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于網絡流量的SDN最短路徑轉發應用

網絡
網絡的轉發是通信的基本功能,其完成信息在網絡中傳遞,實現有序的數據交換。通過SDN控制器的集中控制,可以輕松實現基礎的轉發算法有二層MAC學習轉發和基于跳數的最短路徑算法。然而,網絡跳數并不是決定路徑優劣的唯一狀態。除了跳數以外,還有帶寬,時延等標準。本文將介紹如何通過SDN控制器Ryu開發基于流量的最短路徑轉發應用。

網絡的轉發是通信的基本功能,其完成信息在網絡中傳遞,實現有序的數據交換。通過SDN控制器的集中控制,可以輕松實現基礎的轉發算法有二層MAC學習轉發和基于跳數的最短路徑算法。然而,網絡跳數并不是決定路徑優劣的唯一狀態。除了跳數以外,還有帶寬,時延等標準。本文將介紹如何通過SDN控制器Ryu開發基于流量的最短路徑轉發應用。

 [[158380]]

Forwarding Algorithm

目前基于流量的路由算法基本的解決思路有兩種:

(1) 首先基于跳數計算***K條路徑,然后在這些路徑中選擇可用帶寬***的路徑。

(2) 首先基于跳數計算***路徑,歸一化路徑的評價分數,然后基于流量計算***路徑,歸一化基于帶寬的評價;設置跳數和帶寬的權重,對基于跳數和帶寬的評分求其加權總和;按照加權求和值降序排序,取前K條作為***評價路徑。

本文以***種算法為例,介紹基于網絡流量的最短路徑轉發應用開發。第二種算法基于前者的基礎修改即可完成。

Network Awareness

首先我們需要編寫一個網絡感知應用,用于發現網絡的資源,包括節點,鏈路,終端主機等。并根據拓撲信息計算基于條數的最短路徑。開發此應用基本步驟如下:

創建繼承app_manager.RyuApp的應用network_awareness

從topology.switches獲取拓撲信息,包括交換機節點信息,鏈路信息

使用Networkx 創建拓撲圖的對象,用于存儲網絡拓撲

使用Networkx的函數all_simple_paths(G, source, target, cutoff=None)計算K條***路徑并存儲,該函數實現了Yen's algorithm

示例代碼可由muzixing/ryu/network_awareness獲取。

Note that: 以上的示例代碼中,拓撲信息的存儲并沒有使用networkx,所以讀者需要獨立完成基于networkx的存儲和算法調用部分。

Network Monitor

第二個應用是網絡流量監控應用。網絡流量監控應用完成網絡流量的實時監控,計算出實時的流量統計數據。基于本應用的數據,可以完成轉發算法的第二部分內容。示例代碼可由muzixing/ryu/network_monitor獲取。

為了讓其他模塊獲取到***的流量信息,可在Ryu中自定義事件,具體教程請查看《基于Ryu打造自定義控制器》的自定義事件部分內容。不定義事件的情況下,需要將此模塊作為新模塊的CONTEXT。詳情可閱讀《Ryu:模塊間通信機制分析》的相關內容。

Forwarding Application

基于以上兩個模塊的數據,轉發應用模塊需要完成如下幾個步驟,從而完成基于流量的***路徑轉發。

獲取network awareness和network monitor的數據

將network monitor的數據整合到networkx存儲的網絡拓撲信息中

比較最短K條路徑中各路徑的剩余帶寬,選擇***路徑,剩余路徑為備份路徑和逃生路徑

基于路徑信息,安裝流表項

整合流量信息代碼示例代碼如下, 其中,link2port為鏈路信息,bw_dict為network monitor模塊的流量數據。

  1. def create_bw_graph(self, graph, link2port, bw_dict): 
  2.     for link in link2port: 
  3.         (src_dpid, dst_dpid) = link 
  4.         (src_port, dst_port) = link2port[link] 
  5.   
  6.         if src_dpid in bw_dict and dst_dpid in bw_dict: 
  7.             bw_src = bw_dict[src_dpid][src_port] 
  8.             bw_dst = bw_dict[dst_dpid][dst_port] 
  9.             graph[src_dpid][dst_dpid]['bandwidth'] = min(bw_src, bw_dst) 
  10.         else
  11.             graph[src_dpid][dst_dpid]['bandwidth'] = 0 
  12.     return graph 

獲取最短K條路徑函數示例代碼如下所示。

  1. def k_shortest_paths(graph, src, dst): 
  2.     path_generator = nx.shortest_simple_paths(graph, source=src, 
  3.     target=dst, weight='weight'
  4.     return path_generator 

基于流量的***路徑比較算法示例代碼如下所示:

  1. def band_width_compare(graph, paths, best_paths): 
  2.     capabilities = {} 
  3.     MAX_CAPACITY = 100000 
  4.     for src in paths: 
  5.         for dst in paths[src]: 
  6.             if src == dst: 
  7.                 best_paths[src][src] = [src] 
  8.                 capabilities.setdefault(src, {src: MAX_CAPACITY}) 
  9.                 capabilities[src][src] = MAX_CAPACITY 
  10.                 continue 
  11.             max_bw_of_paths = 0 
  12.             best_path = paths[src][dst][0] 
  13.             for path in paths[src][dst]: 
  14.                 min_bw = MAX_CAPACITY 
  15.                 min_bw = get_min_bw_of_links(graph, path, min_bw) 
  16.                 if min_bw > max_bw_of_paths: 
  17.                     max_bw_of_paths = min_bw 
  18.                     best_path = path</p> 
  19.       best_paths[src][dst] = best_path 
  20.         capabilities.setdefault(src, {dst: max_bw_of_paths}) 
  21.         capabilities[src][dst] = max_bw_of_paths 
  22. return capabilities, best_paths 
  1. def best_paths_by_bw(graph, src=None, topo=None): 
  2.     _graph = copy.deepcopy(graph) 
  3.     paths = {} 
  4.     best_paths = {} 
  5.     # find ksp in graph. 
  6.     for src in _graph.nodes(): 
  7.         paths.setdefault(src, {src: [src]}) 
  8.         best_paths.setdefault(src, {src: [src]}) 
  9.         for dst in _graph.nodes(): 
  10.             if src == dst: 
  11.                 continue 
  12.             paths[src].setdefault(dst, []) 
  13.             best_paths[src].setdefault(dst, []) 
  14.             path_generator = k_shortest_paths(_graph, src, dst) 
  15. <pre><code>        k = 2 
  16.         for path in path_generator: 
  17.             if k &lt;= 0: 
  18.                 break 
  19.             paths[src][dst].append(path) 
  20.             k -= 1 
  21. # find best path by comparing bandwidth. 
  22. capabilities, best_paths = band_width_compare(_graph, paths, best_paths) 
  23. return capabilities, best_paths, paths 

安裝流表項函數示例代碼如下:

  1. def install_flow(datapaths, link2port, access_table, path, flow_info, buffer_id, data): 
  2.      ''' path=[dpid1, dpid2, dpid3...] 
  3.         flow_info=(eth_type, src_ip, dst_ip, in_port) 
  4.     ''
  5.     if path is None or len(path) == 0: 
  6.         LOG.info("PATH ERROR"
  7.         return 
  8.     in_port = flow_info[3] 
  9.     first_dp = datapaths[path[0]] 
  10.     out_port = first_dp.ofproto.OFPP_LOCAL 
  11.     reverse_flow_info = (flow_info[0], flow_info[2], flow_info[1]) 
  12. <pre><code>if len(path) &gt; 2: 
  13.     for i in xrange(1, len(path) - 1): 
  14.         port = get_link2port(link2port, path[i-1], path[i]) 
  15.         port_next = get_link2port(link2port, path[i], path[i + 1]) 
  16.         if port and port_next: 
  17.             src_port, dst_port = port[1], port_next[0] 
  18.             datapath = datapaths[path[i]] 
  19.             send_flow_mod(datapath, flow_info, src_port, dst_port) 
  20.             send_flow_mod(datapath, reverse_flow_info, dst_port, src_port) 
  21. if len(path) &gt; 1: 
  22.     # the last flow entry: tor -&gt; host 
  23.     last_dp = datapaths[path[-1]] 
  24.     port_pair = get_link2port(link2port, path[-2], path[-1]) 
  25.     if port_pair: 
  26.         src_port = port_pair[1] 
  27.     else
  28.         return 
  29.     dst_port = get_port(flow_info[2], access_table) 
  30.   
  31.     send_flow_mod(last_dp, flow_info, src_port, dst_port) 
  32.     send_flow_mod(last_dp, reverse_flow_info, dst_port, src_port) 
  33.   
  34.     # the first flow entry 
  35.     port_pair = get_link2port(link2port, path[0], path[1]) 
  36.     if port_pair: 
  37.         out_port = port_pair[0] 
  38.     else
  39.         return 
  40.     send_flow_mod(first_dp, flow_info, in_port, out_port) 
  41.     send_flow_mod(first_dp, reverse_flow_info, out_port, in_port) 
  42.   
  43.     send_packet_out(first_dp, buffer_id, in_port, out_port, data) 
  44.     # ensure the first ping success. 
  45.     # send_packet_out(last_dp, buffer_id, src_port, dst_port, data) 
  46. # src and dst on the same datapath 
  47. else
  48.     out_port = get_port(flow_info[2], access_table) 
  49.     send_flow_mod(first_dp, flow_info, in_port, out_port) 
  50.     send_flow_mod(first_dp, reverse_flow_info, out_port, in_port) 
  51.     send_packet_out(first_dp, buffer_id, in_port, out_port, data) 

讀者可以基于muzixing/ryu/shortest_route的代碼進行修改。該代碼是初始版本,質量欠佳,但是可以成功運行。

Note that: 以上的代碼均為示例代碼,不可直接運行,完整版代碼后續將發布。

Implementation and Test

啟動network_awareness, network_monitor,和寫好的forwarding模塊,再啟動一個簡單拓撲連接到控制器Ryu。拓撲中,h1, h2到h39有兩條路徑:[1,2,4]和[1,3,4]。每條鏈路的***帶寬為500Mbits/s。然后xterm到h1, h2 和還h39,并在h39之上啟動iperf服務端程序。先啟動h1上的iperf客戶端程序,向h39打流,等一個Monitor模塊的周期之后,啟動h2的iperf客戶端程序,向h39打流。此操作的原因在于需要等待控制器獲取流量信息和計算出***路徑。測試截圖如下圖所示。

上圖左上為控制器的顯示,路徑選擇了[1,2,4]和[1,3,4]。右側的數據為h1的流量信息,左下為h2的流量信息,可以發現h1和h2各自獨占一條路徑,都打滿了500Mbits。實驗成功。

Conclusion

本文介紹了在Ryu控制器中開發基于流量的***轉發的流程。不過內容僅僅涉及了解決思路,實際工程代碼的發布還需要等待一段時間。文中提到的第二種算法的解決方法與本文舉例類似,僅需加上歸一化數據,求加權求和評分步驟就可以完成新解決方案的工作。希望本文能給讀者帶來一些幫助。

責任編輯:何妍 來源: SDNLAB
相關推薦

2015-07-16 14:25:56

SDN網絡感知服務

2013-12-16 09:44:01

OpenDayLighSDN網絡轉發

2015-07-28 15:58:26

2011-03-31 09:37:48

2016-10-07 22:54:03

流量監控ossim

2011-04-06 10:57:14

監控MRTG

2011-03-31 09:02:26

MRTGSNMP

2011-05-17 13:58:37

最短路徑

2019-08-19 00:14:12

網絡測試帶寬網絡流量

2011-03-31 09:47:21

CACTI流量監控

2012-11-29 09:59:02

網絡流量網絡安全

2013-12-27 09:55:56

2009-08-03 16:27:17

2022-04-14 08:21:48

微服務項目多模塊

2012-09-07 11:19:21

SNMPNetFlow虛擬網絡

2024-05-24 08:00:00

2009-07-22 14:43:36

2022-09-26 14:24:18

Linux網絡流量審計

2010-10-08 14:31:00

網絡流量監測

2009-01-03 09:13:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级毛片色一级 | 91.色| 91麻豆精品一区二区三区 | av一区二区三区四区 | 亚洲第1页 | 日韩小视频 | 日本一区二区三区四区 | 精品国产一级 | 欧美日本高清 | 乳色吐息在线观看 | 高清黄色网址 | 成人在线观看黄 | 国产精品揄拍一区二区 | 性色av一区二区三区 | 精品av久久久久电影 | 中文字幕一区在线观看视频 | 国产欧美一区二区三区在线看蜜臀 | 国产日韩精品视频 | 成人免费淫片aa视频免费 | www.一区二区| 日韩精品中文字幕一区二区三区 | 综合久久一区 | 国产ts人妖另类 | 国产激情视频 | 天天操天天干天天爽 | 超碰在线观看97 | 美女一级a毛片免费观看97 | 久久影音先锋 | 国产精品亚洲成在人线 | 一区二区三区四区电影 | 日韩成人在线播放 | 一本一道久久a久久精品综合 | 日韩视频一区在线观看 | 欧美啊v在线观看 | 国产精品久久久久久吹潮 | 91精品国模一区二区三区 | 久久精品久久久久久 | 91久久| 国产做a爱免费视频 | 久久久久久亚洲精品 | 亚洲精品久久久久久久久久久 |