專利名稱:一種tcp流重組拼包方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及TCP協(xié)議卸載引擎技術(shù)領(lǐng)域,特別是涉及一種TCP流重組拼包方法和裝置。
背景技術(shù):
目前,雖然CPU性能每18個(gè)月翻一番,但仍然無法跟上網(wǎng)絡(luò)速率每3年增加10倍 的腳步。隨著網(wǎng)絡(luò)帶寬激增,CPU資源被大量消耗,關(guān)鍵應(yīng)用的服務(wù)質(zhì)量難以保證,CPU處 理能力成為網(wǎng)絡(luò)端系統(tǒng)中的主要瓶頸。為此,人們提出了 TCP協(xié)議卸載引擎(TCP Offload Engine, TOE)技術(shù)。TCP協(xié)議卸載引擎技術(shù)的基本思想是將TCP/IP協(xié)議的全部處理或者部分處理轉(zhuǎn) 移到專門的硬件上進(jìn)行。近幾年新面市的高速網(wǎng)卡或多或少都會(huì)在網(wǎng)卡上集成一些TOE技 術(shù)以減輕主機(jī)端處理網(wǎng)絡(luò)數(shù)據(jù)的負(fù)擔(dān),其中普遍被采用的技術(shù)包括校驗(yàn)和卸載(checksum offloading),中斷緩和(interruptcoalescing),TCP段合并(TCP Segmentation Offload) 等。TCP段合并是在主機(jī)發(fā)送數(shù)據(jù)時(shí),不受最大傳輸單元(Maximum Transmission Unit, MTU)的限制,將一個(gè)遠(yuǎn)超MTU大小的IP包發(fā)給網(wǎng)卡,由網(wǎng)卡將IP包按照MTU的大小劃分成 可以在鏈路層傳輸?shù)男“⒏鶕?jù)劃分情況為每一個(gè)包添加新TCP/IP協(xié)議頭,再將這些小 包輸出。由于大大減少了主機(jī)端發(fā)送的包數(shù),采用TCP段合并技術(shù)可以有效的減少主機(jī)端 發(fā)送數(shù)據(jù)的開銷。在接收端利用同樣思想減少主機(jī)端接收數(shù)據(jù)開銷的技術(shù)稱作LRCKLargereceive offload),也就是網(wǎng)卡將收到的報(bào)文中屬于同一條TCP流的拼到一起,生成一個(gè)大包上傳 給主機(jī)。雖然思想類似,但LRO實(shí)現(xiàn)起來要遠(yuǎn)比TSO復(fù)雜,一是因?yàn)榫W(wǎng)卡要將所有收到的報(bào) 文按照其所屬的TCP流緩存起來,才能完成TCP流拼包;二是由于網(wǎng)絡(luò)傳輸?shù)脑?,接收?收到的報(bào)文可能出現(xiàn)亂序,需要在網(wǎng)卡上完成TCP流重組。處理這兩個(gè)問題需要靈活的分 配和釋放報(bào)文緩沖區(qū),這就給硬件實(shí)現(xiàn)LRO帶來了麻煩。目前能夠支持LRO的網(wǎng)卡多是采 用了網(wǎng)絡(luò)處理器的高端網(wǎng)卡,在網(wǎng)卡上通過運(yùn)行軟件實(shí)現(xiàn)LR0。但一般來說網(wǎng)絡(luò)處理器性能 有限,對(duì)于處理大規(guī)模并發(fā)流的高速網(wǎng)絡(luò)數(shù)據(jù)往往會(huì)力不從心。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種TCP流重組拼包方法和裝置。通過應(yīng)用本發(fā)明,對(duì)于 大多數(shù)報(bào)文的重組和拼包可以通過硬件實(shí)現(xiàn),減少了主機(jī)端與網(wǎng)卡的中斷開銷和主機(jī)端 TCP流重組拼包的開銷。利用hash運(yùn)算結(jié)果分配空閑緩沖塊的方式可以減少流記錄中存儲(chǔ) 緩沖區(qū)地址所需的空間,也適合硬件并發(fā)處理完成分配操作。為實(shí)現(xiàn)本發(fā)明的目的而提供的一種TCP流重組拼包方法,包括下列步驟步驟100.報(bào)文處理模塊接收當(dāng)前處理報(bào)文,然后從TCP流記錄表中找到該報(bào)文相 關(guān)TCP流記錄,將所述報(bào)文分成包頭信息和負(fù)載數(shù)據(jù)兩部分,并將所述負(fù)載數(shù)據(jù)寫入報(bào)文 負(fù)載數(shù)據(jù)先入先出隊(duì)列;
步驟200.報(bào)文處理模塊根據(jù)所述包頭信息更新所述TCP流記錄,并根據(jù)更新后的TCP流記錄判斷緩存當(dāng)前處理報(bào)文是否需要申請(qǐng)新的單元緩沖塊,若是,則執(zhí)行步驟300 ; 否則,執(zhí)行步驟400;步驟300.報(bào)文處理模塊向緩沖區(qū)分配模塊發(fā)送分配緩沖區(qū)請(qǐng)求,同時(shí)傳遞給緩 沖區(qū)分配模塊所述當(dāng)前處理報(bào)文的四元組,緩沖區(qū)分配模塊采用哈希函數(shù)和位圖文件的 方式為當(dāng)前處理報(bào)文的負(fù)載數(shù)據(jù)分配空閑的單元緩沖塊,返回空閑的單元緩沖塊的地址索 引;報(bào)文處理模塊根據(jù)所述單元緩沖塊的地址索引,更新所述TCP流記錄得到新的TCP流記 錄;步驟400.緩沖區(qū)數(shù)據(jù)管理模塊獲得所述新的TCP流記錄,并從報(bào)文負(fù)載數(shù)據(jù)FIFO 中讀取所述負(fù)載數(shù)據(jù),根據(jù)所述新的TCP流記錄中指定的位置將所述負(fù)載數(shù)據(jù)寫入負(fù)載數(shù) 據(jù)緩沖區(qū),完成重組和/或拼包,并將經(jīng)過重組和/或拼包的TCP流數(shù)據(jù)上傳給主機(jī)。所述TCP流記錄,記錄了對(duì)一條TCP流進(jìn)行重組拼包所需的信息,包括客戶端 IP、服務(wù)器端IP、客戶端端口、服務(wù)器端端口、TCP流狀態(tài),并為客戶端至服務(wù)器端和服務(wù)器 端至客戶端兩個(gè)方向各設(shè)置一個(gè)報(bào)文緩沖區(qū)管理字段,其中,每一個(gè)方向的報(bào)文緩沖區(qū)管 理字段可分成以下幾個(gè)部分期待序列號(hào),單元緩沖塊有效位字段,單元緩沖塊地址索引字 段,期待序列號(hào)偏移字段,緩存數(shù)據(jù)段描述符,其中單元緩沖塊有效位字段和單元緩沖塊地址索引字段分別描述分配給這條TCP流 的負(fù)載數(shù)據(jù)緩沖區(qū)的各個(gè)單元緩沖塊的狀態(tài)信息;期待序列號(hào)偏移字段,記錄這條TCP連接在一個(gè)方向上期待的下一個(gè)順序報(bào)文要 存儲(chǔ)在負(fù)載數(shù)據(jù)緩沖區(qū)中的偏移;若干個(gè)緩存數(shù)據(jù)段描述符,每個(gè)緩存數(shù)據(jù)段描述符用于描述一段存放在負(fù)載數(shù)據(jù) 緩沖區(qū)中的連續(xù)報(bào)文負(fù)載數(shù)據(jù),由兩個(gè)指針組成,兩個(gè)指針分別指向該段負(fù)載數(shù)據(jù)在負(fù)載 數(shù)據(jù)緩沖區(qū)的起始地址和結(jié)尾地址。所述緩沖區(qū)分配模塊將緩存空間劃分成η個(gè)區(qū)域,每個(gè)區(qū)域中包括多個(gè)單元緩沖 塊,每個(gè)區(qū)域用一個(gè)位圖文件記錄該區(qū)域的使用情況,每一比特記錄所述區(qū)域中的一個(gè)單 元緩沖塊是否已經(jīng)分配;每一條TCP流在一個(gè)方向上的負(fù)載數(shù)據(jù)緩沖區(qū)由η個(gè)單元緩沖塊 構(gòu)成,且一條TCP流在每個(gè)區(qū)域中只允許分配到一個(gè)單元緩沖塊。所述單元緩沖塊的物理地址是由單元緩沖塊地址索引字段Index和報(bào)文的四元 組Tuples配合運(yùn)算得到的,具體的過程為預(yù)先設(shè)定好η個(gè)hash函數(shù)Η(Η
,H[l]…… H[n-1]),每個(gè)hash函數(shù)對(duì)應(yīng)緩存空間的一個(gè)區(qū)域,IndeX[i]代表了負(fù)載數(shù)據(jù)緩沖區(qū)中的 第i個(gè)單元緩沖塊屬于η個(gè)區(qū)域中的哪一個(gè),H[IndeX[i]]代表了負(fù)載數(shù)據(jù)緩沖區(qū)中的第i 個(gè)單元緩沖塊是根據(jù)哪個(gè)hash函數(shù)得到的,則{Index[i], H[Index[i]] (Tuples)}就是負(fù) 載數(shù)據(jù)緩沖區(qū)中第i個(gè)單元緩沖塊的物理地址基址。所述步驟200,包括下列步驟步驟210.判斷當(dāng)前處理報(bào)文的序列號(hào)是否等于當(dāng)前所述TCP流記錄中的期待序 列號(hào);若是,則執(zhí)行步驟220 ;否則,執(zhí)行步驟240 ;步驟220.判斷負(fù)載數(shù)據(jù)緩沖區(qū)中是否存在亂序數(shù)據(jù),若是,則執(zhí)行步驟230 ;否 貝U,所述期待序列號(hào)=當(dāng)前期待序列號(hào)+報(bào)文長度;期待序列號(hào)偏移=當(dāng)前期待序列號(hào)偏 移+報(bào)文長度,執(zhí)行步驟240;
步驟230.判斷當(dāng)前處理報(bào)文與所述亂序數(shù)據(jù)是否相鄰,若是,則所述期待序列號(hào)=當(dāng)前期待序列號(hào)+報(bào)文長度+拼好的亂序數(shù)據(jù)長度;期待序列號(hào)偏移=當(dāng)前期待序列號(hào) 偏移+報(bào)文長度+拼好的亂序數(shù)據(jù)長度,并更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;否則,所 述期待序列號(hào)=當(dāng)前期待序列號(hào)+報(bào)文長度;期待序列號(hào)偏移=當(dāng)前期待序列號(hào)偏移+報(bào) 文長度,更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;步驟240.判斷當(dāng)前處理報(bào)文的序列號(hào)是否小于當(dāng)前TCP流記錄中的期待序列號(hào), 若是,則執(zhí)行步驟250 ;否則按照當(dāng)前報(bào)文的負(fù)載數(shù)據(jù)在其所屬TCP流的負(fù)載數(shù)據(jù)緩沖區(qū)的 存放位置更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;步驟250.判斷所述負(fù)載數(shù)據(jù)的序列號(hào)是否均小于當(dāng)前所述TCP流記錄中的期待 序列號(hào),若是,則當(dāng)前待處理報(bào)文被視為老數(shù)據(jù)包,不修改所述TCP流記錄;否則,所述期待 序列號(hào)=當(dāng)前期待序列號(hào)+當(dāng)前待處理報(bào)文中新數(shù)據(jù)的長度;期待序列號(hào)偏移=期待序列 號(hào)偏移+當(dāng)前待處理報(bào)文中新數(shù)據(jù)的長度,更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;步驟260.判斷更新后的緩存數(shù)據(jù)段描述符是否要求分配新的單元緩沖塊,若是, 表示需要申請(qǐng)新的單元緩沖塊;否則,表示不需要申請(qǐng)新的單元緩沖塊;。所述步驟300,包括下列步驟步驟310.緩沖區(qū)分配模塊接收當(dāng)前處理報(bào)文的四元組,同時(shí)使用預(yù)設(shè)的所有哈 希函數(shù)對(duì)所述四元組進(jìn)行計(jì)算,得到多個(gè)哈希運(yùn)算結(jié)果;步驟320.緩沖區(qū)分配模塊以所述哈希運(yùn)算結(jié)果為索引訪問所述哈希運(yùn)算結(jié)果對(duì) 應(yīng)的位圖文件,讀到多個(gè)1比特的數(shù)據(jù);步驟330.判斷讀到的多個(gè)1比特的數(shù)據(jù)中是否有“0”,若是,則表示對(duì)應(yīng)所述區(qū)域 中這個(gè)哈希運(yùn)算結(jié)果索引的位置上的單元緩沖區(qū)塊空閑;否則執(zhí)行步驟350 ;步驟340.從多個(gè)1比特的數(shù)據(jù)中任意選擇一個(gè)“0”,將“0”在多個(gè)1比特的數(shù)據(jù)中 的位置作為分配的單元緩沖塊的地址索引,返還給報(bào)文處理模塊,并修改所述位圖文件;步驟350.不緩存當(dāng)前處理報(bào)文,通知緩沖區(qū)數(shù)據(jù)管理模塊將這條TCP流的負(fù)載數(shù) 據(jù)緩沖區(qū)緩存的所有數(shù)據(jù)和當(dāng)前處理報(bào)文一并傳給主機(jī)。所述步驟400,包括下列步驟步驟410.緩沖區(qū)數(shù)據(jù)管理模塊根據(jù)報(bào)文處理模塊的結(jié)果,從所述先入先出隊(duì)列 中讀出報(bào)文負(fù)載數(shù)據(jù)寫入負(fù)載數(shù)據(jù)緩沖區(qū);步驟420.判斷是否存在一條TCP流在緩沖區(qū)中存儲(chǔ)的順序數(shù)據(jù)長度超過一個(gè)預(yù) 設(shè)值,若是,則執(zhí)行步驟430 ;否則,執(zhí)行步驟440 ;步驟430.緩沖區(qū)數(shù)據(jù)管理模塊將拼好的順序數(shù)據(jù)取出,根據(jù)當(dāng)前處理報(bào)文的包 頭信息為這一段數(shù)據(jù)添加一個(gè)偽造包頭,生成一個(gè)拼好的大包上傳給主機(jī);步驟440.判斷是否存在一條TCP流在緩沖區(qū)中存儲(chǔ)的亂序數(shù)據(jù)長度超過一個(gè)預(yù) 設(shè)值,或是亂序數(shù)據(jù)超出了負(fù)載數(shù)據(jù)緩沖區(qū)的范圍,若是,則執(zhí)行步驟450 ;否則,返回步驟 410 ;步驟450.緩沖區(qū)數(shù)據(jù)管理模塊根據(jù)流記錄中的緩存數(shù)據(jù)段描述符取出緩沖區(qū)中 存儲(chǔ)的亂序數(shù)據(jù),生成拼好的大包上傳給主機(jī)。為實(shí)現(xiàn)本發(fā)明的目的還提供一種TCP流重組拼包裝置,所述裝置,包括報(bào)文處理模塊,用于接收當(dāng)前處理報(bào)文,將所述報(bào)文分成包頭信息和負(fù)載數(shù)據(jù)兩部分,將所述負(fù)載數(shù)據(jù)寫入報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列,根據(jù)所述包頭信息以及緩沖分配模塊的地址索引更新TCP流記錄;如果緩存當(dāng)前處理報(bào)文需要申請(qǐng)新的單元緩沖塊,向緩 沖區(qū)分配模塊發(fā)送分配緩沖區(qū)請(qǐng)求;緩沖區(qū)數(shù)據(jù)管理模塊,用于根據(jù)所述包頭信息從報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列中讀 取負(fù)載數(shù)據(jù),根據(jù)更新后的TCP流記錄中指定的位置將所述負(fù)載數(shù)據(jù)寫入負(fù)載數(shù)據(jù)緩沖 區(qū),完成重組和/或拼包,并將經(jīng)過重組和/或拼包的TCP流數(shù)據(jù)上傳給主機(jī);報(bào)文負(fù)載數(shù)據(jù)FIFO,用于緩存報(bào)文的負(fù)載數(shù)據(jù);緩沖區(qū)分配模塊,采用哈希函數(shù)和位圖文件的方式為當(dāng)前處理報(bào)文的負(fù)載數(shù)據(jù)分 配負(fù)載數(shù)據(jù)緩沖區(qū)中空閑的單元緩沖塊,返回空閑的單元緩沖塊的地址索引;緩存空間,用于按照相應(yīng)TCP流的報(bào)文順序緩存報(bào)文負(fù)載數(shù)據(jù)。所述TCP流記錄,記錄了對(duì)一條TCP流進(jìn)行重組拼包所需的信息,包括客戶端 IP、服務(wù)器端IP、客戶端端口、服務(wù)器端端口、TCP流狀態(tài),并為客戶端至服務(wù)器端和服務(wù)器 端至客戶端兩個(gè)方向各設(shè)置一個(gè)報(bào)文緩沖區(qū)管理字段,其中,每一個(gè)方向的報(bào)文緩沖區(qū)管 理字段可分成以下幾個(gè)部分期待序列號(hào),單元緩沖塊有效位字段,單元緩沖塊地址索引字 段,期待序列號(hào)偏移字段,緩存數(shù)據(jù)段描述符,其中單元緩沖塊有效位字段和單元緩沖塊地址索引字段分別描述分配給這條TCP流的負(fù)載數(shù)據(jù)緩沖區(qū)的各個(gè)單元緩沖塊的狀態(tài)信息;期待序列號(hào)偏移字段,記錄這條TCP連接在一個(gè)方向上期待的下一個(gè)順序報(bào)文要 存儲(chǔ)在負(fù)載數(shù)據(jù)緩沖區(qū)中的偏移;若干個(gè)緩存數(shù)據(jù)段描述符,每個(gè)緩存數(shù)據(jù)段描述符用于描述一段存放在負(fù)載數(shù)據(jù) 緩沖區(qū)中的連續(xù)報(bào)文負(fù)載數(shù)據(jù),由兩個(gè)指針組成,兩個(gè)指針分別指向該段負(fù)載數(shù)據(jù)在負(fù)載 數(shù)據(jù)緩沖區(qū)的起始地址和結(jié)尾地址。所述緩沖區(qū)分配模塊將緩存空間劃分成η個(gè)區(qū)域,每個(gè)區(qū)域中包括多個(gè)單元緩沖 塊,每個(gè)區(qū)域用一個(gè)位圖文件記錄該區(qū)域的使用情況,每一比特記錄所述區(qū)域中的一個(gè)單 元緩沖塊是否已經(jīng)分配;每一條TCP流在一個(gè)方向上的負(fù)載數(shù)據(jù)緩沖區(qū)由η個(gè)單元緩沖塊 構(gòu)成,且一條TCP流在每個(gè)區(qū)域中只允許分配到一個(gè)單元緩沖塊。所述單元緩沖塊的物理地址是由單元緩沖塊地址索引字段Index和報(bào)文的四元 組Tuples配合運(yùn)算得到的,具體的過程為預(yù)先設(shè)定好η個(gè)hash函數(shù)Η(Η
,H[l]…… H[n-1]),每個(gè)hash函數(shù)對(duì)應(yīng)緩存空間的一個(gè)區(qū)域,IndeX[i]代表了負(fù)載數(shù)據(jù)緩沖區(qū)中的 第i個(gè)單元緩沖塊屬于η個(gè)區(qū)域中的哪一個(gè),H[IndeX[i]]代表了負(fù)載數(shù)據(jù)緩沖區(qū)中的第i 個(gè)單元緩沖塊是根據(jù)哪個(gè)hash函數(shù)得到的,則{Index[i], H[Index[i]] (Tuples)}就是負(fù) 載數(shù)據(jù)緩沖區(qū)中第i個(gè)單元緩沖塊的物理地址基址。所述報(bào)文處理模塊,包括判斷模塊和TCP流記錄修改模塊,其中所述判斷模塊,包括序列號(hào)判斷子模塊,用于比較當(dāng)前處理報(bào)文的序列號(hào)與當(dāng)前所述TCP流記錄中的 期待序列號(hào)的關(guān)系;若等于,則觸發(fā)亂數(shù)判斷子模塊;若大于,則觸發(fā)所述TCP流記錄修改 模塊;若當(dāng)所述負(fù)載數(shù)據(jù)的序列號(hào)均小于當(dāng)前所述TCP流記錄中的期待序列號(hào)時(shí),則將當(dāng) 前待處理報(bào)文被視為老數(shù)據(jù)包,不修改所述TCP流記錄;否則,觸發(fā)所述TCP流記錄修改模 塊;
亂數(shù)判斷子模塊,用于判斷負(fù)載數(shù)據(jù)緩沖區(qū)中是否存在亂序數(shù)據(jù),若是,則觸發(fā)相 鄰判斷子模塊;否則,觸發(fā)所述TCP流記錄修改模塊;相鄰判斷子模塊,用于判斷當(dāng)前處理報(bào)文與所述亂序數(shù)據(jù)是否相鄰,若是,則觸發(fā) 所述TCP流記錄修改模塊;否則,觸發(fā)所述TCP流記錄修改模塊;所述TCP流記錄修改模塊,用于根據(jù)所述判斷模塊的判斷結(jié)果修改所述TCP流記 錄,更新緩存數(shù)據(jù)段描述符。所述緩沖區(qū)分配模塊,包括接收模塊,用于接收當(dāng)前處理報(bào)文的四元組;計(jì)算模塊,用于使用與所述數(shù)據(jù)緩沖區(qū)中多個(gè)區(qū)域?qū)?yīng)的多個(gè)哈希函數(shù)對(duì)接收到 的四元組進(jìn)行計(jì)算,得到多個(gè)哈希運(yùn)算結(jié)果;訪問模塊,用于以所述哈希運(yùn)算結(jié)果為索引訪問所述哈希運(yùn)算結(jié)果對(duì)應(yīng)的位圖文 件,讀到多個(gè)1比特的數(shù)據(jù);0判斷模塊,用于判斷讀到的多個(gè)1比特的數(shù)據(jù)中是否有“0”,若是,則表示對(duì)應(yīng)所 述區(qū)域中這個(gè)哈希運(yùn)算結(jié)果索引的位置上的單元緩沖區(qū)塊空閑,觸發(fā)分配模塊;否則觸發(fā) 上傳模塊;上傳模塊,不緩存當(dāng)前處理報(bào)文,通知緩沖區(qū)數(shù)據(jù)管理模塊將這條TCP流的負(fù)載 數(shù)據(jù)緩沖區(qū)緩存的所有數(shù)據(jù)和當(dāng)前處理報(bào)文一并傳給主機(jī);分配模塊,用于從讀到的多個(gè)1比特的數(shù)據(jù)中任意選擇一個(gè)“0”,將“0”在多個(gè)1 比特的數(shù)據(jù)中的位置作為分配的單元緩沖塊的地址索引,返還給報(bào)文處理模塊,并修改所 述位圖文件。所述緩沖區(qū)數(shù)據(jù)管理模塊,包括負(fù)載數(shù)據(jù)讀取模塊,用于從所述先入先出隊(duì)列中讀出報(bào)文負(fù)載數(shù)據(jù)寫入所述負(fù)載 數(shù)據(jù)緩沖區(qū);閾值判斷模塊,用于判斷是否存在一條TCP流在負(fù)載數(shù)據(jù)緩沖區(qū)中存儲(chǔ)的順序數(shù) 據(jù)長度超過一個(gè)預(yù)設(shè)值,若是,則觸發(fā)順序拼包模塊;否則,觸發(fā)亂數(shù)閾值判斷模塊;順序拼包模塊,用于將拼好的順序數(shù)據(jù)取出,根據(jù)當(dāng)前處理報(bào)文的包頭信息為這 一段數(shù)據(jù)添加一個(gè)偽造包頭,生成一個(gè)拼好的大包上傳給主機(jī);亂數(shù)閾值判斷模塊,用于判斷是否存在一條TCP流在緩沖區(qū)中存儲(chǔ)的亂序數(shù)據(jù)長 度超過一個(gè)預(yù)設(shè)值,或是亂序數(shù)據(jù)超出了負(fù)載數(shù)據(jù)緩沖區(qū)的范圍,若是,則觸發(fā)亂序拼包模 塊;否則,觸發(fā)負(fù)載數(shù)據(jù)讀取模塊;亂序拼包模塊,根據(jù)流記錄中的緩存數(shù)據(jù)段描述符取出緩沖區(qū)中存儲(chǔ)的亂序數(shù) 據(jù),生成拼好的大包上傳給主機(jī)。本發(fā)明的有益效果是 1.對(duì)于大多數(shù)報(bào)文的重組和拼包可以通過硬件實(shí)現(xiàn),減少了主機(jī)端與網(wǎng)卡的中斷 開銷和主機(jī)端TCP流重組拼包的開銷;2.采用hash運(yùn)算和位圖文件分配空閑緩沖塊的方式可以減少流記錄中存儲(chǔ)緩沖 區(qū)地址所需的空間,也適合硬件并發(fā)處理完成分配操作;3.本發(fā)明是基于硬件實(shí)現(xiàn),限制了分配給每一條TCP流的最大緩沖區(qū)空間,以此 防止嫌疑威脅流利用亂序TCP流耗盡系統(tǒng)的內(nèi)存。
通過結(jié)合附圖對(duì)本發(fā)明具體實(shí)施例的描述,本發(fā)明的其它方面及特征對(duì)本領(lǐng)域的 技術(shù)人員而言是顯而易見的。
圖1是本發(fā)明中TCP流記錄的結(jié)構(gòu)圖;圖2是本發(fā)明的一種TCP流重組拼包方法的步驟流程圖;圖3是本發(fā)明中根據(jù)包頭信息判斷亂序報(bào)文的步驟流程圖;圖4是本發(fā)明中緩沖區(qū)分配模塊分配緩沖區(qū)的步驟流程圖;圖5是本發(fā)明中緩沖區(qū)數(shù)據(jù)管理模塊完成重組和/或拼包的步驟流程圖;圖6是本發(fā)明一種TCP流重組拼包系統(tǒng)的結(jié)構(gòu)流程圖。
具體實(shí)施例方式為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì) 本發(fā)明的一種TCP流重組拼包方法和裝置。進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述 的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。為了清楚的說明本發(fā)明,以下對(duì)概念進(jìn)行解釋本發(fā)明中的存儲(chǔ)空間,包括緩存空間、負(fù)載數(shù)據(jù)緩沖區(qū)和單元緩沖塊三個(gè)概念。 其中,緩存空間是指所有可用的存儲(chǔ)空間(比如2GB),它是由多個(gè)單元緩沖塊組成,物理地 址是不連續(xù)的。所述負(fù)載數(shù)據(jù)緩沖區(qū)是一個(gè)邏輯概念,是指為實(shí)現(xiàn)對(duì)一條TCP流進(jìn)行重組 拼包所需要分配的空間,比較小(32KB或64KB),實(shí)質(zhì)上是由所述緩存空間中空閑的單元緩 沖塊形成的,其在邏輯地址上是連續(xù)的。不同TCP流分配到的負(fù)載數(shù)據(jù)緩沖區(qū)是不同的(也 就是說在處理多個(gè)并發(fā)TCP流時(shí)會(huì)分配多個(gè)負(fù)載數(shù)據(jù)緩沖區(qū)),但他們都是從緩存空間中 獲得的。圖1是本發(fā)明中TCP流記錄的結(jié)構(gòu)圖,如圖1所示,所述TCP流記錄一個(gè)TCP流 記錄有64字節(jié),這是基于有效利用DRAM總線帶寬的考慮,選擇一次DRAM突發(fā)讀(burst read)可以讀取一個(gè)TCP流記錄。其中四元組占據(jù)12字節(jié),包含了這條TCP流的Client端 IP地址(4字節(jié)),Server端IP地址(4字節(jié)),Client端端口地址(2字節(jié)),Server端端 口地址(2字節(jié))。Client至Server序列(Sequence) (4字節(jié))存儲(chǔ)的是這條TCP流Client 至Server方向期待看到的順序報(bào)文的序列號(hào),如果收到的Client至Server方向上的最新 報(bào)文的序列號(hào)等于這個(gè)域存儲(chǔ)的值,則認(rèn)為收到了一個(gè)順序報(bào)文,同時(shí)更新這個(gè)域的值為 期待的下一個(gè)報(bào)文的序列號(hào)。Server至Client序列(Sequence) (4字節(jié))存儲(chǔ)的是這條 TCP流Server至Client方向期待看到的順序報(bào)文的序列號(hào)。具體處理方式與Client至 Server Sequence—致。狀態(tài)域字段(4字節(jié))記錄的是這條TCP流的當(dāng)前狀態(tài),主要包括 是否完成三次握手,是否收到亂序的報(bào)文,兩個(gè)方向上是否收到帶結(jié)束標(biāo)記的報(bào)文,該TCP 流當(dāng)前緩存數(shù)據(jù)段狀態(tài)等各種狀態(tài)信息。對(duì)于一條TCP流的重組拼包需要知道當(dāng)前這條流的狀態(tài),如亂序數(shù)據(jù)被緩存到哪 里,亂序數(shù)據(jù)與本應(yīng)收到的順序數(shù)據(jù)間的順序等。這些信息是需要進(jìn)行保存的,因此,本發(fā) 明提供了一種TCP流記錄結(jié)構(gòu),其與負(fù)載數(shù)據(jù)緩沖區(qū)共用可用的存儲(chǔ)空間,負(fù)載數(shù)據(jù)緩沖 區(qū)中包括多個(gè)單元緩沖塊,分配時(shí)以單元緩沖塊作為基本單位分配給TCP流。本發(fā)明中為了實(shí)現(xiàn)TCP流重組和拼包,需要為一條TCP流的兩個(gè)傳輸方向各分配一個(gè)負(fù)載數(shù)據(jù)緩沖區(qū) 以存儲(chǔ)接收到的報(bào)文負(fù)載數(shù)據(jù),大小為64KB。下面將對(duì)所述TCP流記錄表的結(jié)構(gòu)進(jìn)行詳細(xì) 說明。所述TCP流記錄(如圖1所示)中包括客戶端IP、服務(wù)器端IP、客戶端端口、月艮 務(wù)器端端口、TCP流狀態(tài),以及在Client至Server和Server至Client兩個(gè)方向上各設(shè)置 20字節(jié)的報(bào)文緩沖區(qū)管理字段,總計(jì)40字節(jié)。每一個(gè)方向的報(bào)文緩沖區(qū)管理字段可分成以 下幾個(gè)部分期待序列號(hào),單元緩沖塊有效位字段,單元緩沖塊地址索引字段,期待序列號(hào) 偏移字段,緩存數(shù)據(jù)段描述符。下面描述Client至Server方向上各個(gè)字段的含義,Server 至Client方向的字段與其類似。單元緩沖塊有效位字段和單元緩沖塊地址索引字段Index分別描述分配給這條 TCP流的負(fù)載數(shù)據(jù)緩沖區(qū)中各個(gè)單元緩沖塊的狀態(tài)信息。因?yàn)樨?fù)載數(shù)據(jù)緩沖區(qū)的分配以單 元緩沖塊為單位,采取用時(shí)動(dòng)態(tài)分配的策略,只分配緩存當(dāng)前TCP流收到的數(shù)據(jù)所需的單 元緩沖塊,所以負(fù)載數(shù)據(jù)緩沖區(qū)這個(gè)邏輯空間中的某些區(qū)間可能暫時(shí)沒有分配實(shí)際的單元 緩沖塊。單元緩沖塊有效位字段V長16bit,每一位就代表了在負(fù)載數(shù)據(jù)緩沖區(qū)中的對(duì)應(yīng)位 置上是否已經(jīng)分配了單元緩沖塊,如V
為1表示在負(fù)載數(shù)據(jù)緩沖區(qū)中的OK 4K的位置 已經(jīng)分配了一個(gè)單元緩沖塊,V[2]為0表示在負(fù)載數(shù)據(jù)緩沖區(qū)中的8K 12K的位置還沒 有分配單元緩沖塊。本發(fā)明中單元緩沖塊的物理地址是由單元緩沖塊地址索引字段Index和報(bào)文的 四元組Tuples配合運(yùn)算得到的,由于本發(fā)明中緩存空間被分成16個(gè)區(qū)域,每個(gè)區(qū)域中包括 多個(gè)單元緩沖塊,因此單元緩沖塊的物理地址的計(jì)算方法為預(yù)先設(shè)定好16個(gè)hash函數(shù) H(H
,H[1]……H[15]),每個(gè)hash函數(shù)對(duì)應(yīng)緩存空間的一個(gè)區(qū)域,Index [i]代表了負(fù)載 數(shù)據(jù)緩沖區(qū)中的第i個(gè)單元緩沖塊屬于16個(gè)區(qū)域中的哪一個(gè),H[IndeX[i]]代表了負(fù)載數(shù) 據(jù)緩沖區(qū)中的第i個(gè)單元緩沖塊是根據(jù)哪個(gè)hash函數(shù)得到的,則{Index[i],H[Index[i]] (Tuples)}就是負(fù)載數(shù)據(jù)緩沖區(qū)中第i個(gè)單元緩沖塊的物理地址基址。假設(shè)數(shù)據(jù)包的四元 組為(1. 1. 1. 1:1,2.2.2. 2:2),那么單元緩沖塊i的物理地址為{IndeX[i],H[Index[i]] (1. 1. 1. 1:1,2. 2. 2. 2:2)} =
,其中物理地址的高 4 位是 0101,表示這是從5號(hào)區(qū)域分配的單元緩沖塊i,物理地址的低幾位是指由H5這個(gè)hash函 數(shù)計(jì)算四元組得出來的。本實(shí)施例中1個(gè)單元緩沖塊需要4bits來標(biāo)記16個(gè)hash函數(shù)中具體用到的函數(shù), 單元緩沖塊地址索引字段維護(hù)16個(gè)單元緩沖塊所需的總長度就是16*4bits = SBytes。期待序列號(hào)偏移字段占16bit,記錄這條TCP在一個(gè)方向上期待的下一個(gè)順序報(bào) 文要存儲(chǔ)在負(fù)載數(shù)據(jù)緩沖區(qū)中的偏移,從負(fù)載數(shù)據(jù)緩沖區(qū)的起始地址至這個(gè)偏移,即為這 條TCP流在Client至Server方向上已經(jīng)緩存拼好的數(shù)據(jù)報(bào)文,即為順序數(shù)據(jù)。另外還有 兩個(gè)緩存數(shù)據(jù)段描述符,用于描述一段存放在負(fù)載數(shù)據(jù)緩沖區(qū)中的報(bào)文負(fù)載數(shù)據(jù)。每一個(gè) 緩存數(shù)據(jù)段描述符長32bit,由兩個(gè)16bit的指針組成,兩個(gè)指針分別指向該段負(fù)載數(shù)據(jù)在 負(fù)載數(shù)據(jù)緩沖區(qū)的起始地址和結(jié)尾地址。本具體實(shí)施例在Client至Server方向上最多可 以記錄兩段負(fù)載數(shù)據(jù),這對(duì)于正常的網(wǎng)絡(luò)流量在絕大多數(shù)情況下是夠用的。圖2是本發(fā)明的一種TCP流重組拼包方法的步驟流程圖,如圖2所示,結(jié)合本發(fā)明 的TCP流記錄,本發(fā)明的一種TCP流重組拼包方法,包括下列步驟
步驟100.報(bào)文處理模塊接收當(dāng)前處理報(bào)文,然后從TCP流記錄表中找到該報(bào)文相關(guān)TCP流記錄,將所述報(bào)文分成包頭信息和負(fù)載數(shù)據(jù)兩部分,并將所述負(fù)載數(shù)據(jù)寫入報(bào)文 負(fù)載數(shù)據(jù)FIFO ;步驟200.報(bào)文處理模塊根據(jù)所述包頭信息更新TCP流記錄,并根據(jù)更新后的TCP 流記錄判斷緩存當(dāng)前處理報(bào)文是否需要申請(qǐng)新的單元緩沖塊,若是,則執(zhí)行步驟300;否 貝丨J,執(zhí)行步驟400;圖3是本發(fā)明中根據(jù)包頭信息判斷亂序報(bào)文的步驟流程圖,如圖3所示,所述步驟 200,包括下列步驟步驟210.判斷當(dāng)前處理報(bào)文的序列號(hào)是否等于當(dāng)前TCP流記錄中的期待序列號(hào); 若是,則執(zhí)行步驟220 ;否則,執(zhí)行步驟240 ;步驟220.判斷負(fù)載數(shù)據(jù)緩沖區(qū)中是否存在亂序數(shù)據(jù),若是,則執(zhí)行步驟230 ;否 貝1J,所述期待序列號(hào)=當(dāng)前期待序列號(hào)+報(bào)文長度;期待序列號(hào)偏移=當(dāng)前期待序列號(hào)偏 移+報(bào)文長度,執(zhí)行步驟240;步驟230.判斷當(dāng)前處理報(bào)文與所述亂序數(shù)據(jù)是否相鄰,若是,則所述期待序列號(hào) =當(dāng)前期待序列號(hào)+報(bào)文長度+拼好的亂序數(shù)據(jù)長度;期待序列號(hào)偏移=當(dāng)前期待序列號(hào) 偏移+報(bào)文長度+拼好的亂序數(shù)據(jù)長度,并更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;否則,所 述期待序列號(hào)=當(dāng)前期待序列號(hào)+報(bào)文長度;期待序列號(hào)偏移=當(dāng)前期待序列號(hào)偏移+報(bào) 文長度,更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;步驟240.判斷當(dāng)前處理報(bào)文的序列號(hào)是否小于當(dāng)前TCP流記錄中的期待序列號(hào), 若是,則執(zhí)行步驟250 ;否則按照當(dāng)前報(bào)文的負(fù)載數(shù)據(jù)在其所屬TCP流的負(fù)載數(shù)據(jù)緩沖區(qū)的 存放位置更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;步驟250.判斷所述負(fù)載數(shù)據(jù)的序列號(hào)是否均小于當(dāng)前TCP流記錄中的期待序列 號(hào),若是,則當(dāng)前待處理報(bào)文被視為老數(shù)據(jù)包,不修改TCP流記錄;否則,所述期待序列號(hào)= 當(dāng)前期待序列號(hào)+當(dāng)前待處理報(bào)文中新數(shù)據(jù)的長度;期待序列號(hào)偏移=期待序列號(hào)偏移+ 當(dāng)前待處理報(bào)文中新數(shù)據(jù)的長度,更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;步驟260.判斷更新后的緩存數(shù)據(jù)段描述符是否要求分配新的單元緩沖塊,若是, 表示需要分配緩沖塊;否則,不需要分配緩沖塊;舉例而言,假設(shè)一條TCP流有5個(gè)數(shù)據(jù)包1、2、3、4、5,每個(gè)都是長lOObytes,數(shù)據(jù) 包1的序列號(hào)是1000,數(shù)據(jù)包2的序列號(hào)是1100,數(shù)據(jù)包3的序列號(hào)是1200,數(shù)據(jù)包4的序 列號(hào)是1300,數(shù)據(jù)包5的序列號(hào)是1400。如果數(shù)據(jù)包是以1,2,3,4,5的順序到來,則收到第一個(gè)數(shù)據(jù)包1后,依照步驟200, 期待序列號(hào)=1000+100 = 1100,期待序列號(hào)偏移=0+100 = 100 ;收到第二個(gè)數(shù)據(jù)包2后, 期待序列號(hào)=1100+100 = 1200,期待序列號(hào)偏移=100+100 = 200 ;如果數(shù)據(jù)包是以1,3,4,2,5的順序到來,在數(shù)據(jù)包3到來時(shí),期待序列號(hào)是1100, 但數(shù)據(jù)包3的序列號(hào)是1200,根據(jù)步驟200,確定是亂序報(bào)文,這時(shí)只修改TCP流記錄中 關(guān)于亂序緩沖區(qū)的部分,而不修改期待序列號(hào);第四個(gè)數(shù)據(jù)包2到來時(shí),期待序列號(hào)仍是 1100,而數(shù)據(jù)包2的序列號(hào)是1100,為順序報(bào)文,同時(shí)還拼好了亂序數(shù)據(jù)包3和4,因此會(huì) 同時(shí)修改TCP流記錄中的期待序列號(hào)部分和亂序緩沖區(qū)的部分,修改后的期待序列號(hào)是 1400。
比較更新后的緩存數(shù)據(jù)段描述符和單元緩沖塊有效位字段,可以判斷是否要求新 的單元緩沖塊。例如收到一個(gè)數(shù)據(jù)包后緩存數(shù)據(jù)段描述符為
,表示在該TCP流的負(fù) 載數(shù)據(jù)緩沖區(qū)在0_5k的這段空間有緩存的報(bào)文數(shù)據(jù)。如果此時(shí)單元緩沖塊有效位字段V 中,VW] = 1,V[1] =0,就表示該TCP流的負(fù)載數(shù)據(jù)緩沖區(qū)在0-4k這個(gè)區(qū)間分配了一個(gè)單 元緩沖塊,而在4k-8k則沒有分配單元緩沖塊。這就意味著要在負(fù)載數(shù)據(jù)緩沖區(qū)的4k-5k 部分存放報(bào)文數(shù)據(jù),就必須為4k-8k這個(gè)區(qū)間申請(qǐng)一個(gè)新的單元緩沖塊。步驟300.報(bào)文處理模塊向緩沖區(qū)分配模塊發(fā)送分配緩沖區(qū)請(qǐng)求,同時(shí)傳遞給緩 沖區(qū)分配模塊當(dāng)前處理報(bào)文的四元組,緩沖區(qū)分配模塊采用hash函數(shù)和位圖文件的方式 為當(dāng)前處理報(bào)文分配空閑的單元緩沖塊,返回單元緩沖塊的地址索引;報(bào)文處理模塊根據(jù) 所述單元緩沖塊的地址索引,更新所述TCP流記錄得到新的TCP流記錄;本發(fā)明中,緩沖區(qū)分配模塊將緩存空間劃分成16個(gè)區(qū)域,每個(gè)區(qū)域中包括多個(gè)單 元緩沖塊,每個(gè)區(qū)域用一個(gè)位圖文件記錄該區(qū)域的使用情況,每一 bit記錄所述區(qū)域中的1 個(gè)單元緩沖塊是否已經(jīng)分配。單元緩沖塊作為空間分配的基本單位,是物理地址連續(xù)的一 小段區(qū)域。每一條TCP流在一個(gè)方向上的負(fù)載數(shù)據(jù)緩沖區(qū)由16個(gè)單元緩沖塊構(gòu)成,負(fù)載數(shù) 據(jù)緩沖區(qū)只是邏輯上連續(xù)的一段空間,實(shí)際的物理地址由其分配到的單元緩沖塊決定。單 元緩沖塊的分配采取用時(shí)動(dòng)態(tài)分配策略。
所述緩沖區(qū)分配模塊為每條TCP流分配空閑的單元緩沖塊,每一條TCP流在一個(gè) 區(qū)域中只允許分配到一個(gè)指定位置上的單元緩沖塊,具體位置是TCP流四元組的hash運(yùn) 算結(jié)果對(duì)應(yīng)的區(qū)域。查找可用空間時(shí)對(duì)所有位圖進(jìn)行并行查找,如果發(fā)現(xiàn)該區(qū)域指定位置 上的單元緩沖塊已經(jīng)分配給了其它TCP流的緩沖區(qū),則只能從其它區(qū)域的指定位置上查找 可用的單元緩沖塊。處理報(bào)文處理模塊的分配請(qǐng)求時(shí)可以對(duì)16個(gè)位圖進(jìn)行并行查找,如果 位圖顯示多個(gè)區(qū)域內(nèi)有單元緩沖塊可用,可以任意選擇一個(gè)單元緩沖塊分配給報(bào)文處理模 塊。緩沖區(qū)分配模塊返回給報(bào)文處理模塊的不是單元緩沖塊的物理地址,而是單元緩沖塊 地址索引,也就是告訴報(bào)文處理模塊根據(jù)哪個(gè)hash函數(shù)可以算出新分配的單元緩沖塊的 物理地址。舉例而言,可用的存儲(chǔ)空間為16Mbytes的話,每個(gè)區(qū)域就是IMbytes,16個(gè)區(qū)域 分別為Dl,D2……D16。位圖文件與區(qū)域一一對(duì)應(yīng),就是16個(gè)位圖文件,分別是Bi,B2…… B160 一個(gè)單元緩沖塊是4KB,所以1個(gè)區(qū)域有256個(gè)單元緩沖塊。一個(gè)位圖文件的大小就 是32Byte(256bits)。Bl中的任意一個(gè)bit與Dl中的一個(gè)單元緩沖塊——對(duì)應(yīng)。如果是 ‘1’表示這個(gè)緩沖塊分配出去了,如果是‘0’則還沒有分配。較佳地,本發(fā)明中所述單元緩沖塊的物理地址是由單元緩沖塊地址索引字段 Index和報(bào)文的四元組Tuples配合運(yùn)算得到的,具體的過程為預(yù)先設(shè)定好一組hash函數(shù) H(H
,H[1]……H[15]), Index[i]代表了負(fù)載數(shù)據(jù)緩沖區(qū)中的第i個(gè)單元緩沖塊是根據(jù) 哪個(gè)hash函數(shù)得到的,則{Index[i], H[Index[i]] (Tuples)}就是負(fù)載數(shù)據(jù)緩沖區(qū)中第i 個(gè)單元緩沖塊的物理地址基址。本實(shí)施例中1個(gè)單元緩沖塊需要4bits來標(biāo)記16個(gè)hash 函數(shù)中具體用到的函數(shù),單元緩沖塊地址索引字段維護(hù)16個(gè)單元緩沖塊所需的總長度就 是 16*4bits = 8Bytes0圖4是本發(fā)明中緩沖區(qū)分配模塊分配緩沖區(qū)的步驟流程圖,如圖4所示,所述步驟 300,包括下列步驟
步驟310.緩沖區(qū)分配模塊接收當(dāng)前處理報(bào)文的四元組,同時(shí)使用預(yù)設(shè)的所有 hash函數(shù)對(duì)四元組進(jìn)行計(jì)算,得到16個(gè)hash結(jié)果;步驟320.緩沖區(qū)分配模塊以hash結(jié)果為索引訪問hash結(jié)果對(duì)應(yīng)的位圖文件,讀 到16個(gè)Ι-bit的數(shù)據(jù);步驟330.判斷讀到的16個(gè)Ibit數(shù)據(jù)中是否有’ 0’,若是,則表示對(duì)應(yīng)所述區(qū)域中 這個(gè)hash結(jié)果索引的位置上的單元緩沖塊空閑。否則執(zhí)行步驟350’步驟340.從16bits的數(shù)據(jù)中任意選擇一個(gè)’ 0’,這個(gè)’ 0’在16bits中的位置作 為分配的單元緩沖塊的地址索引,返還給報(bào)文處理模塊,修改位圖文件,退出;步驟350.不緩存當(dāng)前待處理報(bào)文,通知緩沖區(qū)數(shù)據(jù)管理模塊將這條TCP流的負(fù)載 數(shù)據(jù)緩沖區(qū)緩存的所有數(shù)據(jù)和當(dāng)前待處理報(bào)文一并傳給主機(jī)。作為一種可實(shí)施方式,假設(shè)報(bào)文處理模塊處理的數(shù)據(jù)包的四元組為(1. 1. 1. 1:1, 2. 2. 2. 2:2),預(yù)設(shè)的16個(gè)hash函數(shù),對(duì)這個(gè)四元組做運(yùn)算的結(jié)果為1000,2000,3000…… 16000,讀取16個(gè)位圖文件對(duì)應(yīng)位置上的數(shù)據(jù),讀的其實(shí)是Bl [1000],B2[2000], B3[3000]……B16[16000],每個(gè)位圖文件讀出Ibit數(shù)據(jù),總共讀出來16個(gè)Ibit的數(shù)據(jù), 假設(shè)是1111001110010000,選擇里面最左面的0(從左數(shù)第5個(gè)數(shù)字)作為分配的單元緩 沖塊,單元緩沖塊的地址索引就是5,緩沖區(qū)分配模塊通知報(bào)文處理模塊分配了一個(gè)單元 緩沖塊,單元緩沖塊的地址索引為5,報(bào)文處理模塊就在流記錄上記錄了 5這個(gè)數(shù)。需要 真正寫內(nèi)存時(shí),根據(jù)該地址索引按照如下方式計(jì)算得到物理地址W101,H5(l. 1. 1.1:1, 2. 2. 2. 2:2)],物理地址的高4位是0101,表示這是從5號(hào)區(qū)域分配的一個(gè)單元緩沖塊,物理 地址的低幾位由H5這個(gè)hash函數(shù)計(jì)算四元組得出來的。步驟400.緩沖區(qū)數(shù)據(jù)管理模塊獲得更新后的TCP流記錄,并從報(bào)文負(fù)載數(shù)據(jù)FIFO 中讀取所述負(fù)載數(shù)據(jù),根據(jù)更新后的TCP流記錄中指定的位置將所述負(fù)載數(shù)據(jù)寫入負(fù)載數(shù) 據(jù)緩沖區(qū),完成重組和/或拼包,并將經(jīng)過重組和/或拼包的TCP流數(shù)據(jù)上傳給主機(jī)。所述緩沖區(qū)數(shù)據(jù)管理模塊負(fù)責(zé)負(fù)載數(shù)據(jù)的重組和拼接。圖5是本發(fā)明中緩沖區(qū)數(shù)據(jù)管理模塊完成重組和/或拼包的步驟流程圖,如圖5 所示,所述步驟400,包括下列步驟步驟410.緩沖區(qū)數(shù)據(jù)管理模塊根據(jù)報(bào)文處理模塊的結(jié)果,從FIFO中讀出報(bào)文負(fù) 載數(shù)據(jù)寫入負(fù)載數(shù)據(jù)緩沖區(qū);寫入的實(shí)際單元緩沖塊地址是根據(jù)TCP流記錄中的地址索引字段計(jì)算得到的單 元緩沖塊的物理地址。步驟420.判斷是否存在一條TCP流在緩沖區(qū)中存儲(chǔ)的順序數(shù)據(jù)長度超過一個(gè)預(yù) 設(shè)值(如32KB),若是,則執(zhí)行步驟430 ;否則,執(zhí)行步驟440 ;步驟430.緩沖區(qū)數(shù)據(jù)管理模塊將拼好的順序數(shù)據(jù)取出,根據(jù)當(dāng)前處理報(bào)文的包 頭信息為這一段數(shù)據(jù)添加一個(gè)偽造包頭,生成一個(gè)拼好的大包上傳給主機(jī);步驟440.判斷是否存在一條TCP流在緩沖區(qū)中存儲(chǔ)的亂序數(shù)據(jù)長度超過一個(gè)預(yù) 設(shè)值(如32KB),或是亂序數(shù)據(jù)超出了負(fù)載數(shù)據(jù)緩沖區(qū)的范圍,若是,則執(zhí)行步驟450 ;否則, 返回步驟410 ; 較佳地,本發(fā)明是基于硬件實(shí)現(xiàn),限制了分配給每一條TCP流的最大緩沖區(qū)空間, 當(dāng)緩存數(shù)據(jù)超出負(fù)載數(shù)據(jù)緩沖區(qū)的范圍后,給主機(jī)上傳負(fù)載數(shù)據(jù)緩沖區(qū)的所有數(shù)據(jù),并釋放這條TCP流分配到的所有單元緩沖塊,然后將這條TCP流視作未發(fā)生亂序的流繼續(xù)處理,以此防止嫌疑威脅流利用亂序TCP流耗盡系統(tǒng)的內(nèi)存。步驟450.緩沖區(qū)數(shù)據(jù)管理模塊根據(jù)流記錄中的緩存數(shù)據(jù)段描述符取出緩沖區(qū)中 存儲(chǔ)的亂序數(shù)據(jù),生成拼好的大包上傳給主機(jī)。主機(jī)可以根據(jù)這個(gè)亂序數(shù)據(jù)的包頭信息知道中間遺漏的數(shù)據(jù)的長度和遺漏數(shù)據(jù) 的期待序列號(hào),這樣當(dāng)遺漏的數(shù)據(jù)從網(wǎng)卡傳過來時(shí)就可以在主機(jī)端進(jìn)行重組的操作。相應(yīng)于本發(fā)明的一種TCP流重組拼包方法,還提供一種TCP流重組拼包裝置,圖6 是本發(fā)明一種TCP流重組拼包裝置的結(jié)構(gòu)流程圖,如圖6所示,所述裝置包括報(bào)文處理模 塊1、緩沖區(qū)數(shù)據(jù)管理模塊2、報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列3、緩沖區(qū)分配模塊4和緩存空間 5,其中所述報(bào)文處理模塊1,用于接收當(dāng)前處理報(bào)文,將所述報(bào)文分成包頭信息和負(fù)載數(shù) 據(jù)兩部分,將所述負(fù)載數(shù)據(jù)寫入報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列3,根據(jù)所述包頭信息以及緩沖 區(qū)分配模塊4返回的單元緩沖塊的地址索引更新TCP流記錄,如果緩存當(dāng)前處理報(bào)文需要 申請(qǐng)新的單元緩沖塊,向緩沖區(qū)分配模塊發(fā)送分配緩沖區(qū)請(qǐng)求;所述緩沖區(qū)數(shù)據(jù)管理模塊2,用于根據(jù)所述包頭信息從報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì) 列3中讀取負(fù)載數(shù)據(jù),根據(jù)更新后的TCP流記錄中指定的位置將所述負(fù)載數(shù)據(jù)寫入負(fù)載數(shù) 據(jù)緩沖區(qū)完成重組和/或拼包,并將經(jīng)過重組和/或拼包的TCP流數(shù)據(jù)上傳給主機(jī);所述報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列3,用于緩存報(bào)文的負(fù)載數(shù)據(jù);所述緩沖區(qū)分配模塊4,采用哈希函數(shù)和位圖文件的方式為當(dāng)前處理報(bào)文的負(fù)載 數(shù)據(jù)分配緩存空間5中空閑的單元緩沖塊,返回空閑的單元緩沖塊的地址索引;緩存空間5,用于按照相應(yīng)TCP流的報(bào)文順序緩存亂序報(bào)文的報(bào)文負(fù)載數(shù)據(jù)。其中,所述緩存空間5被劃分成16個(gè)區(qū)域,每個(gè)區(qū)域中包括多個(gè)單元緩沖塊,每個(gè) 區(qū)域用一個(gè)位圖文件記錄該區(qū)域的使用情況,每一比特記錄所述區(qū)域中的一個(gè)單元緩沖塊 是否已經(jīng)分配;每一條TCP流在一個(gè)區(qū)域中只允許分配到一個(gè)指定位置上的單元緩沖塊。所述單元緩沖塊的物理地址是由單元緩沖塊地址索引字段Index和報(bào)文的四元 組Tuples配合運(yùn)算得到的,具體的過程為預(yù)先設(shè)定好16個(gè)hash函數(shù)H(HW],H[l]…… H[15]),每個(gè)hash函數(shù)對(duì)應(yīng)負(fù)載數(shù)據(jù)緩沖區(qū)的一個(gè)區(qū)域,IndeX[i]代表了負(fù)載數(shù)據(jù)緩沖區(qū) 中的第i個(gè)單元緩沖塊屬于16個(gè)區(qū)域中的哪一個(gè),H[IndeX[i]]代表了負(fù)載數(shù)據(jù)緩沖區(qū)中 的第i個(gè)單元緩沖塊是根據(jù)哪個(gè)hash函數(shù)得到的,則{IndeX[i],H[Index[i]] (Tuples)} 就是負(fù)載數(shù)據(jù)緩沖區(qū)中第i個(gè)單元緩沖塊的物理地址基址。所述報(bào)文處理模塊1,包括判斷模塊11和TCP流記錄修改模塊12,其中所述判斷模塊11,包括序列號(hào)判斷子模塊111,用于比較當(dāng)前處理報(bào)文的序列號(hào)與當(dāng)前所述TCP流記錄 中的期待序列號(hào)的關(guān)系;若等于,則觸發(fā)亂數(shù)判斷子模塊;若大于,則觸發(fā)所述TCP流記錄 修改模塊;若當(dāng)所述負(fù)載數(shù)據(jù)的序列號(hào)均小于當(dāng)前所述TCP流記錄中的期待序列號(hào)時(shí),則 將當(dāng)前待處理報(bào)文被視為老數(shù)據(jù)包,不修改所述TCP流記錄;否則,觸發(fā)所述TCP流記錄修 改模塊12 ;亂數(shù)判斷子模塊112,用于判斷負(fù)載數(shù)據(jù)緩沖區(qū)中是否存在亂序數(shù)據(jù),若是,則觸 發(fā)相鄰判斷子模塊113 ;否則,觸發(fā)所述TCP流記錄修改模塊12 ;
相鄰判斷子模塊113,用于判斷當(dāng)前處理報(bào)文與所述亂序數(shù)據(jù)是否相鄰,若是,則 觸發(fā)所述TCP流記錄修改模塊12 ;否則,觸發(fā)所述TCP流記錄修改模塊12 ;所述TCP流記錄修改模塊12,用于根據(jù)所述判斷模塊的判斷結(jié)果修改所述TCP流 記錄,更新緩存數(shù)據(jù)段描述符。所述緩沖區(qū)分配模塊4,包括接收模塊41,用于接收當(dāng)前處理報(bào)文的四元組; 計(jì)算模塊42,用于使用與所述數(shù)據(jù)緩沖區(qū)5中多個(gè)區(qū)域?qū)?yīng)的多個(gè)哈希函數(shù)對(duì)接 收到的四元組進(jìn)行計(jì)算,得到多個(gè)哈希運(yùn)算結(jié)果;訪問模塊43,用于以所述哈希運(yùn)算結(jié)果為索引訪問所述哈希運(yùn)算結(jié)果對(duì)應(yīng)的位圖 文件,讀到多個(gè)1比特的數(shù)據(jù);0判斷模塊44,用于判斷讀到的多個(gè)1比特的數(shù)據(jù)中是否有“0”,若是,則表示對(duì)應(yīng) 所述區(qū)域中這個(gè)哈希運(yùn)算結(jié)果索引的位置上的單元緩沖區(qū)塊空閑,觸發(fā)分配模塊46;否則 觸發(fā)上傳模塊45;上傳模塊45,不緩存當(dāng)前處理報(bào)文,通知緩沖區(qū)數(shù)據(jù)管理模塊2將這條TCP流的負(fù) 載數(shù)據(jù)緩沖區(qū)緩存的所有數(shù)據(jù)和當(dāng)前處理報(bào)文一并傳給主機(jī);分配模塊46,用于從讀到的多個(gè)1比特的數(shù)據(jù)中任意選擇一個(gè)“0”,將“0”在多個(gè) 1比特的數(shù)據(jù)中的位置作為分配的單元緩沖塊的地址索引,返還給報(bào)文處理模塊1,并修改 所述位圖文件。所述緩沖區(qū)數(shù)據(jù)管理模塊2,包括負(fù)載數(shù)據(jù)讀取模塊21,用于從所述報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列3中讀出報(bào)文負(fù)載 數(shù)據(jù)寫入所述負(fù)載數(shù)據(jù)緩沖區(qū);閾值判斷模塊22,用于判斷是否存在一條TCP流在負(fù)載數(shù)據(jù)緩沖區(qū)中存儲(chǔ)的順 序數(shù)據(jù)長度超過一個(gè)預(yù)設(shè)值,若是,則觸發(fā)順序拼包模塊23 ;否則,觸發(fā)亂數(shù)閾值判斷模塊 24;順序拼包模塊23,用于將拼好的順序數(shù)據(jù)取出,根據(jù)當(dāng)前處理報(bào)文的包頭信息為 這一段數(shù)據(jù)添加一個(gè)偽造包頭,生成一個(gè)拼好的大包上傳給主機(jī);亂數(shù)閾值判斷模塊24,用于判斷是否存在一條TCP流在負(fù)載數(shù)據(jù)緩沖區(qū)中存儲(chǔ)的 亂序數(shù)據(jù)長度超過一個(gè)預(yù)設(shè)值,或是亂序數(shù)據(jù)超出了負(fù)載數(shù)據(jù)緩沖區(qū)的范圍,若是,則觸發(fā) 亂序拼包模塊25 ;否則,觸發(fā)負(fù)載數(shù)據(jù)讀取模塊21 ;亂序拼包模塊25,根據(jù)流記錄中的緩存數(shù)據(jù)段描述符取出緩沖區(qū)中存儲(chǔ)的亂序數(shù) 據(jù),生成拼好的大包上傳給主機(jī)。本發(fā)明的有益效果是1.對(duì)于大多數(shù)報(bào)文的重組和拼包可以通過硬件實(shí)現(xiàn),減少了主機(jī)端與網(wǎng)卡的中斷 開銷和主機(jī)端TCP流重組拼包的開銷;2.采用hash運(yùn)算和位圖文件分配空閑緩沖塊的方式可以減少流記錄中存儲(chǔ)緩沖 區(qū)地址所需的空間,也適合硬件并發(fā)處理完成分配操作;3.本發(fā)明是基于硬件實(shí)現(xiàn),限制了分配給每一條TCP流的最大緩沖區(qū)空間,以此 防止嫌疑威脅流利用亂序TCP流耗盡系統(tǒng)的內(nèi)存。通過結(jié)合附圖對(duì)本發(fā)明具體實(shí)施例的描述,本發(fā)明的其它方面及特征對(duì)本領(lǐng)域的技術(shù)人員而言是顯而易見的。 以上對(duì)本發(fā)明的具體實(shí)施例進(jìn)行了描述和說明,這些實(shí)施例應(yīng)被認(rèn)為其只是示例性的,并不用于對(duì)本發(fā)明進(jìn)行限制,本發(fā)明應(yīng)根據(jù)所附的權(quán)利要求進(jìn)行解釋。
權(quán)利要求
一種TCP流重組拼包方法,其特征在于,所述方法,包括下列步驟步驟100.報(bào)文處理模塊接收當(dāng)前處理報(bào)文,然后從TCP流記錄表中找到該報(bào)文相關(guān)TCP流記錄,將所述報(bào)文分成包頭信息和負(fù)載數(shù)據(jù)兩部分,并將所述負(fù)載數(shù)據(jù)寫入報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列;步驟200.報(bào)文處理模塊根據(jù)所述包頭信息更新所述TCP流記錄,并根據(jù)更新后的TCP流記錄判斷緩存當(dāng)前處理報(bào)文是否需要申請(qǐng)新的單元緩沖塊,若是,則執(zhí)行步驟300;否則,執(zhí)行步驟400;步驟300.報(bào)文處理模塊向緩沖區(qū)分配模塊發(fā)送分配緩沖區(qū)請(qǐng)求,同時(shí)傳遞給緩沖區(qū)分配模塊所述當(dāng)前處理報(bào)文的四元組,緩沖區(qū)分配模塊采用哈希函數(shù)和位圖文件的方式為當(dāng)前處理報(bào)文的負(fù)載數(shù)據(jù)分配負(fù)載數(shù)據(jù)緩沖區(qū)中空閑的單元緩沖塊,返回空閑的單元緩沖塊的地址索引;報(bào)文處理模塊根據(jù)所述單元緩沖塊的地址索引,更新所述TCP流記錄得到新的TCP流記錄;步驟400.緩沖區(qū)數(shù)據(jù)管理模塊獲得所述新的TCP流記錄,并從報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列中讀取所述負(fù)載數(shù)據(jù),根據(jù)所述新的TCP流記錄中指定的位置將所述負(fù)載數(shù)據(jù)寫入負(fù)載數(shù)據(jù)緩沖區(qū),完成重組和/或拼包,并將經(jīng)過重組和/或拼包的TCP流數(shù)據(jù)上傳給主機(jī)。
2.根據(jù)權(quán)利要求1所述的TCP流重組拼包方法,其特征在于,所述TCP流記錄,記錄了 對(duì)一條TCP流進(jìn)行重組拼包所需的信息,包括客戶端IP、服務(wù)器端IP、客戶端端口、服務(wù)器 端端口、TCP流狀態(tài),并為客戶端至服務(wù)器端和服務(wù)器端至客戶端兩個(gè)方向各設(shè)置一個(gè)報(bào)文 緩沖區(qū)管理字段,其中,每一個(gè)方向的報(bào)文緩沖區(qū)管理字段可分成以下幾個(gè)部分期待序列 號(hào),單元緩沖塊有效位字段,單元緩沖塊地址索引字段,期待序列號(hào)偏移字段,緩存數(shù)據(jù)段 描述符,其中單元緩沖塊有效位字段和單元緩沖塊地址索引字段分別描述分配給這條TCP流負(fù)載 數(shù)據(jù)緩沖區(qū)的各個(gè)單元緩沖塊的狀態(tài)信息;期待序列號(hào)偏移字段,記錄這條TCP連接在一個(gè)方向上期待的下一個(gè)順序報(bào)文要存儲(chǔ) 在負(fù)載數(shù)據(jù)緩沖區(qū)中的偏移;若干個(gè)緩存數(shù)據(jù)段描述符,每個(gè)緩存數(shù)據(jù)段描述符用于描述一段存放在負(fù)載數(shù)據(jù)緩沖 區(qū)中的連續(xù)報(bào)文負(fù)載數(shù)據(jù),由兩個(gè)指針組成,兩個(gè)指針分別指向該段負(fù)載數(shù)據(jù)在負(fù)載數(shù)據(jù) 緩沖區(qū)的起始地址和結(jié)尾地址。
3.根據(jù)權(quán)利要求1所述的TCP流重組拼包方法,其特征在于,所述緩沖區(qū)分配模塊將 緩存空間劃分成η個(gè)區(qū)域,每個(gè)區(qū)域中包括多個(gè)單元緩沖塊,每個(gè)區(qū)域用一個(gè)位圖文件記 錄該區(qū)域的使用情況,每一比特記錄所述區(qū)域中的一個(gè)單元緩沖塊是否已經(jīng)分配;每一條 TCP流在一個(gè)方向上的負(fù)載數(shù)據(jù)緩沖區(qū)由η個(gè)單元緩沖塊構(gòu)成,且一條TCP流在每個(gè)區(qū)域中 只允許分配到一個(gè)單元緩沖塊。
4.根據(jù)權(quán)利要求3所述的TCP流重組拼包方法,其特征在于,所述單元緩沖塊的物理地 址是由單元緩沖塊地址索引字段Index和報(bào)文的四元組Tuples配合運(yùn)算得到的,具體的過 程為預(yù)先設(shè)定好η個(gè)hash函數(shù)H(HW],H[l]……H[n_l]),每個(gè)hash函數(shù)對(duì)應(yīng)緩存空間 的一個(gè)區(qū)域,Index[i]代表了負(fù)載數(shù)據(jù)緩沖區(qū)中的第i個(gè)單元緩沖塊屬于η個(gè)區(qū)域中的哪 一個(gè),H[IndeX[i]]代表了負(fù)載數(shù)據(jù)緩沖區(qū)中的第i個(gè)單元緩沖塊是根據(jù)哪個(gè)hash函數(shù)得 到的,則{Index[i],H[Index[i]] (Tuples)}就是負(fù)載數(shù)據(jù)緩沖區(qū)中第i個(gè)單元緩沖塊的物理地址基址。
5.根據(jù)權(quán)利要求2所述的TCP流重組拼包方法,其特征在于,所述步驟200,包括下列 步驟步驟210.判斷當(dāng)前處理報(bào)文的序列號(hào)是否等于當(dāng)前所述TCP流記錄中的期待序列號(hào); 若是,則執(zhí)行步驟220 ;否則,執(zhí)行步驟240 ;步驟220.判斷負(fù)載數(shù)據(jù)緩沖區(qū)中是否存在亂序數(shù)據(jù),若是,則執(zhí)行步驟230 ;否則,所 述期待序列號(hào)=當(dāng)前期待序列號(hào)+報(bào)文長度;期待序列號(hào)偏移=當(dāng)前期待序列號(hào)偏移+報(bào) 文長度,執(zhí)行步驟240;步驟230.判斷當(dāng)前處理報(bào)文與所述亂序數(shù)據(jù)是否相鄰,若是,則所述期待序列號(hào)=當(dāng) 前期待序列號(hào)+報(bào)文長度+拼好的亂序數(shù)據(jù)長度;期待序列號(hào)偏移=當(dāng)前期待序列號(hào)偏移 +報(bào)文長度+拼好的亂序數(shù)據(jù)長度,并更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;否則,所述期 待序列號(hào)=當(dāng)前期待序列號(hào)+報(bào)文長度;期待序列號(hào)偏移=當(dāng)前期待序列號(hào)偏移+報(bào)文長 度,更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;步驟240.判斷當(dāng)前處理報(bào)文的序列號(hào)是否小于當(dāng)前TCP流記錄中的期待序列號(hào),若 是,則執(zhí)行步驟250 ;否則按照當(dāng)前報(bào)文的負(fù)載數(shù)據(jù)在其所屬TCP流的負(fù)載數(shù)據(jù)緩沖區(qū)的存 放位置更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;步驟250.判斷所述負(fù)載數(shù)據(jù)的序列號(hào)是否均小于當(dāng)前所述TCP流記錄中的期待序列 號(hào),若是,則當(dāng)前待處理報(bào)文被視為老數(shù)據(jù)包,不修改所述TCP流記錄;否則,所述期待序列 號(hào)=當(dāng)前期待序列號(hào)+當(dāng)前待處理報(bào)文中新數(shù)據(jù)的長度;期待序列號(hào)偏移=期待序列號(hào)偏 移+當(dāng)前待處理報(bào)文中新數(shù)據(jù)的長度,更新緩存數(shù)據(jù)段描述符,執(zhí)行步驟260 ;步驟260.判斷更新后的緩存數(shù)據(jù)段描述符是否要求分配新的單元緩沖塊,若是,表示 需要申請(qǐng)新的單元緩沖塊;否則,表示不需要申請(qǐng)新的單元緩沖塊。
6.根據(jù)權(quán)利要求4所述的TCP流重組拼包方法,其特征在于,所述步驟300,包括下列 步驟步驟310.緩沖區(qū)分配模塊接收當(dāng)前處理報(bào)文的四元組,同時(shí)使用預(yù)設(shè)的所有哈希函 數(shù)對(duì)所述四元組進(jìn)行計(jì)算,得到多個(gè)哈希運(yùn)算結(jié)果;步驟320.緩沖區(qū)分配模塊以所述哈希運(yùn)算結(jié)果為索引訪問所述哈希運(yùn)算結(jié)果對(duì)應(yīng)的 位圖文件,讀到多個(gè)1比特的數(shù)據(jù);步驟330.判斷讀到的多個(gè)1比特的數(shù)據(jù)中是否有“0”,若是,則表示對(duì)應(yīng)所述區(qū)域中這 個(gè)哈希運(yùn)算結(jié)果索引的位置上的單元緩沖區(qū)塊空閑;否則執(zhí)行步驟350 ;步驟340.從多個(gè)1比特的數(shù)據(jù)中任意選擇一個(gè)“0”,將“0”在多個(gè)1比特的數(shù)據(jù)中的 位置作為分配的單元緩沖塊的地址索引,返還給報(bào)文處理模塊,并修改所述位圖文件;步驟350.不緩存當(dāng)前處理報(bào)文,通知緩沖區(qū)數(shù)據(jù)管理模塊將這條TCP流的緩存的所有 數(shù)據(jù)和當(dāng)前處理報(bào)文一并傳給主機(jī)。
7.根據(jù)權(quán)利要求6所述的TCP流重組拼包方法,其特征在于,所述步驟400,包括下列 步驟步驟410.緩沖區(qū)數(shù)據(jù)管理模塊根據(jù)報(bào)文處理模塊的結(jié)果,從所述先入先出隊(duì)列中讀 出報(bào)文負(fù)載數(shù)據(jù)寫入負(fù)載數(shù)據(jù)緩沖區(qū);步驟420.判斷是否存在一條TCP流在緩沖區(qū)中存儲(chǔ)的順序數(shù)據(jù)長度超過一個(gè)預(yù)設(shè)值,若是,則執(zhí)行步驟430 ;否則,執(zhí)行步驟440 ;步驟430.緩沖區(qū)數(shù)據(jù)管理模塊將拼好的順序數(shù)據(jù)取出,根據(jù)當(dāng)前處理報(bào)文的包頭信 息為這一段數(shù)據(jù)添加一個(gè)偽造包頭,生成一個(gè)拼好的大包上傳給主機(jī);步驟440.判斷是否存在一條TCP流在緩沖區(qū)中存儲(chǔ)的亂序數(shù)據(jù)長度超過一個(gè)預(yù)設(shè)值, 或是亂序數(shù)據(jù)超出了負(fù)載數(shù)據(jù)緩沖區(qū)的范圍,若是,則執(zhí)行步驟450 ;否則,返回步驟410 ; 步驟450.緩沖區(qū)數(shù)據(jù)管理模塊根據(jù)流記錄中的緩存數(shù)據(jù)段描述符取出緩沖區(qū)中存儲(chǔ) 的亂序數(shù)據(jù),生成拼好的大包上傳給主機(jī)。
8.一種TCP流重組拼包裝置,其特征在于,所述裝置,包括報(bào)文處理模塊,用于接收當(dāng)前處理報(bào)文,將所述報(bào)文分成包頭信息和負(fù)載數(shù)據(jù)兩部分, 將所述負(fù)載數(shù)據(jù)寫入報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列,根據(jù)所述包頭信息以及緩沖分配模塊的 地址索引更新TCP流記錄;如果緩存當(dāng)前處理報(bào)文需要申請(qǐng)新的單元緩沖塊,向緩沖區(qū)分 配模塊發(fā)送分配緩沖區(qū)請(qǐng)求;緩沖區(qū)數(shù)據(jù)管理模塊,用于根據(jù)所述包頭信息從報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列中讀取負(fù) 載數(shù)據(jù),根據(jù)更新后的TCP流記錄中指定的位置將所述負(fù)載數(shù)據(jù)寫入負(fù)載數(shù)據(jù)緩沖區(qū),完 成重組和/或拼包,并將經(jīng)過重組和/或拼包的TCP流數(shù)據(jù)上傳給主機(jī); 報(bào)文負(fù)載數(shù)據(jù)FIFO,用于緩存報(bào)文的負(fù)載數(shù)據(jù);緩沖區(qū)分配模塊,采用哈希函數(shù)和位圖文件的方式為當(dāng)前處理報(bào)文的負(fù)載數(shù)據(jù)分配負(fù) 載數(shù)據(jù)緩沖區(qū)中空閑的單元緩沖塊,返回空閑的單元緩沖塊的地址索引;緩存空間,用于按照相應(yīng)TCP流的報(bào)文順序緩存亂序報(bào)文的報(bào)文負(fù)載數(shù)據(jù)。
9.根據(jù)權(quán)利要求8所述的TCP流重組拼包方法,其特征在于,所述TCP流記錄,記錄了 對(duì)一條TCP流進(jìn)行重組拼包所需的信息,包括客戶端IP、服務(wù)器端IP、客戶端端口、服務(wù)器 端端口、TCP流狀態(tài),并為客戶端至服務(wù)器端和服務(wù)器端至客戶端兩個(gè)方向各設(shè)置一個(gè)報(bào)文 緩沖區(qū)管理字段,其中,每一個(gè)方向的報(bào)文緩沖區(qū)管理字段可分成以下幾個(gè)部分期待序列 號(hào),單元緩沖塊有效位字段,單元緩沖塊地址索引字段,期待序列號(hào)偏移字段,緩存數(shù)據(jù)段 描述符,其中單元緩沖塊有效位字段和單元緩沖塊地址索引字段分別描述分配給這條TCP流的負(fù) 載數(shù)據(jù)緩沖區(qū)的各個(gè)單元緩沖塊的狀態(tài)信息;期待序列號(hào)偏移字段,記錄這條TCP連接在一個(gè)方向上期待的下一個(gè)順序報(bào)文要存儲(chǔ) 在負(fù)載數(shù)據(jù)緩沖區(qū)中的偏移;若干個(gè)緩存數(shù)據(jù)段描述符,每個(gè)緩存數(shù)據(jù)段描述符用于描述一段存放在負(fù)載數(shù)據(jù)緩沖 區(qū)中的連續(xù)報(bào)文負(fù)載數(shù)據(jù),由兩個(gè)指針組成,兩個(gè)指針分別指向該段負(fù)載數(shù)據(jù)在負(fù)載數(shù)據(jù) 緩沖區(qū)的起始地址和結(jié)尾地址。
10.根據(jù)權(quán)利要求8所述的TCP流重組拼包方法,其特征在于,所述緩存空間被劃分成 η個(gè)區(qū)域,每個(gè)區(qū)域中包括多個(gè)單元緩沖塊,每個(gè)區(qū)域用一個(gè)位圖文件記錄該區(qū)域的使用情 況,每一比特記錄所述區(qū)域中的一個(gè)單元緩沖塊是否已經(jīng)分配;每一條TCP流在一個(gè)方向 上的負(fù)載數(shù)據(jù)緩沖區(qū)由η個(gè)單元緩沖塊構(gòu)成,且一條TCP流在每個(gè)區(qū)域中只允許分配到一 個(gè)單元緩沖塊。
11.根據(jù)權(quán)利要求10所述的TCP流重組拼包方法,其特征在于,所述單元緩沖塊的物理 地址是由單元緩沖塊地址索引字段Index和報(bào)文的四元組Tuples配合運(yùn)算得到的,具體的過程為預(yù)先設(shè)定好η個(gè)hash函數(shù)Η(Η
,H[l]……H[n_l]),每個(gè)hash函數(shù)對(duì)應(yīng)緩存空 間的一個(gè)區(qū)域,IndeX[i]代表了負(fù)載數(shù)據(jù)緩沖區(qū)中的第i個(gè)單元緩沖塊屬于η個(gè)區(qū)域中的 哪一個(gè),H[IndeX[i]]代表了負(fù)載數(shù)據(jù)緩沖區(qū)中的第i個(gè)單元緩沖塊是根據(jù)哪個(gè)hash函數(shù) 得到的,則{Index[i],H[Index[i]] (Tuples)}就是負(fù)載數(shù)據(jù)緩沖區(qū)中第i個(gè)單元緩沖塊的 物理地址基址。
12.根據(jù)權(quán)利要求8所述的TCP流重組拼包系統(tǒng),其特征在于,所述報(bào)文處理模塊,包 括判斷模塊和TCP流記錄修改模塊,其中所述判斷模塊,包括序列號(hào)判斷子模塊,用于比較當(dāng)前處理報(bào)文的序列號(hào)與當(dāng)前所述TCP流記錄中的期待 序列號(hào)的關(guān)系;若等于,則觸發(fā)亂數(shù)判斷子模塊;若大于,則觸發(fā)所述TCP流記錄修改模塊; 若當(dāng)所述負(fù)載數(shù)據(jù)的序列號(hào)均小于當(dāng)前所述TCP流記錄中的期待序列號(hào)時(shí),則將當(dāng)前待處 理報(bào)文被視為老數(shù)據(jù)包,不修改所述TCP流記錄直接上傳給主機(jī);否則,觸發(fā)所述TCP流記 錄修改模塊;亂數(shù)判斷子模塊,用于判斷負(fù)載數(shù)據(jù)緩沖區(qū)中是否存在亂序數(shù)據(jù),若是,則觸發(fā)相鄰判 斷子模塊;否則,觸發(fā)所述TCP流記錄修改模塊;相鄰判斷子模塊,用于判斷當(dāng)前處理報(bào)文與所述亂序數(shù)據(jù)是否相鄰,若是,則觸發(fā)所述 TCP流記錄修改模塊;否則,觸發(fā)所述TCP流記錄修改模塊;所述TCP流記錄修改模塊,用于根據(jù)所述判斷模塊的判斷結(jié)果修改所述TCP流記錄,更 新緩存數(shù)據(jù)段描述符。
13.根據(jù)權(quán)利要求8所述的TCP流重組拼包系統(tǒng),其特征在于,所述緩沖區(qū)分配模塊,包括接收模塊,用于接收當(dāng)前處理報(bào)文的四元組;計(jì)算模塊,用于使用與所述數(shù)據(jù)緩沖區(qū)中多個(gè)區(qū)域?qū)?yīng)的多個(gè)哈希函數(shù)對(duì)接收到的四 元組進(jìn)行計(jì)算,得到多個(gè)哈希運(yùn)算結(jié)果;訪問模塊,用于以所述哈希運(yùn)算結(jié)果為索引訪問所述哈希運(yùn)算結(jié)果對(duì)應(yīng)的位圖文件, 讀到多個(gè)1比特的數(shù)據(jù);O判斷模塊,用于判斷讀到的多個(gè)1比特的數(shù)據(jù)中是否有“0”,若是,則表示對(duì)應(yīng)所述區(qū) 域中這個(gè)哈希運(yùn)算結(jié)果索引的位置上的單元緩沖區(qū)塊空閑,觸發(fā)分配模塊;否則觸發(fā)上傳 模塊;上傳模塊,不緩存當(dāng)前處理報(bào)文,通知緩沖區(qū)數(shù)據(jù)管理模塊將這條TCP流的負(fù)載數(shù)據(jù) 緩沖區(qū)緩存的所有數(shù)據(jù)和當(dāng)前處理報(bào)文一并傳給主機(jī);分配模塊,用于從讀到的多個(gè)1比特的數(shù)據(jù)中任意選擇一個(gè)“0”,將“0”在多個(gè)1比特 的數(shù)據(jù)中的位置作為分配的單元緩沖塊的地址索引,返還給報(bào)文處理模塊,并修改所述位 圖文件。
14.根據(jù)權(quán)利要求8所述的TCP流重組拼包系統(tǒng),其特征在于,所述緩沖區(qū)數(shù)據(jù)管理模 塊,包括負(fù)載數(shù)據(jù)讀取模塊,用于從所述先入先出隊(duì)列中讀出報(bào)文負(fù)載數(shù)據(jù)寫入所述負(fù)載數(shù)據(jù) 緩沖區(qū);閾值判斷模塊,用于判斷是否存在一條TCP流在負(fù)載數(shù)據(jù)緩沖區(qū)中存儲(chǔ)的順序數(shù)據(jù)長度超過一個(gè)預(yù)設(shè)值,若是,則觸發(fā)順序拼包模塊;否則,觸發(fā)亂數(shù)閾值判斷模塊;順序拼包模塊,用于將拼好的順序數(shù)據(jù)取出,根據(jù)當(dāng)前處理報(bào)文的包頭信息為這一段 數(shù)據(jù)添加一個(gè)偽造包頭,生成一個(gè)拼好的大包上傳給主機(jī);亂數(shù)閾值判斷模塊,用于判斷是否存在一條TCP流在緩沖區(qū)中存儲(chǔ)的亂序數(shù)據(jù)長度超過一個(gè)預(yù)設(shè)值,或是亂序數(shù)據(jù)超出了負(fù)載數(shù)據(jù)緩沖區(qū)的范圍,若是,則觸發(fā)亂序拼包模塊; 否則,觸發(fā)負(fù)載數(shù)據(jù)讀取模塊;亂序拼包模塊,根據(jù)流記錄中的緩存數(shù)據(jù)段描述符取出緩沖區(qū)中存儲(chǔ)的亂序數(shù)據(jù),生成拼好的大包上傳給主機(jī)。
全文摘要
本發(fā)明公開了一種TCP流重組拼包方法和裝置。所述方法包括接收當(dāng)前處理報(bào)文和記錄當(dāng)前處理報(bào)文信息的TCP流記錄,將報(bào)文分成包頭信息和負(fù)載數(shù)據(jù)并將負(fù)載數(shù)據(jù)寫入報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列;判斷緩存當(dāng)前處理報(bào)文是否需要申請(qǐng)新的緩沖區(qū),若是,則發(fā)送分配緩沖區(qū)請(qǐng)求,采用哈希函數(shù)和位圖文件的方式為當(dāng)前處理報(bào)文的負(fù)載數(shù)據(jù)分配緩存空間中空閑的單元緩沖塊,返回空閑的單元緩沖塊的地址索引,更新TCP流記錄;否則,從報(bào)文負(fù)載數(shù)據(jù)先入先出隊(duì)列中讀取負(fù)載數(shù)據(jù),根據(jù)新的TCP流記錄中指定的位置將負(fù)載數(shù)據(jù)寫入負(fù)載數(shù)據(jù)緩沖區(qū),完成重組和/或拼包。
文檔編號(hào)H04L12/56GK101841545SQ20101017595
公開日2010年9月22日 申請(qǐng)日期2010年5月14日 優(yōu)先權(quán)日2010年5月14日
發(fā)明者楊衛(wèi)兵, 趙曉芳, 阮元, 陳明宇 申請(qǐng)人:中國科學(xué)院計(jì)算技術(shù)研究所