前面用了兩天時間了解了OpenvSwitch的結構,今天參考其他資料加自己的心得做個總結
一. openvswitch的安裝和使用
在前一篇文章中詳細的介紹了OpenvSwitch的安裝和使用,不再贅述
二. openvswitch的代碼框架
上圖(來自於別人的博客)簡單但是很好的展示了OpenvSwitch的結構框架,最上面的遠程層運行着OpenFlow控制器,可以是ryu,Floodlight等等,用來作為SDN的控制平面,下面兩層:用戶層和內核層分別為OpenvSwitch的具體邏輯實現,下面分別介紹:
首先介紹用戶層
用戶層的功能如下:作為守護程序他們實現了交換機和流表,是OpenvSwitch的核心,提供了一些組件去管理交換機,實現了數據庫,對內核進行直接的管理
主要包含三個守護程序:ovs-vswitchd, ovsdb-server, ovs-brcompatd(暫時用不到)
ovs-vswitchd是交換機的核心,它實現了虛擬交換機,通過netlink協議直接和虛擬機進行通信。ovs-vswitchd將交換機的配置保存在數據庫里面,修改也是通過數據庫,這個數據庫是通過ovsdb-server來直接管理的,因此ovs-vswitchd會通過Unix socket和ovsdb-server通信。
前面提到用戶空間通過netlink和內核空間通信,netlink定義了一些命令,去get/set/add/delete datapath/flow/vport,在特定的數據包上執行操作。
控制datapath的命令有OVS_DP_CMD_UNSPEC, OVS_DP_CMD_NEW, OVS_DP_CMD_DEL, OVS_DP_CMD_GET, OVS_DP_CMD_SET
實現這些命令的對應的內核函數為ovs_dp_cmd_new(), ovs_dp_cmd_del(), ovs_dp_cmd_get(), ovs_dp_cmd_set()
對vport和flow定義了同樣的函數,不再贅述
三. 數據包在OpenvSwitch中的處理流程
上圖(來自於sdnlab.com)非常形象的展示了數據包的流向:一般的數據包在linux網絡協議棧中的流向為黑色箭頭流向,而如果有了OpenvSwitch,則是紅色箭頭流向。OpenvSwitch轉發和接收數據包的處理流程不一樣,分開講述。
1. 轉發
vport是OpenvSwitch定義的一個非常重要的模塊,一旦他接收到數據包,他會通過這個數據包的2-4層來構建一個獨一無二的鍵值,內核會用這個鍵值來查看流表,如果匹配成功,則會直接對數據包執行相應的操作,如果匹配不成功,OpenvSwitch會通過upcall函數將數據包傳送給用戶層,用戶層守護程序-ovs-vswitchd會通過數據庫確定數據包的目的端口,然后通過OVS_ACTION_ATTR_OUTPUT命令告訴內核應該將數據包轉向哪個端口,OVS_PACKET_CMD_EXECUTE讓內核執行剛才的命令。
2. 接收
和轉發處理非常類似,但是他是通過vport綁定了網卡,注冊了一個接收函數hook,一旦網卡接收到數據包,OpenvSwitch會將數據包轉發給用戶層進行處理。
除了上面提到的命令,內核還定義了一些操作
OVS_ACTION_ATTR_USERSPACE: 告訴內核將數據包轉發給用戶層
OVS_ACTION_ATTR_SET:更新數據包頭
等等
四. 命令和縮寫以及名詞解釋解釋
- genl: generic netlink
- fast path 和slow path:這兩個概念在FLowVisor里面就涉及過,fast path就是指在datapath中可以匹配成功流表,直接進行處理,如果匹配失敗,則會上傳到用戶空間,消耗時間,這時slow path
- ovs-vsctl: openvswitch control:管理OpenvSwitch
- ovs-dpctl: dapapath control,不通過ovs-vswitchd來直接管理datapath
- ovsdb-client: 直接通過ovs-server數據庫操作
- ovsdb-tool: 不通過ovs-server來直接操控數據庫
至此,應該對OpenvSwitch有了很好的了解,如果按照程序再走一邊流程,相信對OpenvSwitch的理解會更加加深一些。