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