一種轉(zhuǎn)發(fā)報(bào)文的方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及通信領(lǐng)域,尤其涉及一種轉(zhuǎn)發(fā)報(bào)文的方法及裝置。
【背景技術(shù)】
[0002]在網(wǎng)絡(luò)通信技術(shù)領(lǐng)域中,經(jīng)常需要從網(wǎng)絡(luò)中接收?qǐng)?bào)文,然后根據(jù)系統(tǒng)功能對(duì)報(bào)文進(jìn)行相應(yīng)的處理。處理完成后,對(duì)于中間設(shè)備,報(bào)文需要從另一個(gè)端口中轉(zhuǎn)發(fā)。這就涉及同一個(gè)系統(tǒng)中多個(gè)網(wǎng)卡間的報(bào)文轉(zhuǎn)發(fā)技術(shù),在對(duì)現(xiàn)有報(bào)文轉(zhuǎn)發(fā)技術(shù)進(jìn)行研宄的過(guò)程中,發(fā)現(xiàn)采用基于socket的應(yīng)用程序?qū)崿F(xiàn)方法。該方法基于現(xiàn)有操作系統(tǒng)平臺(tái),在用戶空間中采用socket技術(shù)完成對(duì)網(wǎng)絡(luò)報(bào)文的接收、處理、轉(zhuǎn)發(fā)的過(guò)程。在整個(gè)過(guò)程中,網(wǎng)絡(luò)報(bào)文在到達(dá)應(yīng)用程序之前,需要經(jīng)過(guò)以下處理環(huán)節(jié):網(wǎng)卡驅(qū)動(dòng)處理、內(nèi)核協(xié)議棧處理、報(bào)文從內(nèi)核空間到應(yīng)用空間的拷貝、內(nèi)核協(xié)議棧、網(wǎng)卡驅(qū)動(dòng)。而拷貝是一種很耗系統(tǒng)資源的過(guò)程,從而導(dǎo)致報(bào)文轉(zhuǎn)發(fā)的處理速率低下。
【發(fā)明內(nèi)容】
[0003]本發(fā)明實(shí)施例提供一種轉(zhuǎn)發(fā)報(bào)文的方法及裝置,用以實(shí)現(xiàn)在轉(zhuǎn)發(fā)報(bào)文的過(guò)程中,能夠避免將報(bào)文從內(nèi)核空間到應(yīng)用空間的拷貝,從而在提高報(bào)文轉(zhuǎn)發(fā)速度的同時(shí),也能夠提高系統(tǒng)的資源利用率。
[0004]本發(fā)明實(shí)施例提供一種轉(zhuǎn)發(fā)報(bào)文的方法,該方法包括:內(nèi)核態(tài)接收進(jìn)程將網(wǎng)卡接收到的報(bào)文存儲(chǔ)于共享內(nèi)存中并通知用戶態(tài)進(jìn)程;
[0005]所述用戶態(tài)進(jìn)程將所述共享內(nèi)存的物理地址映射到所述用戶態(tài)進(jìn)程的虛擬地址后,從所述共享內(nèi)存中提取所述報(bào)文并對(duì)所述報(bào)文進(jìn)行處理;
[0006]所述用戶態(tài)進(jìn)程將處理后的報(bào)文存儲(chǔ)于所述共享內(nèi)存中并通知內(nèi)核態(tài)發(fā)送進(jìn)程;
[0007]所述內(nèi)核態(tài)發(fā)送進(jìn)程將所述處理后的報(bào)文通過(guò)相應(yīng)的網(wǎng)卡發(fā)送。
[0008]較佳的,所述內(nèi)核態(tài)接收進(jìn)程將網(wǎng)卡接收到的報(bào)文存儲(chǔ)于共享內(nèi)存并通知用戶態(tài)進(jìn)程,具體為:
[0009]所述內(nèi)核態(tài)接收進(jìn)程從內(nèi)存池中申請(qǐng)內(nèi)存塊,將網(wǎng)卡接收到的所述報(bào)文存儲(chǔ)于所述內(nèi)存塊中,并將所述內(nèi)存塊的地址插入接收隊(duì)列隊(duì)尾;
[0010]所述用戶態(tài)進(jìn)程輪詢所述接收隊(duì)列,從接收隊(duì)列頭部讀取所述內(nèi)存塊的地址,直至所述接收隊(duì)列為空;
[0011]在所述接收隊(duì)列為空時(shí),所述用戶態(tài)進(jìn)程進(jìn)入睡眠狀態(tài),直至所述接收隊(duì)列非空時(shí)喚醒所述用戶態(tài)進(jìn)程。
[0012]較佳的,將所述內(nèi)存塊的地址插入接收隊(duì)列,具體為:
[0013]根據(jù)所述報(bào)文的源IP地址和目的IP地址進(jìn)行哈希運(yùn)算;
[0014]根據(jù)哈希運(yùn)算后所得到的值,確定內(nèi)核態(tài)接收隊(duì)列的隊(duì)列值;
[0015]根據(jù)確定的內(nèi)核接收隊(duì)列的隊(duì)列值,將所述報(bào)文的內(nèi)存塊地址存儲(chǔ)至相應(yīng)的接收隊(duì)列中。
[0016]較佳的,所述用戶態(tài)進(jìn)程從所述共享內(nèi)存中提取所述報(bào)文并對(duì)所述報(bào)文進(jìn)行處理,具體為:所述用戶態(tài)進(jìn)程從所述共享內(nèi)存的接收隊(duì)列隊(duì)頭中讀出存儲(chǔ)所述報(bào)文的內(nèi)存塊的地址,根據(jù)所述內(nèi)存塊的地址到內(nèi)存池的相應(yīng)位置處讀取所述報(bào)文的內(nèi)容并對(duì)所述報(bào)文進(jìn)行處理。
[0017]較佳的,所述用戶態(tài)進(jìn)程將處理后的報(bào)文存儲(chǔ)于所述共享內(nèi)存中并通知所述內(nèi)核態(tài)發(fā)送進(jìn)程,具體為:
[0018]所述用戶態(tài)進(jìn)程將所述處理后的報(bào)文的內(nèi)存塊的地址插入到發(fā)送隊(duì)列隊(duì)尾,并調(diào)用系統(tǒng)函數(shù)通知所述內(nèi)核態(tài)發(fā)送進(jìn)程。
[0019]較佳的,所述共享內(nèi)存為所述內(nèi)核態(tài)在初始化時(shí)分配的,包括:
[0020]由多內(nèi)存塊組成的內(nèi)存池;
[0021]用于保存所述內(nèi)存塊的地址的接收隊(duì)列和發(fā)送隊(duì)列所使用到的內(nèi)存;
[0022]用于保存所述接收隊(duì)列的頭指針和尾指針以及用于保存所述發(fā)送隊(duì)列的頭指針和尾指針?biāo)褂玫降膬?nèi)存。
[0023]本發(fā)明實(shí)施例提供一種轉(zhuǎn)發(fā)報(bào)文的裝置,裝置包括:
[0024]接收模塊,用于指示內(nèi)核態(tài)接收進(jìn)程將網(wǎng)卡接收到的報(bào)文存儲(chǔ)于共享內(nèi)存中并通知用戶態(tài)進(jìn)程;
[0025]處理模塊,用于在所述用戶態(tài)進(jìn)程將所述共享內(nèi)存的物理地址映射到所述用戶態(tài)進(jìn)程的虛擬地址后,從所述共享內(nèi)存中提取所述報(bào)文并對(duì)所述報(bào)文進(jìn)行處理;
[0026]通知模塊,用于在所述用戶態(tài)進(jìn)程將處理后的報(bào)文存儲(chǔ)于所述共享內(nèi)存后,通知內(nèi)核態(tài)發(fā)送進(jìn)程;
[0027]發(fā)送模塊,用于指示所述內(nèi)核態(tài)發(fā)送進(jìn)程將所述處理后的報(bào)文通過(guò)相應(yīng)的網(wǎng)卡發(fā)送。
[0028]較佳的,所述接收模塊,具體用于:
[0029]指示所述內(nèi)核態(tài)接收進(jìn)程從內(nèi)存池中申請(qǐng)內(nèi)存塊,將網(wǎng)卡接收到的所述報(bào)文存儲(chǔ)于所述內(nèi)存塊中,并將所述內(nèi)存塊的地址插入接收隊(duì)列隊(duì)尾;
[0030]指示所述用戶態(tài)進(jìn)程輪詢所述接收隊(duì)列,從接收隊(duì)列頭部讀取所述內(nèi)存塊地址,直至所述接收隊(duì)列為空;
[0031]在所述接收隊(duì)列為空時(shí),指示所述用戶態(tài)進(jìn)程進(jìn)入睡眼狀態(tài),直至所述接收隊(duì)列非空時(shí)喚醒所述用戶態(tài)進(jìn)程。
[0032]較佳的,所述接收模塊,具體用于:
[0033]根據(jù)所述報(bào)文的源IP地址和目的IP地址進(jìn)行哈希運(yùn)算;
[0034]根據(jù)哈希運(yùn)算后所得到的值,確定內(nèi)核態(tài)接收隊(duì)列的隊(duì)列值;
[0035]根據(jù)確定的內(nèi)核接收隊(duì)列的隊(duì)列值,將所述報(bào)文的內(nèi)存塊地址存儲(chǔ)至相應(yīng)的接收隊(duì)列中。
[0036]較佳的,所述處理模塊,具體用于:
[0037]指示所述用戶態(tài)進(jìn)程從所述共享內(nèi)存的接收隊(duì)列隊(duì)頭中讀出保存了所述報(bào)文的內(nèi)存塊的地址,根據(jù)所述內(nèi)存塊地址到內(nèi)存池中讀取所述報(bào)文的內(nèi)容并對(duì)所述報(bào)文進(jìn)行處理。
[0038]較佳的,所述通知模塊,具體用于:
[0039]指示所述用戶態(tài)進(jìn)程將所述處理后的報(bào)文的內(nèi)存塊地址插入到發(fā)送隊(duì)列隊(duì)尾,并調(diào)用系統(tǒng)函數(shù)通知所述內(nèi)核態(tài)發(fā)送進(jìn)程。
[0040]較佳的,所述共享內(nèi)存為所述內(nèi)核態(tài)在初始化時(shí)分配的,包括:
[0041]由多個(gè)所述內(nèi)存塊組成的內(nèi)存池;
[0042]用于保存所述內(nèi)存塊的地址的接收隊(duì)列和發(fā)送隊(duì)列所使用到的內(nèi)存;
[0043]用于保存所述接收隊(duì)列的頭指針和尾指針以及用于保存所述發(fā)送隊(duì)列的頭指針和尾指針?biāo)褂玫降膬?nèi)存。
[0044]上述實(shí)施例提供的轉(zhuǎn)發(fā)報(bào)文的方法及裝置,包括:內(nèi)核態(tài)接收進(jìn)程將網(wǎng)卡接收到的報(bào)文存儲(chǔ)于共享內(nèi)存中并通知用戶態(tài)進(jìn)程;所述用戶態(tài)進(jìn)程將所述共享內(nèi)存的物理地址映射到所述用戶態(tài)進(jìn)程的虛擬地址后,從所述共享內(nèi)存中提取所述報(bào)文并對(duì)所述報(bào)文進(jìn)行處理;所述用戶態(tài)進(jìn)程將處理后的報(bào)文存儲(chǔ)于所述共享內(nèi)存中并通知內(nèi)核態(tài)發(fā)送進(jìn)程;所述內(nèi)核態(tài)發(fā)送進(jìn)程將所述處理后的報(bào)文通過(guò)相應(yīng)的網(wǎng)卡發(fā)送??梢钥闯觯紫?,內(nèi)核態(tài)接收進(jìn)程將網(wǎng)卡接收到的報(bào)文存儲(chǔ)于共享內(nèi)存中;然后,用戶態(tài)進(jìn)程將共享內(nèi)存的物理地址與用戶態(tài)進(jìn)程的虛擬地址建立映射關(guān)系,用戶態(tài)進(jìn)程根據(jù)所建立的映射關(guān)系對(duì)網(wǎng)卡接收到的報(bào)文進(jìn)行處理,并將處理后的報(bào)文存儲(chǔ)于共享內(nèi)存中;最后,由內(nèi)核態(tài)發(fā)送進(jìn)程將處理后的報(bào)文通過(guò)相應(yīng)的網(wǎng)卡發(fā)送,因此,避免了將報(bào)文從內(nèi)核空間到應(yīng)用空間的拷貝,從而在提高報(bào)文轉(zhuǎn)發(fā)速度的同時(shí),也能夠提高系統(tǒng)的資源利用率。
【附圖說(shuō)明】
[0045]為了更清楚地說(shuō)明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)要介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域的普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
當(dāng)前第1頁(yè)
1 
2 
3 
4