本發(fā)明專(zhuān)利技術(shù)涉及軟件流控技術(shù)領(lǐng)域,尤其涉及一種基于零拷貝和Linux內(nèi)核的軟件流控方法及其系統(tǒng)。方法包括:用零拷貝方式獲取網(wǎng)卡上的數(shù)據(jù)包;判斷數(shù)據(jù)包是否需要流控;如果數(shù)據(jù)包需要流控,則將數(shù)據(jù)包打上流控隊(duì)列號(hào)標(biāo)記;將打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包發(fā)送到Linux內(nèi)核的虛擬網(wǎng)卡上;將接收到的打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包轉(zhuǎn)換為內(nèi)核打上標(biāo)記后的數(shù)據(jù)包;對(duì)該數(shù)據(jù)包進(jìn)行流量控制,以產(chǎn)生流控后的數(shù)據(jù)包。本發(fā)明專(zhuān)利技術(shù)提供的基于零拷貝和Linux內(nèi)核的軟件流控方法及其系統(tǒng),結(jié)合了零拷貝和Linux內(nèi)核TC流控各自的優(yōu)點(diǎn),采用虛擬網(wǎng)卡的方式連接內(nèi)核和零拷貝機(jī)制,解決了轉(zhuǎn)發(fā)性能和流控之間的矛盾,實(shí)現(xiàn)了大流量下高效的流量控制。
【技術(shù)實(shí)現(xiàn)步驟摘要】
基于零拷貝和Linux內(nèi)核的軟件流控方法及其系統(tǒng)
本專(zhuān)利技術(shù)涉及軟件流控
,尤其涉及一種基于零拷貝和Linux內(nèi)核的軟件流控方法及其系統(tǒng)。
技術(shù)介紹
隨著“大數(shù)據(jù)”與“云計(jì)算”概念的提出,各種移動(dòng)訪問(wèn)、應(yīng)用資源、云端服務(wù)也不斷涌現(xiàn)出來(lái),帶寬需求不斷擴(kuò)大,對(duì)帶寬資源的占用也越來(lái)越高,如果不加以限制,會(huì)嚴(yán)重消耗企業(yè)的帶寬資源,從而影響正常的業(yè)務(wù)數(shù)據(jù)傳輸。 在這種情形下,軟件流控也變得越來(lái)越重要,當(dāng)前主流的軟件流控實(shí)現(xiàn)方法有兩種:一種方法是基于Linux內(nèi)核提供的流量控制(Traffic Control,以下簡(jiǎn)稱(chēng)TC)組件,該方法的優(yōu)點(diǎn)是Linux內(nèi)核和TC組件提供了豐富的功能支持,可以根據(jù)用戶(hù)需求較快的開(kāi)發(fā)新功能,缺點(diǎn)是所有數(shù)據(jù)包均需要經(jīng)過(guò)Linux內(nèi)核轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)性能較低。另一種方法是基于零拷貝技術(shù),用戶(hù)態(tài)程序可直接從網(wǎng)卡上讀取數(shù)據(jù)包,并實(shí)現(xiàn)流控算法,該方法的優(yōu)點(diǎn)是轉(zhuǎn)發(fā)性能高,缺點(diǎn)是用戶(hù)需要自己重頭開(kāi)發(fā)流控框架,實(shí)現(xiàn)起來(lái)復(fù)雜度大。 鑒于以上內(nèi)容,有必要提供一種能克服以上缺點(diǎn)的流控方法。
技術(shù)實(shí)現(xiàn)思路
本專(zhuān)利技術(shù)的目的在于提供一種基于零拷貝和Linux內(nèi)核的軟件流控方法及其系統(tǒng),以解決以上技術(shù)問(wèn)題。 本專(zhuān)利技術(shù)是這樣實(shí)現(xiàn)的,一種基于零拷貝和Linux內(nèi)核的軟件流控方法,包括以下步驟:用零拷貝方式獲取網(wǎng)卡上的數(shù)據(jù)包的步驟;判斷所述數(shù)據(jù)包是否需要流控的步驟;如果所述數(shù)據(jù)包需要流控,則將所述數(shù)據(jù)包打上流控隊(duì)列號(hào)標(biāo)記的步驟;通過(guò)虛擬網(wǎng)卡驅(qū)動(dòng)提供的接口,將打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包發(fā)送到Linux內(nèi)核的虛擬網(wǎng)卡上的步驟;將接收到的所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包轉(zhuǎn)換為內(nèi)核打上標(biāo)記后的數(shù)據(jù)包的步驟;以及利用Iinux內(nèi)核TC模塊對(duì)所述內(nèi)核打上標(biāo)記后的數(shù)據(jù)包進(jìn)行流量控制,以產(chǎn)生流控后的數(shù)據(jù)包的步驟。 較優(yōu)的,所述將接收到的所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包轉(zhuǎn)換為內(nèi)核打上標(biāo)記后的數(shù)據(jù)包的步驟進(jìn)一步包括;所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包中的網(wǎng)絡(luò)數(shù)據(jù)包轉(zhuǎn)換為Iinux內(nèi)核存儲(chǔ)的sk_buff格式數(shù)據(jù)包的步驟;以及根據(jù)所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包的標(biāo)記值,將所述sk_buff格式數(shù)據(jù)包打上標(biāo)記的步驟。 較優(yōu)的,還包括:用戶(hù)態(tài)程序通過(guò)虛擬網(wǎng)卡驅(qū)動(dòng)提供的接口接收所述流控后的數(shù)據(jù)包,并用零拷貝方式將所述流控后的數(shù)據(jù)包發(fā)送到網(wǎng)卡的步驟。 較優(yōu)的,所述將接收到的所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包轉(zhuǎn)換為內(nèi)核打上標(biāo)記后的數(shù)據(jù)包的步驟是由Iinux內(nèi)核的虛擬網(wǎng)卡實(shí)現(xiàn)。 較優(yōu)的,所述流控隊(duì)列號(hào)標(biāo)記的值是所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包對(duì)應(yīng)在Linux內(nèi)核TC的流控隊(duì)列號(hào)。 本專(zhuān)利技術(shù)的另一目的是提供一種基于零拷貝和Linux內(nèi)核的軟件流控系統(tǒng),包括:網(wǎng)卡,連接于流控判斷模塊,通過(guò)網(wǎng)卡零拷貝驅(qū)動(dòng),獲取所述網(wǎng)卡上的數(shù)據(jù)包,并將所述數(shù)據(jù)包發(fā)送到所述流控判斷模塊;所述流控判斷模塊,連接于流控隊(duì)列號(hào)標(biāo)記模塊,判斷所述數(shù)據(jù)包是否需要流控,如需要流控,則將所述數(shù)據(jù)包發(fā)送至所述流控隊(duì)列號(hào)標(biāo)記模塊,如不需要流控,則將所述數(shù)據(jù)包回傳至所述網(wǎng)卡;所述流控隊(duì)列號(hào)標(biāo)記模塊,連接于虛擬網(wǎng)卡模塊,將需要流控的所述數(shù)據(jù)包打上流控隊(duì)列號(hào)標(biāo)記,并將打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包發(fā)送到所述虛擬網(wǎng)卡模塊;所述虛擬網(wǎng)卡模塊,連接于流量控制模塊以及所述網(wǎng)卡,在Iinux內(nèi)核(圖中未示出)與所述網(wǎng)卡之間建立數(shù)據(jù)連接,對(duì)所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包轉(zhuǎn)換為內(nèi)核打上標(biāo)記后的數(shù)據(jù)包結(jié)構(gòu),并將所述內(nèi)核打上標(biāo)記后的數(shù)據(jù)包發(fā)送到所述流量控制模塊;以及所述流量控制模塊,對(duì)所述內(nèi)核打上標(biāo)記后的數(shù)據(jù)包進(jìn)行流量控制,以產(chǎn)生流控后的數(shù)據(jù)包,并通過(guò)所述虛擬網(wǎng)卡模塊將所述流控后的數(shù)據(jù)包傳送至所述網(wǎng)卡。 較優(yōu)的,所述流控判斷模塊是在用戶(hù)態(tài)程序收到所述數(shù)據(jù)包后,判斷所述數(shù)據(jù)包是否需要流控。 較優(yōu)的,所述流控隊(duì)列號(hào)標(biāo)記的值是所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包對(duì)應(yīng)在Linux內(nèi)核TC的流控隊(duì)列號(hào)。 較優(yōu)的,所述流量控制模塊屬于Iinux內(nèi)核TC模塊。 較優(yōu)的,所述虛擬網(wǎng)卡模塊進(jìn)一步包括:結(jié)構(gòu)轉(zhuǎn)換模塊,連接于數(shù)據(jù)包收發(fā)模塊,對(duì)所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包進(jìn)行結(jié)構(gòu)轉(zhuǎn)換處理,將所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包轉(zhuǎn)換為所述內(nèi)核打上標(biāo)記后的數(shù)據(jù)包結(jié)構(gòu);以及所述數(shù)據(jù)包收發(fā)模塊,在Iinux內(nèi)核與所述網(wǎng)卡之間建立數(shù)據(jù)連接,進(jìn)行數(shù)據(jù)互通,接收所述流控隊(duì)列號(hào)標(biāo)記模塊發(fā)送的所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包,并將所述結(jié)構(gòu)轉(zhuǎn)換模塊進(jìn)行結(jié)構(gòu)轉(zhuǎn)換處理后的所述內(nèi)核打上標(biāo)記后的數(shù)據(jù)包發(fā)送到所述流量控制模塊。 本專(zhuān)利技術(shù)提供的基于零拷貝和Linux內(nèi)核的軟件流控方法及其系統(tǒng),結(jié)合了零拷貝和Linux內(nèi)核TC流控各自的優(yōu)點(diǎn),采用虛擬網(wǎng)卡的方式連接內(nèi)核和零拷貝機(jī)制,解決了轉(zhuǎn)發(fā)性能和流控之間的矛盾,實(shí)現(xiàn)了大流量下高效的流量控制。 【附圖說(shuō)明】 圖1為本專(zhuān)利技術(shù)一實(shí)施方式提供的基于零拷貝和Linux內(nèi)核的軟件流控方法的流程圖。 圖2為本專(zhuān)利技術(shù)一實(shí)施方式提供的基于零拷貝和Linux內(nèi)核的軟件流控系統(tǒng)的結(jié)構(gòu)示意圖。 【具體實(shí)施方式】 為了使本專(zhuān)利技術(shù)的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本專(zhuān)利技術(shù)進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅用以解釋本專(zhuān)利技術(shù),并不用于限定本專(zhuān)利技術(shù)。 圖1為本專(zhuān)利技術(shù)一實(shí)施方式提供的基于零拷貝和Linux內(nèi)核的軟件流控方法的流程圖。如圖1所示,基于零拷貝和Linux內(nèi)核的軟件流控方法包括: 步驟SlOl:用零拷貝方式獲取網(wǎng)卡上的數(shù)據(jù)包; 步驟S102:用戶(hù)態(tài)程序收到數(shù)據(jù)包后,判斷該數(shù)據(jù)包是否需要流控,如需要流控,則執(zhí)行步驟S103,如不需要流控,則執(zhí)行步驟S105 ; 步驟S103:將該數(shù)據(jù)包打上流控隊(duì)列號(hào)標(biāo)記,其中,標(biāo)記的值是該數(shù)據(jù)包對(duì)應(yīng)在Linux內(nèi)核TC的流控隊(duì)列號(hào),接下來(lái),執(zhí)行步驟S107 ; 步驟S105:將該數(shù)據(jù)包發(fā)送到網(wǎng)卡; 步驟S107:通過(guò)虛擬網(wǎng)卡驅(qū)動(dòng)提供的接口,將打上標(biāo)記的數(shù)據(jù)包發(fā)送到Linux內(nèi)核的虛擬網(wǎng)卡上; 步驟S109 =Iinux內(nèi)核的虛擬網(wǎng)卡接收到數(shù)據(jù)包后,將該數(shù)據(jù)包轉(zhuǎn)換為內(nèi)核打上標(biāo)記后的數(shù)據(jù)包,即,Iinux內(nèi)核的虛擬網(wǎng)卡對(duì)該數(shù)據(jù)包進(jìn)行結(jié)構(gòu)轉(zhuǎn)換處理,將打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包轉(zhuǎn)換為內(nèi)核打上標(biāo)記后的數(shù)據(jù)包結(jié)構(gòu),具體而言,Iinux內(nèi)核的虛擬網(wǎng)卡接收到數(shù)據(jù)包中包括網(wǎng)絡(luò)數(shù)據(jù)包及標(biāo)記值,本步驟中上述的結(jié)構(gòu)轉(zhuǎn)換是將收到的網(wǎng)絡(luò)數(shù)據(jù)包轉(zhuǎn)換為Iinux內(nèi)核存儲(chǔ)的數(shù)據(jù)包格式(sk_buff),然后根據(jù)虛擬網(wǎng)卡收到數(shù)據(jù)包中的標(biāo)記值,將sk_buff打上標(biāo)記; 步驟Slll:將內(nèi)核打上標(biāo)記后的數(shù)據(jù)包傳輸至Iinux內(nèi)核網(wǎng)絡(luò)協(xié)議棧,利用Iinux內(nèi)核網(wǎng)絡(luò)協(xié)議棧中的Iinux內(nèi)核TC模塊對(duì)內(nèi)核打上標(biāo)記后的數(shù)據(jù)包進(jìn)行流量控制,以產(chǎn)生流控后的數(shù)據(jù)包,即,利用Iinux內(nèi)核TC模塊對(duì)內(nèi)核打上標(biāo)記后的數(shù)據(jù)包進(jìn)行流量控制,以產(chǎn)生流控后的數(shù)據(jù)包; 步驟S113:用戶(hù)態(tài)程序通過(guò)虛擬網(wǎng)卡驅(qū)動(dòng)提供的接口接收流控后的數(shù)據(jù)包,使用零拷貝方式將該數(shù)據(jù)包發(fā)送到網(wǎng)卡。 以上實(shí)施例提供的基于零拷貝和Linux內(nèi)核的軟件流控方法,利用虛擬網(wǎng)卡的方式連接I inux內(nèi)核和網(wǎng)卡零拷貝機(jī)制,實(shí)現(xiàn)大流量下的流控。利用網(wǎng)卡零拷貝技術(shù),用戶(hù)態(tài)程序?qū)⑿枰骺氐臄?shù)據(jù)包打上Iinux內(nèi)核TC流控隊(duì)列號(hào)的本文檔來(lái)自技高網(wǎng)...
【技術(shù)保護(hù)點(diǎn)】
一種基于零拷貝和Linux內(nèi)核的軟件流控方法,其特征在于,包括以下步驟:用零拷貝方式獲取網(wǎng)卡上的數(shù)據(jù)包的步驟;判斷所述數(shù)據(jù)包是否需要流控的步驟;如果所述數(shù)據(jù)包需要流控,則將所述數(shù)據(jù)包打上流控隊(duì)列號(hào)標(biāo)記的步驟;通過(guò)虛擬網(wǎng)卡驅(qū)動(dòng)提供的接口,將打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包發(fā)送到Linux內(nèi)核的虛擬網(wǎng)卡上的步驟;將接收到的所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包轉(zhuǎn)換為內(nèi)核打上標(biāo)記后的數(shù)據(jù)包的步驟;以及利用linux內(nèi)核TC模塊對(duì)所述內(nèi)核打上標(biāo)記后的數(shù)據(jù)包進(jìn)行流量控制,以產(chǎn)生流控后的數(shù)據(jù)包的步驟。
【技術(shù)特征摘要】
1.一種基于零拷貝和Linux內(nèi)核的軟件流控方法,其特征在于,包括以下步驟: 用零拷貝方式獲取網(wǎng)卡上的數(shù)據(jù)包的步驟; 判斷所述數(shù)據(jù)包是否需要流控的步驟; 如果所述數(shù)據(jù)包需要流控,則將所述數(shù)據(jù)包打上流控隊(duì)列號(hào)標(biāo)記的步驟; 通過(guò)虛擬網(wǎng)卡驅(qū)動(dòng)提供的接口,將打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包發(fā)送到Linux內(nèi)核的虛擬網(wǎng)卡上的步驟; 將接收到的所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包轉(zhuǎn)換為內(nèi)核打上標(biāo)記后的數(shù)據(jù)包的步驟;以及 利用Iinux內(nèi)核TC模塊對(duì)所述內(nèi)核打上標(biāo)記后的數(shù)據(jù)包進(jìn)行流量控制,以產(chǎn)生流控后的數(shù)據(jù)包的步驟。2.如權(quán)利要求1所述的基于零拷貝和Linux內(nèi)核的軟件流控方法,其特征在于,所述將接收到的所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包轉(zhuǎn)換為內(nèi)核打上標(biāo)記后的數(shù)據(jù)包的步驟進(jìn)一步包括: 所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包中的網(wǎng)絡(luò)數(shù)據(jù)包轉(zhuǎn)換為Iinux內(nèi)核存儲(chǔ)的sk_bufT格式數(shù)據(jù)包的步驟;以及 根據(jù)所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包的標(biāo)記值,將所述sk_buff格式數(shù)據(jù)包打上標(biāo)記的步驟。3.如權(quán)利要求1所述的基于零拷貝和Linux內(nèi)核的軟件流控方法,其特征在于,還包括:用戶(hù)態(tài)程序通過(guò)虛擬網(wǎng)卡驅(qū)動(dòng)提供的接口接收所述流控后的數(shù)據(jù)包,并用零拷貝方式將所述流控后的數(shù)據(jù)包發(fā)送到網(wǎng)卡的步驟。4.如權(quán)利要求1所述的基于零拷貝和Linux內(nèi)核的軟件流控方法,其特征在于,所述將接收到的所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包轉(zhuǎn)換為內(nèi)核打上標(biāo)記后的數(shù)據(jù)包的步驟是由Iinux內(nèi)核的虛擬網(wǎng)卡實(shí)現(xiàn)。5.如權(quán)利要求1所述的基于零拷貝和Linux內(nèi)核的軟件流控方法,其特征在于:所述流控隊(duì)列號(hào)標(biāo)記的值是所述打上流控隊(duì)列號(hào)標(biāo)記的數(shù)據(jù)包對(duì)應(yīng)在Linux內(nèi)核TC的流控隊(duì)列號(hào)。6.一種基于零拷貝和Linux內(nèi)核的軟件流控系統(tǒng),其特征在于,包括: 網(wǎng)卡,連接于流控判斷模塊,通過(guò)網(wǎng)卡零拷貝驅(qū)動(dòng),獲取所述網(wǎng)卡上的數(shù)據(jù)包,并將所述數(shù)據(jù)包發(fā)送到所述流控判斷模塊; 所述流控判斷模...
【專(zhuān)利技術(shù)屬性】
技術(shù)研發(fā)人員:劉永強(qiáng),呂恩泳,沈智杰,景曉軍,唐新民,
申請(qǐng)(專(zhuān)利權(quán))人:任子行網(wǎng)絡(luò)技術(shù)股份有限公司,
類(lèi)型:發(fā)明
國(guó)別省市:廣東;44
還沒(méi)有人留言評(píng)論。發(fā)表了對(duì)其他瀏覽者有用的留言會(huì)獲得科技券。