關於OpenFlow協議

SDN中兩個重要元素:控制器(掌控全局,指揮網絡內的設備工作)
交換機(轉發數據)
控制器與網絡設備通過OpenFlow協議進行通信
OpenFlow交換機內有一個FlowTable,交換機按照流錶轉發數據,流表由控制器生成和維護。內有數據包匹配特徵和數據包處理方法。
流表數據包匹配特徵的構成:
1.進入交換機的端口(Ingress Port)
2.源MAC地址(Ether Source)、目的MAC地址(Ether dst)、以太網類型(Ether Type)、VLAN標籤(VLAN id)、VLAN優先級(VLAN priority)
3.源IP(IP src)、目的IP(IP dst)、IP協議字段(IP Proto)、IP服務類型(IP Tosbits)
4.TCP/UDP源端口號(TCP/UDP src port)、TCP/UDP目的端口號(TCP/UDP dst port)
數據包處理方法:
轉發、修改包頭。處理稱爲Action
OpenFlow協議的消息類型:
1.控制器to交換機(Controller to Switch 由控制器發出)
1)Features:獲取交換機特徵
2)Configuration:配置交換機
3)Modify-State:修改交換機狀態(修改流表)
4)Read-Stats:讀取交換機狀態
5)Send-Packet:發送數據包
6)Barrier:阻塞消息
2.異步消息(Asynchronous 由交換機發出)
1)Packet-in:收到數據包後告知控制器、
2)Flow-Removed:告知控制器交換機流表被刪除
3)Port-Status:告知控制器交換機端口狀態更新
4)Error:告知控制器交換機發生錯誤
3.對稱消息(Symmetric 控制器或交換機發出)
1)Hello:建立OpenFlow連接
2)Echo:確認交換機與控制器之間的連接狀態
3)Vendor:廠商自定義的消息
OpenFlow協議數據包包括包頭Header和消息Message:Header(協議版本、數據包長度等)、Message(具體的數據包內容)
OpenFlow通信過程:
1)控制器與交換機三次握手建立socket連接;然後控制器與交換機互發OFPT_Hello消息(只有Header,version爲發送方支持的協議的最高版本,雙方選擇最低的版本的協議作爲通信協議,若一方不支持OpenFlow協議則發送OFPT_ERROR<TYPE:OFTP_HELLO_FAILED,CODE=0>消息後斷開連接,否則建立連接成功)
2)獲取交換機Features。建立連接後控制器獲取交換機特性信息(交換機ID<DPID>、交換機緩衝區數量、交換機端口及端口屬性)。控制器發送Features Request消息(只包含Header),交換機收到消息後,返回Features Reply消息(包含Header和Message)
Features Message結構:
datapath_id爲交換機獨一無二的ID號
n_buffers爲交換機可以同時緩存的最大數據包個數
n_tables爲交換機的流表數量
Capabilities表示交換機支持的特殊功能
Actions表示交換機支持的動作(見ofp_action_type)
ofp_phy_ports爲交換機的物理端口描述列表
port_no爲物理端口的編號
hw_addr爲端口的MAC地址
name爲端口的名稱
config爲端口的配置
State爲端口狀態
curr, advertised supported,peer爲端口物理屬性
3)PACKET_in 事件(交換機接收數據包),控制器獲取交換機特性後,向交換機發送數據包,交換機收到數據包後開始處理。若收到的數據包沒有匹配流表則交換機將其封裝在packet_in中發送給控制器。觸發此事件的原因有:一、收到數據包若流表中有與數據包包頭相匹配的則按所指示的action處理數據包,否則封裝在Packet_in消息中發回控制器處理,此時數據包還緩存在交換機中;二、流表中包含轉發給控制器的動作(Output=Controller),此時不會緩存。Packet_in消息格式(uffer_id爲packet‐in事件所攜帶的數據包在交換機中的緩存區ID、total_len爲data段的長度、 in_port數據包進入交換機的入接口號、Reason爲packet‐in事件產生的原因)packet_in事件後一般會觸發兩種事件(packet_out、flow_mod)若爲廣播包,則包裝爲packet_out包,讓交換機flood(發送給除接收口以外的所有端口)
4)OFPT_PACKET_OUT:
不是所有的數據包都要向交換機中添加一條流表項來匹配處理,有數量很少數據包(如ARP、IGMP等),爲了節省系統開銷,控制器可以使用PacketOut消息,讓交換機做相應處理。
5)OFPT_FLOW_MOD:流表中無匹配項時,觸發packet_in事件,控制器收到此消息後發送flow_mod消息向交換機添加一個流表項,將flow_mod消息中的buffer_id字段設爲packet_in中的buffer_id,向交換機流表內寫入與此數據包有關的流表項並指定action處理。
OFPT_FLOW_MOD= header(type:類型、length:整個數據包長度、xid:數據包編號)+match+flow_mod(添加、刪除、修改交換機的流表信息)+action[]
6)OFPT_ECHO:沒有數據包交換時,控制器定期發送OFPT_ECHO_REQUEST消息,交換機回覆OFPT_ECHO_REPLY,確保通信順暢。

主要參考了[我對OpenFlow的理解](https://blog.csdn.net/haidalongjuanfeng/article/details/61196489)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章