本發(fā)明涉及報(bào)文處理技術(shù)領(lǐng)域,特別涉及一種用戶態(tài)到內(nèi)核態(tài)的數(shù)據(jù)報(bào)文處理方法。
背景技術(shù):主機(jī)在收發(fā)和處理網(wǎng)絡(luò)報(bào)文時(shí),通常采用兩種方式:一種是由內(nèi)核加載網(wǎng)卡驅(qū)動,進(jìn)行報(bào)文收發(fā),通過數(shù)據(jù)拷貝送到用戶態(tài)進(jìn)程進(jìn)行業(yè)務(wù)處理;另一種是由用戶態(tài)加載網(wǎng)卡驅(qū)動,進(jìn)行報(bào)文收發(fā),對于需要轉(zhuǎn)發(fā)到內(nèi)核處理的主機(jī)報(bào)文,通過socket創(chuàng)建特殊套接字或通過proc文件系統(tǒng)創(chuàng)建文件實(shí)現(xiàn)與內(nèi)核的數(shù)據(jù)交互。第一種方式的缺點(diǎn)在于:內(nèi)核加載網(wǎng)卡驅(qū)動進(jìn)行報(bào)文收發(fā),在萬兆網(wǎng)卡大流量的沖擊下會引發(fā)大量中斷,消耗一定的CPU性能(特別是X86體系架構(gòu)),同時(shí)Linux操作系統(tǒng)的內(nèi)核態(tài)到用戶態(tài)的數(shù)據(jù)拷貝也會造成系統(tǒng)性能的損耗;第二種方式的缺點(diǎn)在于:用戶態(tài)加載網(wǎng)卡驅(qū)動進(jìn)行報(bào)文收發(fā),雖然降低了性能損耗,但是針對一些主機(jī)報(bào)文業(yè)務(wù)處理(例如Linux內(nèi)核的PPPoE、DHCP等)需要感知實(shí)際物理網(wǎng)絡(luò)及網(wǎng)絡(luò)接口狀態(tài),而內(nèi)核沒有網(wǎng)絡(luò)接口可感知操作,此時(shí)就會出現(xiàn)問題,同時(shí)還涉及用戶態(tài)報(bào)文PKB與內(nèi)核SKB格式轉(zhuǎn)換問題。
技術(shù)實(shí)現(xiàn)要素:(一)所要解決的技術(shù)問題本發(fā)明的目的在于提供一種用戶態(tài)到內(nèi)核態(tài)的數(shù)據(jù)報(bào)文處理方法,以降低網(wǎng)卡驅(qū)動加載造成的性能損耗,同時(shí)使內(nèi)核態(tài)能夠感知實(shí)際物理網(wǎng)絡(luò)及網(wǎng)絡(luò)接口狀態(tài)。(二)技術(shù)方案為了解決上述技術(shù)問題,本發(fā)明提出了一種用戶態(tài)到內(nèi)核態(tài)的數(shù)據(jù)報(bào)文處理方法,所述方法包括以下步驟:S1、通過TUN/TAP驅(qū)動的方式在內(nèi)核態(tài)創(chuàng)建虛擬網(wǎng)卡;S2、在用戶態(tài)進(jìn)行網(wǎng)卡驅(qū)動加載,并將用戶態(tài)的網(wǎng)絡(luò)接口信息發(fā)送給所述虛擬網(wǎng)卡;S3、所述虛擬網(wǎng)卡根據(jù)用戶態(tài)的網(wǎng)絡(luò)接口信息創(chuàng)建虛擬接口,所述虛擬接口的數(shù)量及狀態(tài)與用戶態(tài)的網(wǎng)絡(luò)接口保持一致;S4、當(dāng)接收到需要內(nèi)核態(tài)處理的報(bào)文時(shí),用戶態(tài)的網(wǎng)絡(luò)接口將所述需要內(nèi)核態(tài)處理的報(bào)文發(fā)送給所述虛擬網(wǎng)卡,所述虛擬網(wǎng)卡將所述需要內(nèi)核態(tài)處理的報(bào)文發(fā)送給內(nèi)核態(tài)進(jìn)行處理。可選的,步驟S4之后還包括步驟:S5、內(nèi)核態(tài)將處理后得到的待發(fā)送報(bào)文發(fā)送給所述虛擬網(wǎng)卡,所述虛擬網(wǎng)卡將所述待發(fā)送報(bào)文發(fā)送給用戶態(tài)的網(wǎng)絡(luò)接口進(jìn)行發(fā)送??蛇x的,步驟S3進(jìn)一步包括:在所述虛擬接口中掛載所述虛擬網(wǎng)卡的報(bào)文處理函數(shù)??蛇x的,步驟S4具體包括:當(dāng)接收到需要內(nèi)核態(tài)處理的報(bào)文時(shí),用戶態(tài)的網(wǎng)絡(luò)接口將所述需要內(nèi)核態(tài)處理的報(bào)文發(fā)送給所述虛擬網(wǎng)卡,所述虛擬網(wǎng)卡查找出所述需要內(nèi)核態(tài)處理的報(bào)文對應(yīng)的虛擬接口,并調(diào)用該虛擬接口中掛載的所述虛擬網(wǎng)卡的報(bào)文處理函數(shù),所述虛擬網(wǎng)卡的報(bào)文處理函數(shù)將所述需要內(nèi)核態(tài)處理的報(bào)文發(fā)送給內(nèi)核態(tài)進(jìn)行處理??蛇x的,步驟S4之前還包括步驟:S0、在用戶態(tài)創(chuàng)建報(bào)文鏈表A和報(bào)文鏈表B,其中,報(bào)文鏈表A用于對所述需要內(nèi)核態(tài)處理的報(bào)文進(jìn)行緩存,報(bào)文鏈表B用于對所述待發(fā)送報(bào)文進(jìn)行緩存??蛇x的,步驟S4具體包括:S401、當(dāng)接收到需要內(nèi)核態(tài)處理的報(bào)文時(shí),用戶態(tài)的網(wǎng)絡(luò)接口將所述需要內(nèi)核態(tài)處理的報(bào)文放入報(bào)文鏈表A;S402、所述虛擬網(wǎng)卡從報(bào)文鏈表A中提取所述需要內(nèi)核態(tài)處理的報(bào)文并將其發(fā)送給內(nèi)核態(tài)進(jìn)行處理。可選的,步驟S5具體包括:S501、內(nèi)核態(tài)將處理后得到的待發(fā)送報(bào)文發(fā)送給所述虛擬網(wǎng)卡,所述虛擬網(wǎng)卡將所述待發(fā)送報(bào)文放入報(bào)文鏈表B;S502、用戶態(tài)的網(wǎng)絡(luò)接口從報(bào)文鏈表B中提取所述待發(fā)送報(bào)文并將其進(jìn)行發(fā)送??蛇x的,步驟S402中,所述虛擬網(wǎng)卡通過write函數(shù)從報(bào)文鏈表A中提取所述需要內(nèi)核態(tài)處理的報(bào)文。可選的,步驟S501中,所述虛擬網(wǎng)卡通過read函數(shù)將所述待發(fā)送報(bào)文放入報(bào)文鏈表B??蛇x的,步驟S1具體包括:調(diào)用open函數(shù)以設(shè)備文件的形式在內(nèi)核態(tài)創(chuàng)建虛擬網(wǎng)卡,并為所述虛擬網(wǎng)卡配置默認(rèn)IP和路由。(三)有益效果與現(xiàn)有技術(shù)相比,本發(fā)明的技術(shù)方案具有如下優(yōu)點(diǎn):本發(fā)明的技術(shù)方案實(shí)現(xiàn)了網(wǎng)卡驅(qū)動加載及收發(fā)報(bào)文在用戶態(tài)進(jìn)行,消除了內(nèi)核態(tài)網(wǎng)卡驅(qū)動中斷及數(shù)據(jù)拷貝造成的性能損耗;同時(shí),注冊維護(hù)的一套網(wǎng)絡(luò)接口和一套虛擬接口,可分別滿足用戶態(tài)、內(nèi)核態(tài)對物理網(wǎng)絡(luò)及網(wǎng)絡(luò)接口狀態(tài)的感知需求,且無需考慮用戶態(tài)報(bào)文PKB與內(nèi)核態(tài)SKB格式轉(zhuǎn)換的問題。附圖說明圖1是本發(fā)明提出的用戶態(tài)到內(nèi)核態(tài)的數(shù)據(jù)報(bào)文處理方法的基本流程圖。圖2是本發(fā)明一種具體實(shí)施方式中虛擬網(wǎng)卡的功能示意圖。圖3是本發(fā)明一種具體實(shí)施方式中用戶態(tài)與內(nèi)核態(tài)的數(shù)據(jù)交互過程示意圖。具體實(shí)施方式下面結(jié)合附圖和實(shí)施例,對本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)描述。本發(fā)明提出了一種用戶態(tài)到內(nèi)核態(tài)的數(shù)據(jù)報(bào)文處理方法,如圖1所示,所述方法包括以下步驟:S1、通過TUN/TAP驅(qū)動的方式在內(nèi)核態(tài)創(chuàng)建虛擬網(wǎng)卡;S2、在用戶態(tài)進(jìn)行網(wǎng)卡驅(qū)動加載,并將用戶態(tài)的網(wǎng)絡(luò)接口信息發(fā)送給所述虛擬網(wǎng)卡;S3、所述虛擬網(wǎng)卡根據(jù)用戶態(tài)的網(wǎng)絡(luò)接口信息創(chuàng)建虛擬接口,所述虛擬接口的數(shù)量及狀態(tài)與用戶態(tài)的網(wǎng)絡(luò)接口保持一致;S4、當(dāng)接收到需要內(nèi)核態(tài)處理的報(bào)文時(shí),用戶態(tài)的網(wǎng)絡(luò)接口將所述需要內(nèi)核態(tài)處理的報(bào)文發(fā)送給所述虛擬網(wǎng)卡,所述虛擬網(wǎng)卡將所述需要內(nèi)核態(tài)處理的報(bào)文發(fā)送給內(nèi)核態(tài)進(jìn)行處理。步驟S4之后還包括步驟:S5、內(nèi)核態(tài)將處理后得到的待發(fā)送報(bào)文發(fā)送給所述虛擬網(wǎng)卡,所述虛擬網(wǎng)卡將所述待發(fā)送報(bào)文發(fā)送給用戶態(tài)的網(wǎng)絡(luò)接口進(jìn)行發(fā)送。優(yōu)選的,步驟S3進(jìn)一步包括:在所述虛擬接口中掛載所述虛擬網(wǎng)卡的報(bào)文處理函數(shù)。優(yōu)選的,步驟S4具體包括:當(dāng)接收到需要內(nèi)核態(tài)處理的報(bào)文時(shí),用戶態(tài)的網(wǎng)絡(luò)接口將所述需要內(nèi)核態(tài)處理的報(bào)文發(fā)送給所述虛擬網(wǎng)卡,所述虛擬網(wǎng)卡查找出所述需要內(nèi)核態(tài)處理的報(bào)文對應(yīng)的虛擬接口,并調(diào)用該虛擬接口中掛載的所述虛擬網(wǎng)卡的報(bào)文處理函數(shù),所述虛擬網(wǎng)卡的報(bào)文處理函數(shù)將所述需要內(nèi)核態(tài)處理的報(bào)文發(fā)送給內(nèi)核態(tài)進(jìn)行處理。優(yōu)選的,步驟S4之前還包括步驟:S0、在用戶態(tài)創(chuàng)建報(bào)文鏈表A和報(bào)文鏈表B,其中,報(bào)文鏈表A用于對所述需要內(nèi)核態(tài)處理的報(bào)文進(jìn)行緩存,報(bào)文鏈表B用于對所述待發(fā)送報(bào)文進(jìn)行緩存。優(yōu)選的,步驟S4具體包括:S401、當(dāng)接收到需要內(nèi)核態(tài)處理的報(bào)文時(shí),用戶態(tài)的網(wǎng)絡(luò)接口將所述需要內(nèi)核態(tài)處理的報(bào)文放入報(bào)文鏈表A;S402、所述虛擬網(wǎng)卡從報(bào)文鏈表A中提取所述需要內(nèi)核態(tài)處理的報(bào)文并將其發(fā)送給內(nèi)核態(tài)進(jìn)行處理。優(yōu)選的,步驟S5具體包括:S501、內(nèi)核態(tài)將處理后得到的待發(fā)送報(bào)文發(fā)送給所述虛擬網(wǎng)卡,所述虛擬網(wǎng)卡將所述待發(fā)送報(bào)文放入報(bào)文鏈表B;S502、用戶態(tài)的網(wǎng)絡(luò)接口從報(bào)文鏈表B中提取所述待發(fā)送報(bào)文并將其進(jìn)行發(fā)送。在本發(fā)明的技術(shù)方案中,網(wǎng)卡驅(qū)動加載及收發(fā)報(bào)文部署在用戶態(tài),由用戶態(tài)維護(hù)獨(dú)立的網(wǎng)絡(luò)接口。對于需要內(nèi)核處理的主機(jī)報(bào)文,使用設(shè)備文件的方式,通過TUN/TAP驅(qū)動實(shí)現(xiàn)用戶態(tài)與內(nèi)核態(tài)的數(shù)據(jù)交互。在內(nèi)核初始化時(shí)配置TUN/TAP虛擬網(wǎng)卡可用,同時(shí)注冊一套虛擬接口,虛擬接口的個(gè)數(shù)及狀態(tài)與用戶態(tài)網(wǎng)絡(luò)接口保持一致,且每個(gè)虛擬接口中均掛載TUN/TAP虛擬網(wǎng)卡的報(bào)文處理函數(shù)。如圖2所示,這里的虛擬網(wǎng)卡Tun0相當(dāng)于一個(gè)連接用戶態(tài)和內(nèi)核態(tài)的通道。如圖3所示,首先調(diào)用open函數(shù)以設(shè)備文件的形式在內(nèi)核態(tài)創(chuàng)建虛擬網(wǎng)卡Tun0,并為其配置默認(rèn)IP、route。同時(shí),在用戶態(tài)創(chuàng)建kernel_to_user_queue和user_to_kernel_queue兩個(gè)報(bào)文鏈表,兩個(gè)報(bào)文鏈表與實(shí)際物理網(wǎng)卡的收發(fā)隊(duì)列相對應(yīng)。對于物理網(wǎng)卡收到的需要內(nèi)核處理的報(bào)文,首先將該報(bào)文入隊(duì)user_to_kernel_queue,然后出隊(duì)通過write函數(shù)寫入虛擬網(wǎng)卡Tun0,并通過虛擬網(wǎng)卡Tun0將該報(bào)文交由內(nèi)核處理;對于內(nèi)核處理完成轉(zhuǎn)給用戶態(tài)的待發(fā)送報(bào)文,通過read函數(shù)從虛擬網(wǎng)卡Tun0讀出入隊(duì)kernel_to_user_queue,然后出隊(duì)通過物理網(wǎng)卡隊(duì)列發(fā)出。需要說明的是,以上入隊(duì)、出隊(duì)操作不一定同時(shí)發(fā)生,報(bào)文鏈表起緩沖作用,從而能夠提高報(bào)文處理的效率。綜上,本發(fā)明公開了一種用戶態(tài)到內(nèi)核態(tài)的數(shù)據(jù)報(bào)文處理拓?fù)浣Y(jié)構(gòu)及方法,網(wǎng)卡在用戶態(tài)接收數(shù)據(jù)報(bào)文,對于需要內(nèi)核態(tài)處理的數(shù)據(jù)報(bào)文,通過虛擬網(wǎng)卡與內(nèi)核態(tài)實(shí)現(xiàn)數(shù)據(jù)交互,同時(shí)在內(nèi)核態(tài)創(chuàng)建一套虛擬接口,滿足內(nèi)核態(tài)一些業(yè)務(wù)模塊對物理接口狀態(tài)的感知與操作需求。以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明技術(shù)原理的前提下,還可以做出若干改進(jìn)和替換,這些改進(jìn)和替換也應(yīng)視為本發(fā)明的保護(hù)范圍。