OVS 總體架構 原始碼結構及資料流程全面解析

2021-09-08 13:48:27 字數 3024 閱讀 1471

在前文「從 bridge 到 ovs」中,我們已經對 ovs 進行了一番探索。本文決定從 ovs 的整體架構到各個元件都進行乙個詳細的介紹。

ovs 是產品級的虛擬交換機,大量應用在生產環境中,支撐整個資料中心虛擬網路的運轉。ovs 基於 sdn 的思想,將整個核心架構分為控制面和資料面,資料面負責資料的交換工作,控制面實現交換策略,指導資料面工作。

從整體上看,ovs 可以劃分為三大塊,管理面、資料面和控制面。

資料面就是以使用者態的 ovs-vswitchd 和核心態的 datapath 為主的**模組,以及與之相關聯的資料庫模組 ovsdb-server,控制面主要是由 ovs-ofctl 模組負責,基於 openflow 協議與資料面進行互動。而管理面則是由 ovs 提供的各種工具來負責,這些工具的提供也是為了方便使用者對底層各個模組的控制管理,提高使用者體驗。下面就對這些工具進行乙個逐一的闡述。

ovs-ofctl:這個是控制面的模組,但本質上它也是乙個管理工具,主要是基於 openflow 協議對 openflow 交換機進行監控和管理,通過它可以顯示乙個 openflow 交換機的當前狀態,包括功能、配置和表中的項。使用時,有很多引數,我們可以通過 ovs-ofctl --help 檢視。

常用命令:

ovs-ofctl show switch-name :輸出交換機資訊,包括其流量表和埠資訊。

ovs-ofctl dump-ports switch-name:輸出交換機的埠統計資訊,包括收發包、丟包、錯誤包等數量。

ovs-ofctl add-flow switch-name:為交換機配置流策略。

ovs-dpctl:用來配置交換機的核心模組 datapath,它可以建立,修改和刪除 datapath,一般,單個機器上的 datapath 有 256 條(0-255)。一條 datapath 對應乙個虛擬網路裝置。該工具還可以統計每條 datapath 上的裝置通過的流量,列印流的資訊等,更過引數通過 ovs-dpctl --help 檢視。

常用命令:

ovs-dpctl show :顯示所有 datapath 的基本資訊。

ovs-dpctl dump-dps :顯示所有 datapath 的名字。

ovs-dpctl dump-flows dp :顯示一條 datapath dp 上的流資訊。

ovs-vsctl
常用命令:

ovs-vsctl show :顯示主機上已有的網橋及埠資訊。

ovs-vsctl add-br br0:新增網橋 br0。

ovsdb-client
:訪問 ovsdb-server 的客戶端程式,通過 ovsdb-server 執行一些資料庫操作。

常用命令:

ovsdb-client dump:用來檢視ovsdb內容。

ovsdb-client transact :用來執行一條類 sql。

ovsdb-toolovs 原始碼結構中,主要包含以下幾個主要的模組,資料交換邏輯在 vswitchd 和 datapath 中實現,vswitchd 是最核心的模組,openflow 的相關邏輯都在 vswitchd 中實現,datapath 則不是必須的模組。ovsdb 用於儲存 vswitch 本身的配置資訊,如埠、拓撲、規則等。控制面部分採用的是 ovs 自家實現的 ovn,和其他控制器相比,ovn 對 ovs 和 openstack 有更好的相容性和效能。

從圖中可以看出 ovs 的分層結構,最上層 vswitchd 主要與 ovsdb 通訊,做配置下發和更新等,中間層是 ofproto ,用於和 openflow 控制器通訊,並基於下層的 ofproto provider 提供的介面,完成具體的裝置操作和流表操作等工作。

dpif 層實現對流表的操作。

netdev 層實現了對網路裝置(如 ethernet)的抽象,基於 netdev provider 介面實現多種不同平台的裝置,如 linux 核心的 system, tap, internal 等,dpdk 系的 vhost, vhost-user 等,以及隧道相關的 gre, vxlan 等。

通過乙個例子來看看 ovs 中資料報是如何進行**的。

1)ovs 的 datapath 接收到從 ovs 連線的某個網路埠發來的資料報,從資料報中提取源/目的 ip、源/目的 mac、埠等資訊。

2)ovs 在核心態檢視流表結構(通過 hash),如果命中,則快速**。

3)如果沒有命中,核心態不知道如何處置這個資料報,所以,通過 netlink upcall 機制從核心態通知使用者態,傳送給 ovs-vswitchd 元件處理。

4)ovs-vswitchd 查詢使用者態精確流表和模糊流表,如果還不命中,在 sdn 控制器接入的情況下,經過 openflow 協議,通告給控制器,由控制器處理。

5)如果模糊命中, ovs-vswitchd 會同時重新整理使用者態精確流表和核心態精確流表,如果精確命中,則只更新核心態流表。

6)重新整理後,重新把該資料報注入給核心態 datapath 模組處理。

7)datapath 重新發起選路,查詢核心流表,匹配;報文**,結束。

ovs 為了方便使用者操作,提供了很多管理工具,我們平常在使用過程中只需記住每個工具的作用,具體的命令可以使用 -h 或 --help 檢視。

OVS原始碼結構分析

下圖是ovs open vswitch 系統層面的邏輯圖。其中datapath是處於系統的核心層 kernel space 我們可以將datapath理解為乙個網橋 linux bridge 處於使用者態 user space 的主要是openvswitch client openflow clie...

jQuery 總體原始碼結構筆記

最外層是乙個自呼叫函式 function window,undefined 將jquery.prototype簡寫為jquery.fn jquery.fn jquery.prototype 構造jquery例項的時候重新制定了init函式的原型 jquery.fn.init.prototype jq...

scrapy原始碼解讀(一)框架總體結構

閱讀本文的前提是你已經對scrapy有了基本的認識,或是已經使用scrapy寫過資料抓取專案。scrapy框架由多個元件組合而成,要採集的資料經過網路響應後返回流過各個元件,經過一些處理 如格式校驗,過濾去重,異常資料拋棄 最終儲存到指定的檔案或資料庫中。下面是scrapy data flow 圖,...