OpenFlow Flow-Mod消息學習

任務目的

1、初步瞭解OpenFlow協議的三大消息類型,並着重學習Flow-Mod消息。
2、進一步鞏固抓包工具Wireshark的使用方法,通過抓包詳細分析Flow-Mod消息。

任務環境

設備名稱 軟件環境(鏡像) 硬件環境
控制器 Ubuntu 14.04桌面版
Floodlight 1.0
CPU:1核 內存:2G 磁盤:20G
主機 Ubuntu 14.04桌面版
Mininet 2.2.0
CPU:1核 內存:2G 磁盤:20G

注:系統默認的賬戶爲root/root@openlab,openlab/user@openlab。

任務內容

1、通過Flow-Mod消息對流表進行添加、刪除、變更設置等操作。
2、使用Wireshark工具捕獲OpenFlow數據包,瞭解、學習Flow-Mod消息。

實驗原理

OpenFlow 協議支持3種消息類型:Controller-to-Switch(控制器—交換機)、Asynchronous(異步)和Symmetric(對稱),每一類消息又有多個子消息類型。
1、 Controller-Switch(控制器—交換機)消息,這類消息由控制器發起,包括Features、Configuration、Modify-State、Read-State、Send-Packet、Barrier等幾類消息,用於對OF交換機的管理。
2、 Asynchronous(異步)消息,這類消息用來將網絡事件或交換機狀態的變化更新到控制器。主要包括4種子類型:Packet-in、Flow-Removed、Port-status和Error消息。
3、 Symmetric(同步)消息與前兩類消息有所不同,Symmetric類的消息可由控制器或者OF交換機中的任意一側發起,這類消息包括以下3種類型:Hello、Echo和Vendor。
Modify-State消息是OpenFlow消息中最爲重要的消息類型,控制器通過Port-mod消息用來管理端口狀態,通過Flow-mod消息增刪交換機的流表項,考慮到流表在OpenFlow的重要意義,在此針對Flow-mod消息進行詳盡分析。
圖1是Flow-mod消息的具體格式,前4個字段是OpenFlow消息的通用報頭。wildcard表示匹配時12元組的掩碼位,被掩蓋掉的元組不參加匹配。中間部分從in_port到tp_dst字段說明了流表項12元組的信息,其中的pad負責對齊佔位,不代表任何意義。cookie字段在處理數據分組時不會用到,控制器通過cookie來過濾流的統計信息。command字段表示對流表的操作,包括增加(Add)、刪除(Delete)、修改(Modify)等。idle_time和hard_time給出了該流表項的生存時間,其中idle_time表示當這條流表項在這段時間內沒有匹配到數據分組,則該流表項失效,hard_time表示自流表項下發後只要過了這段時間即刻失效;兩者同時設置時,以先到的生存時間爲準;兩者同時爲0時,流表項不會自動失效。priority(優先級)字段的設置參考流表匹配那一小節,原則上優先級越高,所屬的Table號就越小。buffer_id表示對應Packet-in消息的buffer_id。out_port僅在command爲Delete或者Delete Strict時有效,表明當某表項不僅匹配了Flow-mod中給出的12元組,且轉發動作中指定端口等於該out_port的動作時才予以刪除,即對刪除操作的一種額外限制。flags字段爲標誌位,OpenFlow v1.0中包括3項:OFPFF_SEND_FLOW_REM(流表失效時是否向控制器發送Flow-removed消息),OFPFF_CHECK_OVERLAP(交換機是否檢測流表衝突),OFPFF_EMERG(該流表項將被存於Emergency Flow Cache中,僅在交換機處於緊急模式時生效)。消息中最後的actions數組是對動作表的描述actions[0]即代表其中第一個動作。


圖1 OpenFlow v1.0中的Flow-mod消息格式

實驗步驟

一、實驗環境檢查

步驟1 登錄控制器,查看控制器IP。桌面版鏡像可以通過雙擊桌面上的“Terminal”圖標打開命令終端,也可以使用Ctrl+Alt+t快捷方式打開命令終端,如下圖所示。

步驟2 登錄Mininet所在主機,查看Mininet的IP,如下圖所示。

二、Flow-Mod消息解析

  • 場景一 控制器自動下發流表

步驟1 登錄Floodlight控制器,啓動抓包工具Wireshark,捕獲控制器與交換機建立連接後,控制器自動發送給交換機的flow_mod消息。執行以下命令:

$ sudo wireshark

步驟2 雙擊eth0網卡,查看eth0網卡上數據包收發情況,如下圖所示。

步驟3 登錄Mininet虛擬機,執行以下命令啓動Mininet。

通過“—controller”參數設置Mininet連接遠程控制器,並指定控制器的IP和端口號。

$ sudo mn --controller=remote,ip=30.0.1.3,port=6633 --switch=ovsk,protocols=OpenFlow13

步驟4 登錄Floodlight控制器,停止Wireshark,觀察數據包列表。

可以看出控制器發送的第一條flow_mod消息就是刪除交換機中的流表項。這條flow_mod消息中table-id設爲OFPTT_ALL,表明匹配的流表項將都會被刪除。Commend顯示爲DELETE,Commend表示對流表進行的操作,具體包括五種操作類型:ADD、DELETE、DELETE‐STRICT、MODIFY、MODIFY‐STRICT,當Commend爲DELETE就代表刪除所有符合一定條件的流表項,如下圖所示。

步驟5 發送完DELETE類型的消息後,控制器會發送ADD類型的flow_mod消息來添加新的流表項。

ADD消息可以分爲三部分:openflow主體部分、match部分、instruction部分,其中instruction部分可以省略。match部分是匹配條件,instruction部分是指令,當一個數據包滿足匹配條件就會執行instruction中的指令。控制器發送的add消息中action爲output,而output的端口是controller,也就是說讓交換機將符合匹配要求的數據包都轉發給控制器,如下圖所示。

  • 場景二 手動下發流表

步驟1 登錄Floodlight控制器,啓動Wireshark。

說明:控制器自動發送的flow_mod消息通常就是以上兩種,爲了進一步瞭解flow_mod消息,可以通過手動添加、刪除流表項觸發flow_mod消息。

步驟2 在控制器中再打開一個Terminal,輸入以下命令獲取交換機DPID。

其中:127.0.0.1是控制器所在的IP,8080是floodlightRest Api的端口。

$ curl http://127.0.0.1:8080/wm/core/controller/switches/json


說明:Floodlight控制器將自己的API通過Rest Api的形式向外暴露,用戶可以通過Floodlight的Rest Api來向Floodlight請求交換機信息,添加、刪除、查看流表項等。

步驟3 執行以下命令添加流表項。

其中switch的值就是上面獲取到的DPID,name是流表項的名稱,需要注意name的值必須是唯一的。priority是流表項的優先級,默認值是32767,最大值也是32767。以第二條命令爲例,可以理解爲“將交換機port1端口接收到的數據包都從port2轉發出去”。

$ curl -X POST -d '{"switch":"00:00:00:00:00:00:00:01", "name":"ovs1", "cookie":"0", "priority":"34","in_port":"2","active":"true","actions":"output=1"}' http://127.0.0.1:8080/wm/staticflowpusher/json
$ curl -X POST -d '{"switch":"00:00:00:00:00:00:00:01", "name":"ovs2", "cookie":"0", "priority":"35","in_port":"1","active":"true","actions":"output=2"}' http://127.0.0.1:8080/wm/staticflowpusher/json

步驟4 查看flow_mod消息,從priority可以看出這個第二條流表項,Commend爲ADD。匹配條件是in_port爲1,對應的動作是output到端口2,如下圖所示。



步驟5 執行以下命令刪除流表項“ovs1”。

$ curl -X DELETE -d '{"name":"ovs1"}' http://127.0.0.1:8080/wm/staticflowpusher/json

步驟6 查看對應的flow_mod消息,Commend是DELETE_STRICT,DELETE_STRICT類型消息表示刪除某一條指定的流表項。該消息表明刪除的流表項的priority是34,匹配條件是in_port爲2,如下圖所示。

步驟7 執行以下命令修改流表項“ovs2”。

如果修改名稱、優先級、匹配條件等字段,就會被認爲是添加新的流表項。如果只是修改actions,則是修改流表項。

$ curl -X POST -d '{"switch":"00:00:00:00:00:00:00:01", "name":"ovs2", "cookie":"0", "priority":"35","in_port":"1","active":"true","actions":"output=3"}' http://127.0.0.1:8080/wm/staticflowpusher/json

步驟8 查看對應的flow_mod消息,Commend是MODIFY_STRICT,MODIFY_STRICT類型息用來修改某一條指定的流表項。從消息可以看出被修改的流表項的priority是35,匹配條件是in_port爲1,如下圖所示。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章