Floodlight中的臨時流表


運行Floodlight,在Mininet中新建一個拓撲之后,並未添加相關的流表項,但是主機之間卻可以相互通信。執行pingall操作,任意兩個主機之間都能通。相當於沒有任何路由表的路由器,它是怎么讓這些網絡中的主機通信的呢?

原因在於Floodlight默認啟用了Forwarding模塊。說這個模塊之前,首先說說Floodlight 中流表的兩種添加方式:主動式和反應式。


官網上的文檔是這么說的:
http://docs.projectfloodlight.org/display/floodlightcontroller/Static+Flow+Pusher+API

Proactive vs Reactive flow insertion

OpenFlow supports two methods of flow insertion: proactive and reactive. Reactive flow insertion occurs when a packet reaches an OpenFlow switch without a matching flow. The packet is sent to the controller, which evaluates it, adds the appropriate flows, and lets the switch continue its forwarding. Alternatively, flows can be inserted proactively by the controller in switches before packets arrive.

Floodlight supports both mechanisms of flow insertion. Static Flow Pusher is generally useful for proactive flow insertion.

Note that by default, Floodlight loads the Forwarding module which does reactive flow pushing. If you would like to exclusively use static flows, you must remove Forwarding from the floodlight.properties file.

主動式流插入與反應式流插入

OpenFlow協議支持兩種流插入方式:主動式和反應式。當一個數據包到達OpenFlow交換機后,沒有被任何現有的流匹配,這個包就被發到控制器。控制器對此數據包進行評估,然后向交換機添加合適的流,讓交換機把此數據包(以及后來的類似的數據包)正確的轉發下去。這就是反應式流插入。對應的主動式流插入則是,在數據包到達交換機之前,控制器已經向交換機中插入了流表。

Floodloght支持這兩種插入方式。Static Flow Pusher 用於主動式流插入。

需要注意的是,Floodlight默認加載了Forwarding模塊,這個模塊會實現反應式流插入。如果你想排除這種臨時流,只用自己寫入的靜態流,你需要在配置文件floodlight.properties 里移除Forwarding模塊。


好,回到文章開始提出的問題:Floodlight默認啟用了Forwarding模塊,該模塊的啟用導致了沒有流表的拓撲里,主機之間也能ping通。

可見,Forwarding模塊實現的功能就是實現反應式流插入。當運行pingall操作時,Forwarding模塊會產生很多“臨時流表”,這種流表存活時間只有5s。因為這些臨時流表的存在,主機之間才能通信。

以下是一個測試:

建立如下的拓撲:

 

 

 

 

 

 

 

 

 

 

執行 pingall 操作后立即在floodlight主頁上查看5號交換機中的流表,如下圖:

一共有10條流表項,有興趣可以仔細分析一下,發現確實如此。同樣的可以在3號交換機中看到10條,4號交換機中8條。

那么這種由Flowarding模塊產生的流表項與通過python腳本(Static Flow Pusher API)寫入的流表項是否一樣呢?下圖是通過 Static Flow Pusher 寫入的流表項:

可以發現很多地方是不一樣的。比如優先級,“臨時流表”的優先級最低,是0。靜態流表的Timeout為0,表示永久有效。ForwardingBase 類中可見定義:

public static int FLOWMOD_DEFAULT_IDLE_TIMEOUT = 5; // in seconds
public static int FLOWMOD_DEFAULT_HARD_TIMEOUT = 0; // infinite

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM