openvswitch

1.openvswitch與openflow 協(xié)議

1.1openflow協(xié)議

? ? ? ?SDN,即Software Defined Networking:軟件定義網(wǎng)絡(luò)。其本質(zhì)就是使控制平面與轉(zhuǎn)發(fā)平面分離開,使控制平面能運(yùn)行在獨(dú)立于網(wǎng)絡(luò)設(shè)備的高性能計(jì)算機(jī)上.

? ? ??SDN是一種思想,并非一種具體的技術(shù)。而OpenFlow協(xié)議,便是一種實(shí)現(xiàn)這種思想的具體實(shí)現(xiàn),是連接控制平面和轉(zhuǎn)發(fā)平面之間通信的橋梁。

openflow協(xié)議的基本內(nèi)容:

一、兩個(gè)實(shí)體是Switch跟Controller。Controller在網(wǎng)絡(luò)中相當(dāng)于上帝,可以知道網(wǎng)絡(luò)中所有的消息,可以給交換機(jī)下發(fā)指令。Switch就是一個(gè)實(shí)現(xiàn)Controller指令的實(shí)體,根據(jù)流表轉(zhuǎn)發(fā)。

二、table,flow,match,action:openflow交換機(jī)可以有多個(gè)table,每個(gè)table包含多條flow,flow由match+action組成,match為匹配字段,數(shù)據(jù)包L2到L4的信息;action為匹配match后所要執(zhí)行的操作,如指定端口出去,對(duì)報(bào)文進(jìn)行編輯等。

match字段
flow

例子:ovs-ofctl add-flow? br0 “in_port=1,nw_src=192.168.1.1,actions=mod_nw_src:192.181.137.1,output:2”?

三、openflow消息:分為三大類,controller-to-switch,Asynchronous,Sysmetic

?Controller-to-Switch

控制器所發(fā)起的消息:

1)??????Feature:查詢交換機(jī)能力;

2)??????Configuration:設(shè)置或者查詢配置參數(shù);

3)??????Modify-State:增刪改流表或者組表?xiàng)l目,設(shè)置交換機(jī)端口屬性

4)??????Packet-Out: 這個(gè)消息用于控制器指定從交換機(jī)的特定端口發(fā)送數(shù)據(jù)包,或者用于轉(zhuǎn)發(fā)通過Packet-in消息接收到的數(shù)據(jù)包。Packet-out消息中包含一個(gè)完整的數(shù)據(jù)包或者指針,以及action.

5)??????Barrier:用于控制器保證消息的依賴關(guān)系

Asynchronous

交換機(jī)發(fā)起的消息

1)??????Packet-In:對(duì)于出現(xiàn)flowentry mismatch的數(shù)據(jù)包,交換機(jī)向控制器發(fā)送packet-in事件。數(shù)據(jù)包本身要么被完全包含在packet-in消息中,要么被buffer在交換機(jī)中,反正都是等著控制器的Packet-out事件來處理就對(duì)了。

2)??????Flow-Removed: 交換機(jī)通知控制器已經(jīng)沒有了某個(gè)流表?xiàng)l目

3)??????Port-Status:當(dāng)端口配置或者狀態(tài)變化時(shí)通知控制器

Sysmetic

兩方都可以發(fā)起的消息,不用協(xié)商,分為以下三類:

1)??????Hello:交換機(jī)和控制器建立起連接后的維護(hù)消息

2)??????Echo:echo request和echo reply配對(duì)


openflow協(xié)議報(bào)文格式

openflow協(xié)議報(bào)文格式

struct ofp_header {

uint8_t version;?

uint8_t type;

ovs_be16 length;

ovs_be32 xid;? ?/* Transaction id associated with this packet. Replies use the same id as was in the request to facilitate pairing. */

};

packet out報(bào)文內(nèi)容
switch featrues
packet out 消息報(bào)文

openvswitch-2.3.2/lib/ofp-util.h定義了所有所有消息的內(nèi)容結(jié)構(gòu)

1.2openvswitch簡(jiǎn)介

? ? ? ?openvswitch(ovs)是openflow協(xié)議的具體實(shí)現(xiàn),可以實(shí)現(xiàn)基于linux內(nèi)核的軟件交換機(jī),是一個(gè)開源軟件。一個(gè)虛擬交換機(jī)可以有幾十個(gè)端口來連接虛擬機(jī)虛擬網(wǎng)卡,虛擬機(jī)發(fā)出的數(shù)據(jù)包通過ovs交換機(jī)利用流表進(jìn)行轉(zhuǎn)發(fā),通過連接物理網(wǎng)卡將數(shù)據(jù)往外發(fā)。


應(yīng)用


ovs系統(tǒng)框架

ovs-vswitchd 主要模塊,實(shí)現(xiàn)switch的daemon,包括一個(gè)支持流交換的Linux內(nèi)核模塊;

ovsdb-server 輕量級(jí)數(shù)據(jù)庫(kù)服務(wù)器,提供ovs-vswitchd獲取配置信息;

ovs-vsctl 查詢和更新ovs-vswitchd的配置,對(duì)ovsdb進(jìn)行操作;

ovs-appctl:主要是向OVS守護(hù)進(jìn)程發(fā)送命令的;

ovs-ofctl 查詢和控制OpenFlow交換機(jī)和控制器;

ovs-dpctl:一個(gè)工具,用來配置交換機(jī)內(nèi)核模塊,可以控制轉(zhuǎn)發(fā)規(guī)則。

openvswitch.ko為L(zhǎng)inux內(nèi)核模塊,支持?jǐn)?shù)據(jù)流在內(nèi)核的交換

1.3ovs源碼安裝

1.下載解壓

2../configure --with-linux=/lib/modules/$(uname -r)/build 編譯ovs linux內(nèi)核模塊

3.make&make install

4.make modules_install? ? ?所做的動(dòng)作 1.將編譯好的模塊放入/lib/module/`uname -r`下 2.用depmod更新modules.dep文件

5.modprobe openvswitch/gre/vxlan 加載ovs內(nèi)核模塊?lsmod | grep openvswitch查看

6.配置ovsdb? ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema(默認(rèn)db模板)

7.啟動(dòng)ovsdb

ovsdb-server /root/software/openvswitch2.8.1/etc/openvswitch/conf.db --remote=punix:/root/software/openvswitch2.8.1/var/run/openvswitch/db.sock \ --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile=/var/run/ovsdb.pid --detach \

8.啟動(dòng)ovs-vswitch進(jìn)程

ovs-vswitchd unix:/root/software/openvswitch2.8.1/var/run/openvswitch/db.sock --pidfile=/var/run/ovs.pid --detach --log-file=/var/log/ovs.log


2 ovs源碼分析

ovs代碼結(jié)構(gòu):

從圖中可以看出 OVS 的分層結(jié)構(gòu),最上層 vswitchd 主要與 ovsdb 通信,做配置下發(fā)和更新等,中間層是 ofproto ,用于和 OpenFlow 控制器通信,并基于下層的 ofproto provider 提供的接口,完成具體的設(shè)備操作和流表操作等工作。

dpif 層實(shí)現(xiàn)對(duì)流表的操作。

netdev 層實(shí)現(xiàn)了對(duì)網(wǎng)絡(luò)設(shè)備(如 Ethernet)的抽象


ovs主干

一個(gè)connmgr對(duì)應(yīng)多個(gè)ofconn(如一個(gè)網(wǎng)橋連接多個(gè)控制器,則需要建立相應(yīng)多個(gè)ofconn實(shí)例;和ofctl等工具連接時(shí)也要建立ofconn實(shí)例);一個(gè)ofconn對(duì)應(yīng)一個(gè)rconn;一個(gè)rconn對(duì)應(yīng)多個(gè)vconn(因?yàn)楹涂刂破鹘⑦B接外,可能還會(huì)實(shí)現(xiàn)snoop功能,即監(jiān)測(cè)并復(fù)制交互的of消息,則一個(gè)rconn會(huì)對(duì)應(yīng)一個(gè)vconn和一個(gè)vconn結(jié)構(gòu)體類型的數(shù)組monitor。

ovs主干

由于openvswitch用戶態(tài)代碼相對(duì)復(fù)雜,首先從內(nèi)核模塊入手分析。

datapath為 ovs內(nèi)核模塊,負(fù)責(zé)執(zhí)行數(shù)據(jù)處理,也就是把從接收端口收到的數(shù)據(jù)包在流表中進(jìn)行匹配,并執(zhí)行匹配到的動(dòng)作。一個(gè)datapath可以對(duì)應(yīng)多個(gè)vport,一個(gè)vport類似物理交換機(jī)的端口概念。一個(gè)datapth關(guān)聯(lián)一個(gè)flow table,一個(gè)flow table包含多個(gè)條目,每個(gè)條目包括兩個(gè)內(nèi)容:一個(gè)match/key和一個(gè)action。

內(nèi)核數(shù)據(jù)流向

一般的數(shù)據(jù)包在linux網(wǎng)絡(luò)協(xié)議棧中的流向?yàn)樗{(lán)色箭頭流向:從網(wǎng)卡上接受到數(shù)據(jù)包后層層往上分析,最后離開內(nèi)核態(tài),把數(shù)據(jù)傳送到用戶態(tài)。當(dāng)然也有些數(shù)據(jù)包只是在內(nèi)核網(wǎng)絡(luò)協(xié)議棧中操作,然后再?gòu)哪硞€(gè)網(wǎng)卡發(fā)出去。當(dāng)有 OVS時(shí),數(shù)據(jù)流向如紅色所示:從網(wǎng)卡 eth0收到報(bào)文后進(jìn)入ovs的端口,根據(jù) key值進(jìn)行流表匹配,如果匹配成功執(zhí)行流表對(duì)應(yīng)的 action;如果失敗通過upcall送入用戶態(tài)處理。

通過vport注冊(cè)的回調(diào)函數(shù)netdev_frame_hook()->netdev_frame_hook()-> netdev_port_receive()->ovs_vport_receive()處理接收?qǐng)?bào)文,ovs_flow_key_extract()函數(shù)生成flow的key內(nèi)容用以接下來進(jìn)行流表匹配,最后調(diào)用ovs_dp_process_packet()函數(shù)進(jìn)入真正的ovs數(shù)據(jù)包處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容