OVS學習過程2

1 初識OVS(open vswitch)

OVS是一個高質量,多層虛擬交換機,目的就是讓大規模網絡自動化可以通過編程擴散,同時仍然支持標準的管理接口協議:openflow等。
虛擬交換機的意思就是利用軟件的方式形成交換部件,所以也叫軟件交換機,跟傳統的物理交換機相比,虛擬交換機具有河大的優點
1、配置靈活可編程,靠軟件實現,一臺物理服務器上可以配置數十臺或者數百臺虛擬交換機,而且端口樹木可以靈活選擇。
2、成本低廉,通過軟件的方式可以輕易打倒10Gpbs的交換速度。
簡而言之,使用虛擬交換機做成的網絡代理,從而實現控制器端到硬件的通信。
Open vSwitch,根據其名就可以知道這是一個開放的虛擬交換機(open virtual switch);它是實現網絡虛擬化SDN的基礎,它是在開源的Apache2.0許可下的產品級質量的多層虛擬交換標準。設計這個Open vSwitch的目的是爲了解決物理交換機存在的一些侷限性:Open vSwitch較物理交換機而言有着更低的成本和更高的工作效率;一個虛擬交換機可以有幾十個端口來連接虛擬機,而Open vSwitch本身佔用的資源也非常小;可以根據自己的選擇靈活的配置,可以對數據包進行接收分析處理;同時還支持標準的管理接口和協議,如NetFlow、sFlow、SPAN、RSPAN等。

1.1 ovs組件

1. ovsdb-sever:ovs的數據庫服務器,用來存儲虛擬交換機啊的配置信息。它於manager和ovs-vswitch交換信息使用了ovsdb
2. ovs-vswitch: ovs的核心部件,它和上層controller通信通過openflow協議,它與ovsdb-server通信使用ovsdb相關協議,他的內核模塊同夥netlink通信,並且支持多哥獨立的datapath。
3. ovs kernel module:OVS的內核模塊,處理包交換和隧道,緩存flow,如果在內核的緩存中找到轉發規則則轉發,否則向用戶空間去處理

1.2 Open vSwtich模塊介紹

當前最新代碼包主要包括以下模塊和特性:

1.ovs-vswitchd :主要模塊,實現switch的daemon,包括一個支持流交換的Linux內核模塊;
2.ovsdb-server :輕量級數據庫服務器,提供ovs-vswitchd獲取配置信息;
3.ovs-brcompatd :讓ovs-vswitch替換Linux bridge,包括獲取bridge ioctls的Linux內核模塊;
4.ovs-dpctl: 用來配置switch內核模塊;
5一些Scripts and specs: 輔助OvS安裝在Citrix XenServer上,作爲默認switch;
6.ovs-vsctl :查詢和更新ovs-vswitchd的配置;
7.ovs-appctl :發送命令消息,運行相關daemon;
8.ovsdbmonitor: GUI工具,可以遠程獲取OvS數據庫和OpenFlow的流表。
9.ovs-openflowd:一個簡單的OpenFlow交換機;
10.ovs-controller:一個簡單的OpenFlow控制器;
11.ovs-ofctl :查詢和控制OpenFlow交換機和控制器;
12.ovs-pki :OpenFlow交換機創建和管理公鑰框架;
13.ovs-tcpundump:tcpdump的補丁,解析OpenFlow的消息;

1.3 Open vSwtich 工作流程


一般的數據包在linux網絡協議棧中的流向爲黑色箭頭流向:從網卡上接受到數據包後層層往上分析,最後離開內核態,把數據傳送到用戶態。當然也有些數據包只是在內核網絡協議棧中操作,然後再從某個網卡發出去。

但當其中有openVswitch時,數據包的流向就不一樣了。首先是創建一個網橋:ovs-vsctl add-br br0;然後是綁定某個網卡:綁定網卡:ovs-vsctl add-port br0 eth0;這裏默認爲綁定了eth0網卡。數據包的流向是從網卡eth0上然後到openVswitch的端口vport上進入openVswitch中,然後根據key值進行流表的匹配。如果匹配成功,則根據流表中對應的action找到其對應的操作方法,完成相應的動作(這個動作有可能是把一個請求變成應答,也有可能是直接丟棄,也可以自己設計自己的action);如果匹配不成功,則執行默認的動作,有可能是放回內核網絡協議棧中去處理(在創建網橋時就會相應的創建一個端口連接內核協議棧的)。

其大概工作流程就是這樣了,在工作中一般在這幾個地方來修改內核代碼以達到自己的目的:第一個是在datapath.c中的ovs_dp_process_received_packet(struct vport *p, struct sk_buff *skb)函數內添加相應的代碼來達到自己的目的,因爲對於每個數據包來說這個函數都是必經之地;第二個就是自己去設計自己的流表了;第三個和第二個是相關聯的,就是根據流表來設計自己的action,完成自己想要的功能。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章