一、Open vSwitch?數據包轉發模式
????????Open vSwitch 根據不同的模塊使用,主要分為兩種數據包的轉發模式:Datapath 模式和 DPDK 模式,這兩種模式的主要區別在于:
- ?Datapath 模式:
- ?使用內核空間的網絡棧進行數據包的轉發
- 性能相對較低,但配置和管理相對簡單
- 適用于一般的虛擬化部署場景
- DPDK 模式:
- ?使用 DPDK 庫在用戶空間進行數據包的轉發
- 性能更高,但配置和管理相對復雜
- 適用于對性能要求更高的場景,如高吞吐量的網絡功能虛擬化(NFV)部署
????????這里需要注意的是,Datapath 模式工作在內核空間,而?DPDK 模塊工作在用戶空間。在實際應用中,具體使用哪種模式需要取決于具體的部署需求和環境。一般來說,如果對性能要求不太高,可以選擇 Datapath 模式;而對于需要更高性能的場景,比如NFV部署,則應該選擇 DPDK 模式。
二、Datapath 模式下的數據包轉發流程
(1)數據包處理流程
????????Open vSwitch 在 Datapath 模式下的數據包流程如下圖所示:
????????圖中紅色數字序號表示數據包轉發的步驟順序,以下步驟序號和圖中紅色序號一一對應:
1、數據包接收
????????Open vSwitch 從設備接口中獲取數據包并交給 Datapath 內核模塊。在收到數據包后,Datapath 模塊負責檢查數據包的頭部信息以進行流表匹配,如果匹配成功,則根據轉發規則進行轉發;如果匹配不到相應的流表,那么就需要通過 upcall 調用讓 vswitchd 守護進程生成新的流表。
2、upcall 調用
????????數據包在 Datapath 模塊無法匹配到流表的情況下,通過 upcall 調用,并將該數據包通過 Netlink 傳輸到 vswitchd 守護進程。
3、流表獲取
????????vswitchd 守護進程與控制器(一般是 SDN 控制器)通信,控制器將相應的流表通過?OpenFlow 協議發回 vswitchd 守護進程。
4、流表下發
????????vswitchd 守護進程將獲取到的流表緩存到內核態的 Flow Table 中。
5、reinject 發回數據包
????????vswitchd 守護進程將數據包送回?Datapath 模塊中,即將數據包重新注入到 OVS 的數據包處理流程中。
6、流表同步
????????Flow Table 將緩存的流表內容同步至?Datapath 模塊,以備查詢。
7、數據包發送
????????Datapath 模塊檢查數據包的頭部信息以進行流表匹配,將匹配成功的數據包根據相應規則進行數據包的處理,然后將處理后的數據包送至設備接口發出。
(2)數據包路徑
????????根據數據包能否在?Datapath 模塊立刻匹配到相應流表,Open vSwitch 在進行數據包轉發時會用到兩種不同的流程,分別稱為快速路徑和慢速路徑,如下圖所示:
(1)快速路徑
????????如果在 Datapath 模塊中已經存在可以匹配的流表,則數據包會直接轉發,對應處理流程中的(1→7)步驟。很容易發現,在這種情況下數據包完全由內核空間處理,是不需要經過用戶態的,所以效率相對會比較高,所以我們稱為快速路徑,對應上圖中的直線。快速路徑一般為數據包的非首次處理流程(因為之前有過類似的包已經生成好了流表)。
(2)慢速路徑
????????如果在 Datapath 模塊中無法匹配相應的流表,則需要 OVS 先生成流表,再將數據包根據流表進行轉發,此時對應處理流程中的(1→2→3→4→5→6→7)步驟。在這過程中需要將數據包發送至用戶態,并通過?vswitchd 守護進程進行一系列的操作,再將數據包發回,效率相對較低,所以我們稱為慢速路徑,對應上圖中的曲線。慢速路徑一般為數據包的首次處理流程(因為之前沒有過類似的包,需要生成新的流表)。
三、DPDK 模式下的數據包轉發流程
????????Open vSwitch 在 DPDK 模式下的數據包流程如下圖所示:
????????相對于 Open vSwitch 在 Datapath 模式下的數據包流程,DPDK 使用用戶態的網絡棧,繞過了內核網絡協議棧(Datapath 模塊)的開銷,從而實現了更高的數據包轉發性能。然而從本質上將,數據包處理的步驟區別不大,主要的不同在于將原本在內核態進行的數據包的匹配和操作邏輯轉移到了用戶態。
????????對于快速路徑而言,DPDK 可以避免內核網絡協議棧帶來的性能開銷,如系統調用、上下文切換等。對于慢速路徑而言,DPDK 采用了零拷貝的數據傳輸機制,數據包可以直接在內存中傳輸,而不需要在用戶態和內核態之間進行拷貝,大幅降低了數據傳輸的開銷。
結語:
? ? ? ? 通常情況下,我們所說的?Open vSwitch 數據包轉發流程指的是在 Datapath 模式下的數據包流程,因為這個是最經典也是最常見的。不過 DPDK 模式提供了一種全新的思路,令?OVS 的整體性能有了較大的提升,將會是未來的發展趨勢。出于學習和一般場景的使用 Datapath 模式足以花費珍貴而有限的事件,并且二者在流程和結構上大同小異,所以本系列文章主要以 Datapath 模式為主進行撰寫,之后也會更新?DPDK 模式的相關內容。
????????由于本人水平有限,以上內容如有不足之處歡迎大家指正(評論區/私信均可)。
參考資料:
Open vSwitch 官網
Open vSwitch 源代碼 GitHub
2015 FOSDEM - OVS Stateful Services
Open vSwitch v3.3.0 源代碼閱讀
OVS - 數據包處理流程_ovs的工作流程-CSDN博客
Open vSwitch 2.3.90 源碼閱讀筆記(上) | SDNLAB