一、 ovs各大組件示意圖
ovs-vswitchd:ovs守護進程,實現基於流的交換,實現內核datapath upcall 處理以及ofproto 查表,同時是dpdk datapath處理程序。與ovsdb-server通信使用OVSDB協議,與內核模塊使用netlink機制通信,與controller通信使用OpenFlow協議。
ovsdb-server:OVS輕量級的數據庫服務器的服務程序,用於保存整個OVS的配置信息。數據庫服務程序, 使用目前普遍認可的ovsdb 協議。
ovs-vsctl:網橋、接口等的創建、刪除、設置、查詢等。
ovs-dpctl:配置vswitch內核模塊
ovs-appctl:發送命令消息到ovs-vswithchd, 查看不同模塊狀態
ovs-ofctl:下發流表信息。該命令可以配置其他openflow 交換機(采用openflow 協議)
datapath: Datapath把流的match和action結果緩存,避免后續同樣的流繼續upcall到用戶空間進行流表匹配。
ovs-db:開放虛擬交換機數據庫是一種輕量級的數據庫,它是一個JSON文件,默認路徑:/etc/openvswitch/conf.db
二、 ovs報文轉發過程
三、 ovs常用命令
查看open vswitch的網絡狀態 ovs-vsctl show
添加網橋 ovs-vsctl add-br br0
刪除網橋 ovs-vsctl del-br br0
ovs-vsctl --timeout=2 --if-exists del-br br0
查詢網橋是否存在 ovs-vsctl br-exists br0
列出所有網橋
顯示存在Vlan的網橋
顯示網橋的父橋 ovs-vsctl list-br
ovs-vsctl br-to-vlan br0
ovs-vsctl br-to-parent br0
查看 Open vSwitch 中的端口信息 ovs-ofctl show ovs-switch
查看交換機中的所有 Table ovs-ofctl dump-tables ovs-switch
ovs-ofctl dump-tables-desc ovs-switch
查看交換機中的所有流表項
查看br0上各個交換機端口的狀態 ovs-ofctl dump-flows ovs-switch
ovs-ofctl dump-ports br0
ovs-ofctl dump-ports-desc br0
查看內核中的數據通路
查看內核中的流表 ovs-dpctl show
ovs-dpctl dump flows
四、ovs和linux bridge
linux bridge運行在linux內核中,數據報文不會離開內核,通過mac地址匹配,實現簡單的轉發功能。
ovs需要匹配流表規則,兼具內核態和用戶態。一般情況下,一個數據流的第一個報文會發向ovs-vswitchd,后續報文會直接利用內核中的流表緩存進行處理。
五、dpdk
dpdk
是一組快速處理數據包的開發平台及接口。有intel主導開發,主要基於Linux系統,用於快速數據包處理的函數庫與驅動集合,可以極大提高數據處理性能和吞吐量,提高數據平面應用程序的工作效率。
dpdk作用
在數據平面應用中為快速處理數據包提供一個簡單而完善的架構。在理解此工具集之后,開發人員可以以此為基礎進行新的原型設計處理大並發網絡數據請求。
當前數據包的處理流程是這樣:
數據包到達網卡,網卡發送中斷通知CPU,CPU將數據包拷貝到內核空間中,應用程序從內核空間中拷貝數據到用戶態空間,數據處理。
在這個過程中數據包處理耗時的操作有:
網卡每次收到數據都發送中斷,打斷cpu的工作。切換和恢復過程都耗時
網絡數據包經過TCP/IP協議棧,達到真正的應用處理程序時走過很多的流程
應用程序拿到網絡數據時需要經過內核空間到用戶態空間的一次copy,增加耗時
dpdk解決辦法
DPDK技術是重載網卡驅動,直接將數據傳遞給用戶態的應用程序,避免了中間環節的經過TCP/IP協議棧,內核空間到用戶空間的copy。
同時針對第一點網卡頻繁的中斷,應用程序可以使用輪詢的方式獲取網卡上的數據,避免中斷造成的場景切換和恢復浪費的時間。
dpdk優缺點
DPDK繞過了內核空間,ovs-DPDK的datapath存在於用戶空間,能大幅提升網絡性能,並且已經在一些對網絡性能有要求的場合使用,例如NFV。
對於SDN controller來說,因為連接的是ovs-vSwitchd和ovsdb-server,所以感覺不到差異。
雖然DPDK在一定程度上解決了性能的問題,並且DPDK社區在不斷的進行優化,但是DPDK也有其自身的問題:
首先,DPDK沒有集成在操作系統中,使用DPDK就需要額外的安裝軟件,這增加了維護成本。
其次,繞過了Linux內核空間,也就是繞過了網絡協議棧,這使得基於DPDK的應用更難調試和優化,因為大量的基於Linux kernel網絡調試監控工具在DPDK下不可用了。
第三個問題,DPDK獨占了部分CPU和內存,這實際上分走了本該用來運行應用程序的資源,最直觀的感受是,使用了DPDK之后,主機可以部署的虛機數變少了。
六、流表
一個最簡單的流表由3部分組成,分別是:匹配項 ,動作 ,計數器。
流表(低版本)可以匹配OSI模型的1層至4層,如下圖所示,對匹配到的流表做轉發、丟棄或者更復雜的操作。具體的匹配項如下圖所示:
流表字段含義
priority:表示優先級,取值越大,優先級越高,匹配table n時,從優先級高的開始匹配。
in_port:數據包進入端口,用於輸出端口時,只允許入端口發送的數據包通過。
dl_vlan:數據包的vlan。
dl_vlan_pcp=priority:VLAN 優先級,改值取值區間為[0-7]。數字越大,表示優先級越高。
dl_src=<MAC>,dl_dst=<MAC>:匹配源或者目標的 MAC
地址01:00:00:00:00:00/01:00:00:00:00:00 代表廣播
地址00:00:00:00:00:00/01:00:00:00:00:00 代表單播
dl_type=ethertype:匹配以太網協議類型,其中:dl_type=0x0800 代表 IPv4 協議,dl_type=0x086dd 代表 IPv6 協議,dl_type=0x0806 代表 ARP 協議
nw_src=ip[/netmask],nw_dst=ip[/netmask]:當 dl_typ=0x0800 時,匹配源或者目標的 IPv4 地址,可以使 IP 地址或者域名
nw_proto=proto:和 dl_type 字段協同使用。當 dl_type=0x0800 時,匹配 IP 協議編號,當 dl_type=0x086dd 代表 IPv6 協議編號
table=number:指定要使用的流表的編號,范圍是 0-254。在不指定的情況下,默認值為 0 通過使用流表編號,可以創建或者修改多個 Table 中的 Flow
reg<idx>=value[/mask]:交換機中的寄存器的值。當一個數據包進入交換機時,所有的寄存器都被清零,用戶可以通過 Action 的指令修改寄存器中的值
tp_src=number:TCP/UDP/SCTP 源端口
tp_dst=number:TCP/UDP/SCTP 目的端口
output:如果沒有指定組行動,報文就會按照 output 行動中指定的端口轉發。Output 行動最后執行。如果組行動和輸出行動均存在,那么組行動優先級高。如果兩者均不存在,那么報文被丟棄。
mod_vlan_vid:修改數據包的 VLAN tag
strip_vlan:剝離數據包的 VLAN tag
mod_dl_src/ mod_dl_dest:修改源MAC或目的MAC 地址
mod_nw_src/mod_nw_dst:修改源IPv4 地址或者目的IPv4 地址
resubmit(,n):轉至table n重新進行匹配
load:value−>dst[start..end]:寫數據到指定的字段
normal:代表傳統的非 OpenFlow 流水線。僅可用於為一個輸出端口,使用普通的流水線處理數據包。如果交換機不能轉發數據包從 OpenFlow 流水線到普通流水線,它必須表明它不支持這一行動。
actions:行動集,對數據包的處理行動