本發(fā)明涉及計算機技術(shù)領(lǐng)域,具體涉及一種基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送方法和裝置。
背景技術(shù):
目前,Linux kernel bridge(內(nèi)核網(wǎng)橋)轉(zhuǎn)發(fā)數(shù)據(jù)的過程為:網(wǎng)卡驅(qū)動從網(wǎng)卡緩存中提取網(wǎng)絡數(shù)據(jù),然后,網(wǎng)卡驅(qū)動將該網(wǎng)絡數(shù)據(jù)傳輸至Linux kernel bridge子系統(tǒng),Linux kernel bridge子系統(tǒng)對網(wǎng)絡數(shù)據(jù)包進行轉(zhuǎn)發(fā)處理,以將該網(wǎng)絡數(shù)據(jù)發(fā)送出去。
然而,由于Linux kernel bridge子系統(tǒng)對網(wǎng)絡數(shù)據(jù)的轉(zhuǎn)發(fā)處理比較復雜,代碼邏輯比較厚重,因此會降低Linux kernel bridge的數(shù)據(jù)轉(zhuǎn)發(fā)性能。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例提供一種基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送方法和裝置,可以提高Linux kernel bridge的數(shù)據(jù)轉(zhuǎn)發(fā)性能。
本發(fā)明實施例提供一種基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送方法,包括:
從網(wǎng)卡緩存中讀取待發(fā)送的數(shù)據(jù)包;
在緩存的地址轉(zhuǎn)發(fā)信息中查找所述數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息;
當查找到所述數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時,根據(jù)查找到的地址轉(zhuǎn)發(fā)信息確定用于發(fā)送所述數(shù)據(jù)包的目標網(wǎng)卡驅(qū)動;
直接向所述目標網(wǎng)卡驅(qū)動發(fā)送所述數(shù)據(jù)包,以便所述目標網(wǎng)卡驅(qū)動將所述數(shù)據(jù)包發(fā)送出去。
相應的,本發(fā)明實施例還提供一種基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送裝置,包括:
讀取單元,用于從網(wǎng)卡緩存中讀取待發(fā)送的數(shù)據(jù)包;
查找單元,用于在緩存的地址轉(zhuǎn)發(fā)信息中查找所述數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息;
確定單元,用于當查找到所述數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時,根據(jù)查找到的地址轉(zhuǎn)發(fā)信息確定用于發(fā)送所述數(shù)據(jù)包的目標網(wǎng)卡驅(qū)動;
發(fā)送單元,用于直接向所述目標網(wǎng)卡驅(qū)動發(fā)送所述數(shù)據(jù)包,以便所述目標網(wǎng)卡驅(qū)動將所述數(shù)據(jù)包發(fā)送出去。
本發(fā)明實施例采用從網(wǎng)卡緩存中讀取待發(fā)送的數(shù)據(jù)包,然后,在緩存的地址轉(zhuǎn)發(fā)信息中查找該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息,當查找到該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時,根據(jù)查找到的地址轉(zhuǎn)發(fā)信息確定用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)卡驅(qū)動,直接向該目標網(wǎng)卡驅(qū)動發(fā)送該數(shù)據(jù)包,以便該目標網(wǎng)卡驅(qū)動將該數(shù)據(jù)包發(fā)送出去。該方案可以將數(shù)據(jù)包直接發(fā)送給目標網(wǎng)卡驅(qū)動,并通過目標網(wǎng)卡驅(qū)動將數(shù)據(jù)包轉(zhuǎn)發(fā)出去,無需再先將數(shù)據(jù)包發(fā)送至Linux kernel bridge子系統(tǒng),然后由該子系統(tǒng)進行轉(zhuǎn)發(fā)處理以將數(shù)據(jù)發(fā)送出去;因此,該方案可以提高Linux kernel bridge的數(shù)據(jù)轉(zhuǎn)發(fā)速度,進而提高Linux kernel bridge的數(shù)據(jù)轉(zhuǎn)發(fā)性能。
附圖說明
為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1a是本發(fā)明實施例提供的數(shù)據(jù)轉(zhuǎn)發(fā)系統(tǒng)的場景示意圖;
圖1b是本發(fā)明實施例提供的基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送方法的流程圖;
圖2a是本發(fā)明實施例提供的Linux bridge(網(wǎng)橋)系統(tǒng)的結(jié)構(gòu)示意圖;
圖2b是本發(fā)明實施例提供的基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送方法的另一流程圖;
圖3a是本發(fā)明實施例提供的基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送裝置的結(jié)構(gòu)示意圖;
圖3b是本發(fā)明實施例提供的基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送裝置的另一結(jié)構(gòu)示意圖;
圖3c是本發(fā)明實施例提供的基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送裝置的又一結(jié)構(gòu)示意圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
本發(fā)明實施例提供一種基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送方法和裝置。
本發(fā)明實施例提供了一種數(shù)據(jù)轉(zhuǎn)發(fā)系統(tǒng)包括:本發(fā)明實施例任一提供的基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送裝置。該數(shù)據(jù)發(fā)送裝置可以集成在服務器中,比如,集成在Linux操作系統(tǒng)的服務器中。
如圖1a所示,該數(shù)據(jù)轉(zhuǎn)發(fā)系統(tǒng)包括服務器a、服務器b以及終端c,其中,服務器a集成有本發(fā)明實施例任一提供的基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送裝置。該服務器a與服務器b之間通過網(wǎng)絡連接,服務器a與終端c之間通過網(wǎng)絡連接。
在數(shù)據(jù)轉(zhuǎn)發(fā)時,服務器a用于從網(wǎng)卡緩存中讀取待發(fā)送的數(shù)據(jù)包,然后,在緩存的地址轉(zhuǎn)發(fā)信息中查找該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息,當查找到該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時,根據(jù)查找到的地址轉(zhuǎn)發(fā)信息確定用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)卡驅(qū)動,直接向該目標網(wǎng)卡驅(qū)動發(fā)送該數(shù)據(jù)包,以便該目標網(wǎng)卡驅(qū)動將該數(shù)據(jù)包發(fā)送給服務器a和終端c。
此外,服務器a還用于通過物理網(wǎng)卡將服務器b或者終端c發(fā)送的信號轉(zhuǎn)換成網(wǎng)絡數(shù)據(jù),并存放在相應的網(wǎng)卡緩存中。
以下將分別進行詳細說明。
實施例一、
本實施例將從基于操作系統(tǒng)內(nèi)核網(wǎng)橋(kernel bridge)的數(shù)據(jù)發(fā)送裝置的角度進行描述,該數(shù)據(jù)發(fā)送裝置具體可以集成服務器中,比如,該服務器可以為Linux服務器。
一種基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送方法,包括:從網(wǎng)卡緩存中讀取待發(fā)送的數(shù)據(jù)包,然后,在緩存的地址轉(zhuǎn)發(fā)信息中查找該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息,當查找到該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時,根據(jù)查找到的地址轉(zhuǎn)發(fā)信息確定用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)卡驅(qū)動,直接向該目標網(wǎng)卡驅(qū)動發(fā)送該數(shù)據(jù)包,以便該目標網(wǎng)卡驅(qū)動將該數(shù)據(jù)包發(fā)送出去。
如圖1b所示,該基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送方法的流程圖具體可以如下:
101、從網(wǎng)卡緩存中讀取待發(fā)送的數(shù)據(jù)包。
其中,網(wǎng)卡緩存用于存放物理網(wǎng)卡轉(zhuǎn)換的網(wǎng)絡數(shù)據(jù),每個物理網(wǎng)卡可以對應一個網(wǎng)卡緩存。
本實施例中操作系統(tǒng)可以Linux系統(tǒng)、或者其他的操作系統(tǒng)。
可選地,在步驟101之前,本實施例方法還可以包括:對內(nèi)核網(wǎng)橋系統(tǒng)的地址轉(zhuǎn)換信息進行拷貝,對拷貝的地址轉(zhuǎn)換信息進行緩存。這樣便于后續(xù)數(shù)據(jù)包轉(zhuǎn)發(fā)時數(shù)據(jù)包進入內(nèi)核網(wǎng)橋系統(tǒng)之前進行數(shù)據(jù)包的地址轉(zhuǎn)發(fā)信息的確定。
102、在緩存的地址轉(zhuǎn)發(fā)信息中查找該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息。
其中,地址轉(zhuǎn)發(fā)(fdb)信息為用于轉(zhuǎn)發(fā)或者發(fā)送數(shù)據(jù)包的信息,其主要功能是供網(wǎng)絡設備如服務器在數(shù)據(jù)鏈路層對數(shù)據(jù)包進行轉(zhuǎn)發(fā),用于確定數(shù)據(jù)包發(fā)往哪個端口。該地址轉(zhuǎn)發(fā)信息主要包括MAC(Media Access Control,媒體訪問控制)地址與轉(zhuǎn)發(fā)端口之間的對應關(guān)系(即映射關(guān)系)。
該地址轉(zhuǎn)發(fā)信息可以包括地址轉(zhuǎn)發(fā)表,比如,可以包括MAC(Media Access Control,媒體訪問控制)地址轉(zhuǎn)發(fā)表;該MAC地址也可以稱為物理地址、硬件地址等等。
其中,地址轉(zhuǎn)發(fā)表包含了轉(zhuǎn)發(fā)地址與轉(zhuǎn)發(fā)端口(port)之間的對應關(guān)系(映射關(guān)系),具體地,該地址轉(zhuǎn)發(fā)表包含若干地址轉(zhuǎn)發(fā)表項,該地址轉(zhuǎn)發(fā)表項包含了轉(zhuǎn)發(fā)地址與轉(zhuǎn)發(fā)端口之間的對應關(guān)系(映射關(guān)系)。
比如,MAC地址轉(zhuǎn)發(fā)表包含若干MAC地址轉(zhuǎn)發(fā)表項,每個表項包含了MAC地址與轉(zhuǎn)發(fā)端口(port)之間的對應關(guān)系。該地址轉(zhuǎn)發(fā)表可以為一個二層轉(zhuǎn)發(fā)表。
當緩存的地址轉(zhuǎn)發(fā)信息包括地址轉(zhuǎn)發(fā)表時,步驟“在緩存的地址轉(zhuǎn)發(fā)信息中查找該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息”可以包括:
獲取該數(shù)據(jù)包對應的目的地址;
根據(jù)該目的地址在緩存的地址轉(zhuǎn)發(fā)表中,查找與目的地址對應的地址轉(zhuǎn)發(fā)表項。
其中,目的地址對應的地址轉(zhuǎn)發(fā)表項可以包含目的地址與轉(zhuǎn)發(fā)端口之間的對應關(guān)系。
比如,可以獲取數(shù)據(jù)包對應的目的MAC地址,然后,根據(jù)該目的MAC地址在MAC地址轉(zhuǎn)發(fā)表中,查找與目的MAC地址對應的地址轉(zhuǎn)發(fā)表項,該目的MAC地址對應的地址轉(zhuǎn)發(fā)表項包含目的MAC地址與轉(zhuǎn)發(fā)端口之間的對應關(guān)系。
103、當查找到該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時,根據(jù)查找到的地址轉(zhuǎn)發(fā)信息確定用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)卡驅(qū)動。
步驟“根據(jù)查找到的地址轉(zhuǎn)發(fā)信息確定用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)卡驅(qū)動”,包括:
根據(jù)該查找到的地址轉(zhuǎn)發(fā)信息查找相應的轉(zhuǎn)發(fā)端口;
將與該轉(zhuǎn)發(fā)端口關(guān)聯(lián)的網(wǎng)卡驅(qū)動,作為用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)絡驅(qū)動。
具體地,當?shù)刂忿D(zhuǎn)發(fā)信息包括地址轉(zhuǎn)發(fā)表時,該地址轉(zhuǎn)發(fā)表包含若干地址轉(zhuǎn)發(fā)表項,每個地址轉(zhuǎn)發(fā)表項包含轉(zhuǎn)發(fā)地址與轉(zhuǎn)發(fā)端口之間的對應關(guān)系;此時,查找到的地址轉(zhuǎn)發(fā)信息包括目的地址對應的地址轉(zhuǎn)發(fā)表項,該目的地址為數(shù)據(jù)包的目的地址,也即目的地址對應的地址轉(zhuǎn)發(fā)表項包含目的地址與轉(zhuǎn)發(fā)端口之間的映射關(guān)系。
步驟“根據(jù)該查找到的地址轉(zhuǎn)發(fā)信息查找相應的轉(zhuǎn)發(fā)端口”可以包括:根據(jù)查找到的地址轉(zhuǎn)發(fā)表項查找相應的轉(zhuǎn)發(fā)端口。
比如,當緩存的地址轉(zhuǎn)發(fā)信息包括MAC地址轉(zhuǎn)發(fā)表時,可以獲取數(shù)據(jù)包對應的目的MAC地址,然后,根據(jù)該目的MAC地址在該MAC地址轉(zhuǎn)發(fā)表中查找與目的MAC地址對應的MAC地址轉(zhuǎn)發(fā)表項。在查找到目的MAC地址對應的MAC地址轉(zhuǎn)發(fā)表項之后,可以基于該MAC地址轉(zhuǎn)發(fā)表項查找相應的轉(zhuǎn)發(fā)端口。
本實施例中,可以基于端口驅(qū)動映射關(guān)系集合來確定轉(zhuǎn)發(fā)端口關(guān)聯(lián)的網(wǎng)卡驅(qū)動;也即步驟“將與該轉(zhuǎn)發(fā)端口關(guān)聯(lián)的網(wǎng)卡驅(qū)動,作為用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)絡驅(qū)動”可以包括:
根據(jù)該轉(zhuǎn)發(fā)端口、端口驅(qū)動映射集合確定與該轉(zhuǎn)發(fā)端口關(guān)聯(lián)的網(wǎng)卡驅(qū)動,該端口驅(qū)動映射集合包括轉(zhuǎn)發(fā)端口與網(wǎng)卡驅(qū)動之間的映射關(guān)系(對應關(guān)系);
將該轉(zhuǎn)發(fā)端口關(guān)聯(lián)的網(wǎng)卡驅(qū)動,作為用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)絡驅(qū)動。
本實施例中,網(wǎng)卡驅(qū)動為一種驅(qū)動程序(Device Driver)全稱為“設備驅(qū)動程序”,是一種可以使計算機中央處理器——CPU控制和使用設備的特殊程序,相當于硬件的接口,操作系統(tǒng)通過這個接口,控制硬件設備的工作。
104、直接向該目標網(wǎng)卡驅(qū)動發(fā)送該數(shù)據(jù)包,以便該目標網(wǎng)卡驅(qū)動將該數(shù)據(jù)包發(fā)送出去。
具體地,步驟“直接向該目標網(wǎng)卡驅(qū)動發(fā)送該數(shù)據(jù)包”可以包括:
與該目標網(wǎng)卡驅(qū)動之間建立通信通道;
通過該通信通道向該目標網(wǎng)卡驅(qū)動發(fā)送該數(shù)據(jù)包。
可選地,當未查找到該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時,本實施例方法可以向內(nèi)核網(wǎng)橋系統(tǒng)發(fā)送該數(shù)據(jù)包,以便該內(nèi)核網(wǎng)橋系統(tǒng)將數(shù)據(jù)包發(fā)送出去。
比如,當未查找到目的地址對應的地址轉(zhuǎn)發(fā)表項時,可以向內(nèi)核網(wǎng)橋系統(tǒng)(如Linux kernel bridge子系統(tǒng))發(fā)送該數(shù)據(jù)包,該內(nèi)核網(wǎng)橋系統(tǒng)開啟學習模式,并根據(jù)學習結(jié)果將該數(shù)據(jù)包發(fā)送給對應的網(wǎng)卡驅(qū)動,以便該網(wǎng)卡驅(qū)動將該數(shù)據(jù)包發(fā)送出去。
由上可知,本發(fā)明實施例采用從網(wǎng)卡緩存中讀取待發(fā)送的數(shù)據(jù)包,然后,在緩存的地址轉(zhuǎn)發(fā)信息中查找該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息,當查找到該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時,根據(jù)查找到的地址轉(zhuǎn)發(fā)信息確定用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)卡驅(qū)動,直接向該目標網(wǎng)卡驅(qū)動發(fā)送該數(shù)據(jù)包,以便該目標網(wǎng)卡驅(qū)動將該數(shù)據(jù)包發(fā)送出去。該方案可以將數(shù)據(jù)包直接發(fā)送給目標網(wǎng)卡驅(qū)動,并通過目標網(wǎng)卡驅(qū)動將數(shù)據(jù)包轉(zhuǎn)發(fā)出去,無需再先將數(shù)據(jù)包發(fā)送至Linux kernel bridge子系統(tǒng),然后由該子系統(tǒng)進行轉(zhuǎn)發(fā)處理以將數(shù)據(jù)發(fā)送出去;因此,該方案可以提高Linux kernel bridge的數(shù)據(jù)轉(zhuǎn)發(fā)速度,進而提高Linux kernel bridge的數(shù)據(jù)轉(zhuǎn)發(fā)性能以及節(jié)省了設備資源。
實施例二、
根據(jù)實施例一所描述的方法,以下將舉例作進一步詳細說明。
在本實施例中,將以該數(shù)據(jù)發(fā)送裝置具體集成操作系統(tǒng)為Linux的服務器(稱為Linux服務器)為例進行說明。
如圖2a所示,該Linux服務器可以包括Linux bridge(網(wǎng)橋)系統(tǒng),該系統(tǒng)可以包括:Linux kernel bridge(Linux內(nèi)核網(wǎng)橋)子系統(tǒng)、網(wǎng)卡驅(qū)動1、物理網(wǎng)卡1、網(wǎng)卡驅(qū)動2、物理網(wǎng)卡2、網(wǎng)卡驅(qū)動3以及物理網(wǎng)卡3。
下面基于圖2a所示的Linux bridge(網(wǎng)橋)系統(tǒng)來詳細介紹本發(fā)明的數(shù)據(jù)發(fā)送方法。
如圖2b所示,一種基于操作系統(tǒng)內(nèi)核網(wǎng)橋(kernel bridge)的數(shù)據(jù)發(fā)送方法,具體流程如下:
201、Linux服務器對Linux kernel bridge子系統(tǒng)的地址轉(zhuǎn)發(fā)信息進行拷貝,并緩存拷貝的地址轉(zhuǎn)發(fā)信息。
比如,在linux kernel bridge子系統(tǒng)插入一個function,用于拷貝緩存inux kernel bridge子系統(tǒng)的地址轉(zhuǎn)發(fā)(fdb)信息。
其中,地址轉(zhuǎn)發(fā)信息可以包括MAC地址轉(zhuǎn)發(fā)表,該MAC地址轉(zhuǎn)發(fā)表包括若干MAC地址表項,該表項包含了MAC地址與轉(zhuǎn)發(fā)端口(port)之間的映射關(guān)系。
又比如,可以由網(wǎng)卡驅(qū)動1對Linux kernel bridge子系統(tǒng)的地址轉(zhuǎn)發(fā)信息進行拷貝,并緩存拷貝的地址轉(zhuǎn)發(fā)信息。
202、物理網(wǎng)卡1接收電信號,并將電信號轉(zhuǎn)換成網(wǎng)絡數(shù)據(jù),以及將該網(wǎng)絡數(shù)據(jù)存放在相應的網(wǎng)卡緩存中。
比如,物理網(wǎng)卡1通過網(wǎng)絡接收電信號,然后,將電信號轉(zhuǎn)換成相應的數(shù)據(jù),得到網(wǎng)絡數(shù)據(jù)包。
203、網(wǎng)卡驅(qū)動1從網(wǎng)卡緩存中讀取待發(fā)送的網(wǎng)絡數(shù)據(jù)包。
204、網(wǎng)卡驅(qū)動1從緩存的地址轉(zhuǎn)發(fā)信息中查找該網(wǎng)絡數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息。
比如,可以在網(wǎng)卡驅(qū)動1中插入一個function用于執(zhí)行步驟204-208。
具體地,網(wǎng)卡驅(qū)動1獲取網(wǎng)絡數(shù)據(jù)包對應的目的MAC地址,然后,根據(jù)該目的MAC地址在緩存的MAC地址轉(zhuǎn)發(fā)表中查找該目的MAC地址對應的MAC地址表項。
205、網(wǎng)卡驅(qū)動1確定是否查找到該網(wǎng)絡數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息,若是,則執(zhí)行步驟206,若否,則執(zhí)行步驟210。
比如,通過一個函數(shù)int nfp_process(uint32_t if_index,struct sk_buff*skb)來從地址轉(zhuǎn)發(fā)信息中查找該網(wǎng)絡數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息,若查找到,則返回0,若查不到則返回-1。
206、網(wǎng)卡驅(qū)動1根據(jù)查找到的地址轉(zhuǎn)發(fā)信息查找相應的轉(zhuǎn)發(fā)端口。
當網(wǎng)卡驅(qū)動1查找到目的MAC地址對應的MAC地址表項時,可以基于該MAC地址表項查找相應的轉(zhuǎn)發(fā)端口。
其中,可以調(diào)用函數(shù)dev_queue_xmit()來執(zhí)行步驟206-208。
例如,在網(wǎng)卡驅(qū)動1中,在tun_get_user()中,生成數(shù)據(jù)包sk_buff后,執(zhí)行nfp_process(),若nfp_process()返回0,即查找到網(wǎng)絡數(shù)據(jù)包對應的fdb信息。此時,可以調(diào)用dev_queue_xmit()將該數(shù)據(jù)包轉(zhuǎn)發(fā)出去(執(zhí)行步驟206-208),不再執(zhí)行tun_netif_rx_ni(skb),即不再將數(shù)據(jù)包傳給linux kernel bridge子系統(tǒng)。
207、網(wǎng)卡驅(qū)動1確定該轉(zhuǎn)發(fā)端口關(guān)聯(lián)的目標網(wǎng)卡驅(qū)動為網(wǎng)卡驅(qū)動2。
208、網(wǎng)卡驅(qū)動1與網(wǎng)卡驅(qū)動3之間建立通信通道,并通過該通信通過將該網(wǎng)絡數(shù)據(jù)包發(fā)送至網(wǎng)卡驅(qū)動2。
209、網(wǎng)卡驅(qū)動2將該網(wǎng)絡數(shù)據(jù)包放入到相應的網(wǎng)卡緩存中,物理網(wǎng)卡2將該網(wǎng)卡緩存中的網(wǎng)絡數(shù)據(jù)包轉(zhuǎn)換成電信號發(fā)送出去。
210、網(wǎng)卡驅(qū)動1將該網(wǎng)絡數(shù)據(jù)包發(fā)送給Linux kernel bridge子系統(tǒng)。
比如,在網(wǎng)卡驅(qū)動1中,在tun_get_user()中,生成數(shù)據(jù)包sk_buff后,執(zhí)行nfp_process(),若nfp_process()返回-1,則繼續(xù)執(zhí)行tun_netif_rx_ni(skb),以將數(shù)據(jù)包傳給linux kernel bridge子系統(tǒng)。
211、Linux kernel bridge子系統(tǒng)開啟學習模式,并根據(jù)學習結(jié)果向?qū)木W(wǎng)卡驅(qū)動3發(fā)送網(wǎng)絡數(shù)據(jù)包。
212、網(wǎng)卡驅(qū)動3將該網(wǎng)絡數(shù)據(jù)包放入到相應的網(wǎng)卡緩存中,物理網(wǎng)卡3將該網(wǎng)卡緩存中的網(wǎng)絡數(shù)據(jù)包轉(zhuǎn)換成電信號發(fā)送出去。
本實施例中,網(wǎng)卡驅(qū)動1可以在tun_get_user()中,生成數(shù)據(jù)包sk_buff后,執(zhí)行nfp_process(),若nfp_process()返回0,即查找到網(wǎng)絡數(shù)據(jù)包對應的fdb信息,并調(diào)用dev_queue_xmit()將該數(shù)據(jù)包轉(zhuǎn)發(fā)出去,此時不再執(zhí)行tun_netif_rx_ni(skb),即不再將數(shù)據(jù)包傳給linux kernel bridge子系統(tǒng);若nfp_process()返回-1,則繼續(xù)執(zhí)行tun_netif_rx_ni(skb),將數(shù)據(jù)包傳給linux kernel bridge子系統(tǒng)。具體代碼如下:
if(!nfp_process(skb->dev->ifindex,skb)){
tun_netif_rx_ni(skb);
}。
由上可知,本發(fā)明實施例可以從網(wǎng)卡緩存中讀取待發(fā)送的數(shù)據(jù)包,然后,在緩存的地址轉(zhuǎn)發(fā)信息中查找該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息,當查找到該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時,根據(jù)查找到的地址轉(zhuǎn)發(fā)信息確定用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)卡驅(qū)動,直接向該目標網(wǎng)卡驅(qū)動發(fā)送該數(shù)據(jù)包,以便通過目標網(wǎng)卡驅(qū)動將該數(shù)據(jù)包發(fā)送出去;當未查找到該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時將該數(shù)據(jù)包發(fā)送給內(nèi)核網(wǎng)橋系統(tǒng),以便通過內(nèi)核網(wǎng)橋系統(tǒng)將數(shù)據(jù)包發(fā)送出去。該方案可以將一部分數(shù)據(jù)包直接發(fā)送給目標網(wǎng)卡驅(qū)動,并通過目標網(wǎng)卡驅(qū)動將數(shù)據(jù)包轉(zhuǎn)發(fā)出去,無需再先將數(shù)據(jù)包發(fā)送至Linux kernel bridge子系統(tǒng),然后由該子系統(tǒng)進行轉(zhuǎn)發(fā)處理以將數(shù)據(jù)發(fā)送出去;因此,該方案可以提高Linux kernel bridge的數(shù)據(jù)轉(zhuǎn)發(fā)速度,進而提高Linux kernel bridge的數(shù)據(jù)轉(zhuǎn)發(fā)性能以及節(jié)省了服務器的資源。
實施例三、
為了更好地實施以上方法,本發(fā)明實施例還提供一種基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送裝置,如圖3a所示,該廣告信息發(fā)送裝置包括讀取單元301、查找單元302、確定單元303以及發(fā)送單元304,如下:
(1)讀取單元301;
讀取單元301,用于從網(wǎng)卡緩存中讀取待發(fā)送的數(shù)據(jù)包。
其中,網(wǎng)卡緩存用于存放物理網(wǎng)卡轉(zhuǎn)換的網(wǎng)絡數(shù)據(jù),每個物理網(wǎng)卡可以對應一個網(wǎng)卡緩存。
本實施例中操作系統(tǒng)可以Linux系統(tǒng)、或者其他的操作系統(tǒng)。
(2)查找單元302;
查找單元302,用于在緩存的地址轉(zhuǎn)發(fā)信息中查找該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息。
其中,地址轉(zhuǎn)發(fā)(fdb)信息為用于轉(zhuǎn)發(fā)或者發(fā)送數(shù)據(jù)包的信息,其主要功能是供網(wǎng)絡設備如服務器在數(shù)據(jù)鏈路層對數(shù)據(jù)包進行轉(zhuǎn)發(fā),用于確定數(shù)據(jù)包發(fā)往哪個端口。該地址轉(zhuǎn)發(fā)信息主要包括MAC(Media Access Control,媒體訪問控制)地址與轉(zhuǎn)發(fā)端口之間的對應關(guān)系(即映射關(guān)系)。,
比如,參考圖3b,當該緩存的地址轉(zhuǎn)發(fā)信息包括:地址轉(zhuǎn)發(fā)表時,該查找單元302,具體可以包括:
地址獲取子單元3021,用于獲取該數(shù)據(jù)包對應的目的地址;
查找子單元3022,用于根據(jù)該目的地址在緩存的地址轉(zhuǎn)發(fā)表中,查找與目的地址對應的地址轉(zhuǎn)發(fā)信息。
比如,地址獲取子單元3021,可以用于獲取該數(shù)據(jù)包對應的目的MAC地址;查找子單元3022,用于據(jù)該目的MAC地址在MAC地址轉(zhuǎn)發(fā)表中,查找與目的MAC地址對應的地址轉(zhuǎn)發(fā)表項。
(3)確定單元303;
確定單元303,用于當查找到該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時,根據(jù)查找到的地址轉(zhuǎn)發(fā)信息確定用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)卡驅(qū)動。
比如,參考圖3c,確定單元303,可以包括:
端口查找子單元3031,用于根據(jù)該查找到的地址轉(zhuǎn)發(fā)信息查找相應的轉(zhuǎn)發(fā)端口;
驅(qū)動確定子單元3032,用于將與該轉(zhuǎn)發(fā)端口關(guān)聯(lián)的網(wǎng)卡驅(qū)動,作為用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)絡驅(qū)動。
例如,端口查找子單元3031,用于根據(jù)查找到的MAC地址表項查找相應的轉(zhuǎn)發(fā)端口。
又例如,驅(qū)動確定子單元3032,用于根據(jù)該轉(zhuǎn)發(fā)端口、端口驅(qū)動映射集合確定與該轉(zhuǎn)發(fā)端口關(guān)聯(lián)的網(wǎng)卡驅(qū)動,該端口驅(qū)動映射集合包括轉(zhuǎn)發(fā)端口與網(wǎng)卡驅(qū)動之間的映射關(guān)系(對應關(guān)系)。
本實施例中,網(wǎng)卡驅(qū)動為一種驅(qū)動程序(Device Driver)全稱為“設備驅(qū)動程序”,是一種可以使計算機中央處理器——CPU控制和使用設備的特殊程序,相當于硬件的接口,操作系統(tǒng)通過這個接口,控制硬件設備的工作。
(4)發(fā)送單元304;
發(fā)送單元304,用于直接向該目標網(wǎng)卡驅(qū)動發(fā)送該數(shù)據(jù)包,以便該目標網(wǎng)卡驅(qū)動將該數(shù)據(jù)包發(fā)送出去。
比如,該發(fā)送單元304,可以具體包括:
通道建立子單元,用于與該目標網(wǎng)卡驅(qū)動之間建立通信通道;
發(fā)送子單元,用于通過該通信通道向該目標網(wǎng)卡驅(qū)動發(fā)送該數(shù)據(jù)包。
可選地,該數(shù)據(jù)轉(zhuǎn)發(fā)裝置還可以包括:緩存單元;該緩存單元用于:
在讀取單元讀取數(shù)據(jù)包之前,對內(nèi)核網(wǎng)橋系統(tǒng)的地址轉(zhuǎn)換信息進行拷貝;
對拷貝的地址轉(zhuǎn)換信息進行緩存。
具體實施時,以上各個單元可以作為獨立的實體來實現(xiàn),也可以進行任意組合,作為同一或若干個實體來實現(xiàn),以上各個單元的具體實施可參見前面的方法實施例,在此不再贅述。
該基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送裝置具體可以集成在服務器等網(wǎng)絡設備中,該服務器可以為Linux服務器等。實際應用中,該數(shù)據(jù)發(fā)送裝置可以集成在網(wǎng)卡驅(qū)動中。
由上可知,本發(fā)明實施例數(shù)據(jù)轉(zhuǎn)發(fā)裝置通過讀取單元301從網(wǎng)卡緩存中讀取待發(fā)送的數(shù)據(jù)包,然后,由查找單元302在緩存的地址轉(zhuǎn)發(fā)信息中查找該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息,當查找到該數(shù)據(jù)包對應的地址轉(zhuǎn)發(fā)信息時,由確定單元303根據(jù)查找到的地址轉(zhuǎn)發(fā)信息確定用于發(fā)送該數(shù)據(jù)包的目標網(wǎng)卡驅(qū)動,由發(fā)送單元304直接向該目標網(wǎng)卡驅(qū)動發(fā)送該數(shù)據(jù)包,以便該目標網(wǎng)卡驅(qū)動將該數(shù)據(jù)包發(fā)送出去。該方案可以將數(shù)據(jù)包直接發(fā)送給目標網(wǎng)卡驅(qū)動,并通過目標網(wǎng)卡驅(qū)動將數(shù)據(jù)包轉(zhuǎn)發(fā)出去,無需再先將數(shù)據(jù)包發(fā)送至Linux kernel bridge子系統(tǒng),然后由該子系統(tǒng)進行轉(zhuǎn)發(fā)處理以將數(shù)據(jù)發(fā)送出去;因此,該方案可以提高Linux kernel bridge的數(shù)據(jù)轉(zhuǎn)發(fā)速度,進而提高Linux kernel bridge的數(shù)據(jù)轉(zhuǎn)發(fā)性能以及節(jié)省了設備資源。
本領(lǐng)域普通技術(shù)人員可以理解上述實施例的各種方法中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,該程序可以存儲于一計算機可讀存儲介質(zhì)中,存儲介質(zhì)可以包括:只讀存儲器(ROM,Read Only Memory)、隨機存取記憶體(RAM,Random Access Memory)、磁盤或光盤等。
以上對本發(fā)明實施例所提供的一種基于操作系統(tǒng)內(nèi)核網(wǎng)橋的數(shù)據(jù)發(fā)送方法和裝置進行了詳細介紹,本文中應用了具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實施方式及應用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應理解為對本發(fā)明的限制。