專(zhuān)利名稱(chēng):一種在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí)實(shí)現(xiàn)減少內(nèi)存占用空間的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí)實(shí)現(xiàn)減少內(nèi)存占用空間的方法,特別是在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí),通過(guò)鏈表隊(duì)列的改進(jìn)實(shí)現(xiàn)減少內(nèi)存占用空間的方法。本發(fā)明適用于計(jì)算機(jī)軟件技術(shù)領(lǐng)域,尤其是網(wǎng)絡(luò)通信領(lǐng)域。
背景技術(shù):
隨著寬帶的發(fā)展,多媒體業(yè)務(wù)諸如流媒體,視頻會(huì)議和視頻點(diǎn)播等,正在成為信息傳送的重要組成部分。多媒體的相關(guān)服務(wù)需求的日益增長(zhǎng)刺激了IP組播技術(shù)的普及和發(fā)展,成為新一代網(wǎng)絡(luò)的不可缺少的關(guān)鍵技術(shù)。
從技術(shù)角度看,組播技術(shù)可以分為控制層面和數(shù)據(jù)層面。控制層面是指支持組播技術(shù)的各種協(xié)議,如IGMP,PIM-DM,PIM-SM,DVMRP等,由這些協(xié)議完成對(duì)組播組的管理和控制。數(shù)據(jù)層面是指組播數(shù)據(jù)包的轉(zhuǎn)發(fā)。本發(fā)明主要涉及組播數(shù)據(jù)包的轉(zhuǎn)發(fā)。
在以軟件轉(zhuǎn)發(fā)為主的系統(tǒng)中,組播包的轉(zhuǎn)發(fā)是將每個(gè)組播包復(fù)制發(fā)送到相應(yīng)的單板或端口。每次發(fā)送時(shí),內(nèi)存中都拷貝一份數(shù)據(jù)包。這種發(fā)送方法的效率是非常低的。
一個(gè)常見(jiàn)的系統(tǒng)框圖如圖1所示。
在數(shù)據(jù)包發(fā)送時(shí),必然涉及到發(fā)送隊(duì)列的設(shè)置過(guò)程。與本發(fā)明方法所特別相關(guān)的是對(duì)鏈表隊(duì)列進(jìn)行的改進(jìn)。
為了更好的描述組播包的發(fā)送,需要先介紹一下使用鏈表發(fā)送單播包的過(guò)程。
在使用鏈表發(fā)送單播包時(shí),由鏈表組成的各個(gè)發(fā)送隊(duì)列之間是完全獨(dú)立的,每一個(gè)隊(duì)列使用各自私有的隊(duì)列的描述字Queue Descriptor和隊(duì)列中每個(gè)包的描述字Packet link。
隊(duì)列的描述字包括Queue count,Head pointer,Tail pointer域,含義如下所列Queue count是指當(dāng)前隊(duì)列中的待發(fā)送包的個(gè)數(shù),也即是Packetlink的個(gè)數(shù),稱(chēng)為計(jì)數(shù)器。
Head pointer是指隊(duì)列中第一個(gè)packet link的地址,稱(chēng)為頭指針。
Tail pointer是指對(duì)應(yīng)隊(duì)列中最后一個(gè)packet link的地址,稱(chēng)為尾指針。
隊(duì)列中每個(gè)包的描述字,包括next address,packet info域,含義如下所列next address是指下一個(gè)Packet link的地址。
Packet info是指數(shù)據(jù)包的信息,一般用于描述包的長(zhǎng)度,包的起始地址等信息。
鏈表的組織結(jié)構(gòu)如圖2所示。
在單播轉(zhuǎn)發(fā)中,收到一個(gè)數(shù)據(jù)包,查找到包的出隊(duì)列后,就要把數(shù)據(jù)包加入相應(yīng)的隊(duì)列,我們稱(chēng)為入隊(duì)列。發(fā)送線程則是在隊(duì)列中讀取包的描述信息,按順序發(fā)送,我們稱(chēng)為出隊(duì)列。
入隊(duì)列的處理流程如下第一步程序查找到需要放置的出隊(duì)列的隊(duì)列號(hào);第二步讀出隊(duì)列的隊(duì)列描述字Queue Descriptor;第三步把需要添加的包的描述字Packet link添加到隊(duì)列的最后,即修改隊(duì)尾包描述字packet link中的下一個(gè)包描述字指針next address為需要入隊(duì)的packet link的地址;
第四步修改隊(duì)列的描述字Queue Descriptor以反應(yīng)新的變化,修改隊(duì)列描述字中的尾指針tail pointer為需要入隊(duì)的packet link地址;第五步將隊(duì)列描述字中的計(jì)數(shù)器Queue Count加1。流程結(jié)束。
入隊(duì)列的處理流程如圖3所示。
出隊(duì)列的處理流程如下第一步讀出制定隊(duì)列的隊(duì)列描述字Queue Descriptor;第二步判斷隊(duì)列描述字中的計(jì)數(shù)器Queue Count是否為0,如果為0出隊(duì)列流程直接結(jié)束,如果不為0,將計(jì)數(shù)器Queue Count減1后繼續(xù)執(zhí)行第三步;第三步根據(jù)隊(duì)列描述字中的頭指針head pointer讀取需要出隊(duì)列的包描述字packet link;第四步修改隊(duì)列描述字中的頭指針head pointer為需要出隊(duì)列的包描述字packet link的下一個(gè)包描述字,即需要出隊(duì)列的包描述字paeket link的next address。流程結(jié)束。
出隊(duì)列的處理流程如圖4所示。
上面介紹了單播的入隊(duì)列和出隊(duì)列的流程,對(duì)于以拷貝方式的組播發(fā)送,就是查找到多個(gè)隊(duì)列號(hào),拷貝數(shù)據(jù)包,加入到多個(gè)隊(duì)列。而出隊(duì)列的發(fā)送方式與單播包相同,只是重復(fù)發(fā)送。
這樣使用拷貝方式的組播發(fā)送的入隊(duì)列流程為第一步查找一個(gè)出隊(duì)列號(hào),如果沒(méi)有找到,則結(jié)束發(fā)送流程,如果找到,則進(jìn)入第二步操作;第二步拷貝要發(fā)送的數(shù)據(jù)包;第三步按照單播的方式入隊(duì)列,入隊(duì)列操作完成后返回第一步。
組播包的入隊(duì)列流程如圖5所示。
這種方式的主要問(wèn)題在于由于每一個(gè)隊(duì)列發(fā)送完數(shù)據(jù)包后都將本隊(duì)列中該包的包描述字Packet link出隊(duì)列,并釋放相應(yīng)的存放數(shù)據(jù)包的內(nèi)存空間。所以,多個(gè)隊(duì)列就需要對(duì)數(shù)據(jù)包進(jìn)行多次拷貝,并生成新的數(shù)據(jù)包描述字以添加到各個(gè)隊(duì)列中。這樣就占用了很多不必要的空間,同時(shí)也降低了程序的效率。
發(fā)明內(nèi)容
本發(fā)明的目的是在現(xiàn)有代碼和數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上進(jìn)行改進(jìn),提供一種在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí)實(shí)現(xiàn)減少內(nèi)存占用空間的方法,特別是在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí),通過(guò)鏈表隊(duì)列的改進(jìn)實(shí)現(xiàn)減少內(nèi)存占用空間的方法,解決以拷貝方式實(shí)現(xiàn)的組播發(fā)送方式存在空間浪費(fèi)和效率低下的問(wèn)題。
本發(fā)明是這樣實(shí)現(xiàn)的一種在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí)實(shí)現(xiàn)減少內(nèi)存占用空間的方法,其特征在于在內(nèi)存中只存有一份需要轉(zhuǎn)發(fā)數(shù)據(jù)包的拷貝;在內(nèi)存中只存在一條由包描述字連接而成的鏈表,各個(gè)發(fā)送隊(duì)列的隊(duì)列描述字通過(guò)頭指針連接到該鏈表;在最后一個(gè)和該鏈表相連的隊(duì)列發(fā)送結(jié)束后,將該數(shù)據(jù)包占用的空間歸還給緩存(buffer)。
所述由包描述字連接而成的鏈表是把需要入隊(duì)列的組播包的包描述字加入到所有的隊(duì)列中,并在包描述字中增加每個(gè)隊(duì)列發(fā)送本數(shù)據(jù)包結(jié)束的標(biāo)志位。
所述每個(gè)隊(duì)列發(fā)送結(jié)束后判斷一下所有的標(biāo)志位,如果本次發(fā)送不是最后一次發(fā)送,就置一下本隊(duì)列發(fā)送結(jié)束標(biāo)志,但不歸還數(shù)據(jù)包的緩存,如果本次發(fā)送是最后一次發(fā)送,就歸還數(shù)據(jù)包的緩存。
所述包描述字中增加每個(gè)隊(duì)列發(fā)送本數(shù)據(jù)包結(jié)束的標(biāo)志位,通過(guò)在包描述字的結(jié)構(gòu)中增加發(fā)送數(shù)據(jù)包結(jié)束標(biāo)志位圖(Tx OK Bitmap域)實(shí)現(xiàn),在每個(gè)隊(duì)列發(fā)送結(jié)束后,需要判斷和修改該域。
一種在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí)實(shí)現(xiàn)減少內(nèi)存占用空間的方法,包括組播包入隊(duì)列、組播包出隊(duì)列組播包入隊(duì)列進(jìn)一步包括如下步驟第一步取得下一個(gè)出隊(duì)列的隊(duì)列號(hào);第二步按照單播的方式入隊(duì)列,不拷貝數(shù)據(jù)包和生成新的數(shù)據(jù)包描述字,不需要判斷該數(shù)據(jù)包是否需要在這個(gè)隊(duì)列中發(fā)送;第三步判斷是否是最后一個(gè)出隊(duì)列,如果不是則返回第一步,如果是則結(jié)束入隊(duì)列,組播包出隊(duì)列進(jìn)一步包括如下步驟第一步按照單播的方式出隊(duì)列,修改隊(duì)列中指針的結(jié)構(gòu),修改隊(duì)列描述字中的頭指針,不釋放出隊(duì)列的數(shù)據(jù)包描述字的空間,不歸還數(shù)據(jù)包的空間;第二步判斷這個(gè)包是否需要在本隊(duì)列發(fā)送,如果是則進(jìn)行第三步,如果不是,則進(jìn)行第四步;第三步發(fā)送本數(shù)據(jù)包;第四步讀取該包描述字中的發(fā)送數(shù)據(jù)包結(jié)束標(biāo)志位圖,判斷是不是最后一次發(fā)送,如果不是則在發(fā)送數(shù)據(jù)包結(jié)束標(biāo)志位圖中設(shè)置本隊(duì)列發(fā)送結(jié)束標(biāo)志位,如果是最后一次發(fā)送,則需要?dú)w還數(shù)據(jù)包所占的空間,釋放該包描述字的空間。
使用本發(fā)明后,數(shù)據(jù)包實(shí)現(xiàn)零拷貝發(fā)送,而且各個(gè)隊(duì)列發(fā)送線程的關(guān)聯(lián)性很小,發(fā)送時(shí)不需要相互等待,大大提高了組播發(fā)送的效率。
圖1是基于CPU的組播轉(zhuǎn)發(fā)系統(tǒng)框圖;
圖2是發(fā)送單播包的發(fā)送鏈表隊(duì)列示意圖;圖3是單播發(fā)送鏈表入隊(duì)列流程圖;圖4是單播發(fā)送鏈表出隊(duì)列流程圖;圖5是拷貝方式下組播發(fā)送的入鏈表隊(duì)列流程圖;圖6是改進(jìn)后的組播隊(duì)列數(shù)據(jù)包描述字結(jié)構(gòu)圖;圖7是改進(jìn)后的組播發(fā)送鏈表隊(duì)列示意圖;圖8是改進(jìn)后的多播發(fā)送鏈表入隊(duì)列流程圖;圖9是改進(jìn)后的多播發(fā)送鏈表出隊(duì)列流程圖;圖10是應(yīng)用本發(fā)明方法的一個(gè)具體實(shí)施實(shí)例的系統(tǒng)框圖。
具體實(shí)施例方式
本發(fā)明對(duì)組播入隊(duì)列的方法進(jìn)行改進(jìn),在內(nèi)存中只有一份(或幾份)數(shù)據(jù)包的拷貝,同時(shí)在內(nèi)存中也只存在一條包描述字連接而成的鏈表,各個(gè)發(fā)送隊(duì)列的隊(duì)列描述字通過(guò)頭指針bead pointer連接到這條鏈表。發(fā)送數(shù)據(jù)包時(shí),只有在最后一個(gè)和該鏈表相連的隊(duì)列發(fā)送結(jié)束后,才將該數(shù)據(jù)包占用的空間歸還給緩存(buffer)。這樣會(huì)節(jié)省數(shù)據(jù)包的拷貝時(shí)間,提高組播的轉(zhuǎn)發(fā)效率。
具體說(shuō)來(lái),就是把需要入隊(duì)列的組播包的包描述字packet link加入到所有的隊(duì)列中,而不管最終是否需要發(fā)送,并在包描述字packet link中增加每個(gè)隊(duì)列發(fā)送本數(shù)據(jù)包結(jié)束的標(biāo)志位,每個(gè)隊(duì)列發(fā)送結(jié)束后判斷一下所有的標(biāo)志位,如果本次發(fā)送不是最后一次發(fā)送,就置一下本隊(duì)列發(fā)送結(jié)束標(biāo)志,但不歸還數(shù)據(jù)包的緩存,如果本次發(fā)送是最后一次發(fā)送,就歸還數(shù)據(jù)包的緩存。
對(duì)于圖2的隊(duì)列描述字Queue Descriptor結(jié)構(gòu)基本不做改變,只是改變包描述字packet link的結(jié)構(gòu),其中,下一個(gè)包描述字號(hào)地址nextaddress和包信息packet info域的定義沒(méi)有改變,新增加了發(fā)送數(shù)據(jù)包結(jié)束標(biāo)志位圖tx OK bitmap域,這個(gè)域在入隊(duì)列時(shí)不需要填寫(xiě)。只有在每個(gè)隊(duì)列發(fā)送結(jié)束后,需要判斷和修改這個(gè)域。如圖6所示。
經(jīng)過(guò)修改以后的組播鏈表的組織結(jié)構(gòu)發(fā)生了變化。
由鏈表組成的發(fā)送隊(duì)列不再是完全獨(dú)立的,每一個(gè)隊(duì)列仍然使用各自私有的隊(duì)列的描述字Queue Descriptor,但由每個(gè)包的描述字Packetlink組成的鏈表則是公用的,各個(gè)隊(duì)列的描述字中的計(jì)數(shù)器QueueCount,頭指針Head Pointer,尾指針Tail Pointer字段都是相同的,因?yàn)樗鼈児猛粭l隊(duì)列。
組播的鏈表的組織結(jié)構(gòu)如圖7所示。
具體實(shí)施后,組播包入隊(duì)列和出隊(duì)列流程都需要進(jìn)行具體的改動(dòng)組播包入隊(duì)列流程第一步取得下一個(gè)出隊(duì)列的隊(duì)列號(hào);第二步按照單播的發(fā)放入隊(duì)列,并不需要數(shù)據(jù)包的拷貝和新的數(shù)據(jù)包描述字packet link的生成。這里并不需要判斷這個(gè)包是否需要在這個(gè)隊(duì)列中發(fā)送;第三步判斷是否是最后一個(gè)出隊(duì)列,如果不是則返回第一步,如果是則結(jié)束入隊(duì)列流程。
組播包入隊(duì)列的流程如圖8所示。
組播包出隊(duì)列流程第一步按照單播的方式出隊(duì)列,修改隊(duì)列中指針的結(jié)構(gòu),修改隊(duì)列描述字Queue Descriptor中的Head pointer頭指針,但并不釋放出隊(duì)列的數(shù)據(jù)包描述字packet link的空間,也不歸還數(shù)據(jù)包的空間;第二步判斷這個(gè)包是否需要在本隊(duì)列發(fā)送,如果是則進(jìn)行第三步,如果不是,則進(jìn)行第四步;第三步發(fā)送本數(shù)據(jù)包;
第四步讀取該包描述字packet link中的發(fā)送數(shù)據(jù)包結(jié)束標(biāo)志位圖Tx OK Bitmap,判斷是不是最后一次發(fā)送,如果不是則在發(fā)送數(shù)據(jù)包結(jié)束標(biāo)志位圖Tx OK Bitmap中設(shè)置本隊(duì)列發(fā)送結(jié)束標(biāo)志位。如果是最后一次發(fā)送,則需要?dú)w還數(shù)據(jù)包所占的空間,釋放該包描述字packet link的空間。
第五步流程結(jié)束。
改進(jìn)后的組播包出隊(duì)列的流程如圖9所示。
在本公司某型號(hào)的DSLAM產(chǎn)品中,需要在網(wǎng)絡(luò)處理器上完成組播發(fā)送,主要是從上行以太網(wǎng)端口發(fā)送組播數(shù)據(jù)流到ADSL用戶,由于是微碼轉(zhuǎn)發(fā),需要重復(fù)發(fā)送。在使用本發(fā)明以前,數(shù)據(jù)包需要拷貝發(fā)送,發(fā)送的效率比較低。使用本發(fā)明后,數(shù)據(jù)包實(shí)現(xiàn)零拷貝發(fā)送,而且各個(gè)隊(duì)列發(fā)送線程的關(guān)聯(lián)性很小,發(fā)送時(shí)不需要相互等待,大大提高了組播發(fā)送的效率。
具體實(shí)施的系統(tǒng)框圖如圖10所示。
數(shù)據(jù)包從PHY/MAC芯片或交換芯片接收到網(wǎng)絡(luò)處理器后,由接收引擎把數(shù)據(jù)包保存在緩存中交給協(xié)議處理引擎處理,在進(jìn)行必要的協(xié)議處理,路由查找后,如果是組播包,就按照本發(fā)明把數(shù)據(jù)包加入到所有端口的發(fā)送隊(duì)列,然后由發(fā)送引擎發(fā)送,并由最后一個(gè)發(fā)送結(jié)束的引擎歸還緩存。
權(quán)利要求
1.一種在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí)實(shí)現(xiàn)減少內(nèi)存占用空間的方法,其特征在于在內(nèi)存中只存有一份需要轉(zhuǎn)發(fā)數(shù)據(jù)包的拷貝;在內(nèi)存中只存在一條由包描述字連接而成的鏈表,各個(gè)發(fā)送隊(duì)列的隊(duì)列描述字通過(guò)頭指針連接到該鏈表;在最后一個(gè)和該鏈表相連的隊(duì)列發(fā)送結(jié)束后,將該數(shù)據(jù)包占用的空間歸還給緩存。
2.如權(quán)利要求1所述在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí)實(shí)現(xiàn)減少內(nèi)存占用空間的方法,其特征在于所述由包描述字連接而成的鏈表是把需要入隊(duì)列的組播包的包描述字加入到所有的隊(duì)列中,并在包描述字中增加每個(gè)隊(duì)列發(fā)送本數(shù)據(jù)包結(jié)束的標(biāo)志位。
3.如權(quán)利要求1所述在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí)實(shí)現(xiàn)減少內(nèi)存占用空間的方法,其特征在于所述每個(gè)隊(duì)列發(fā)送結(jié)束后判斷一下所有的標(biāo)志位,如果本次發(fā)送不是最后一次發(fā)送,就置一下本隊(duì)列發(fā)送結(jié)束標(biāo)志,但不歸還數(shù)據(jù)包的緩存,如果本次發(fā)送是最后一次發(fā)送,就歸還數(shù)據(jù)包的緩存。
4.如權(quán)利要求1或2所述在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí)實(shí)現(xiàn)減少內(nèi)存占用空間的方法,其特征在于所述包描述字中增加每個(gè)隊(duì)列發(fā)送本數(shù)據(jù)包結(jié)束的標(biāo)志位,通過(guò)在包描述字的結(jié)構(gòu)中增加發(fā)送數(shù)據(jù)包結(jié)束標(biāo)志位圖實(shí)現(xiàn),在每個(gè)隊(duì)列發(fā)送結(jié)束后,需要判斷和修改該發(fā)送數(shù)據(jù)包結(jié)束標(biāo)志位圖。
5.一種在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí)實(shí)現(xiàn)減少內(nèi)存占用空間的方法,包括組播包入隊(duì)列、組播包出隊(duì)列組播包入隊(duì)列進(jìn)一步包括如下步驟第一步取得下一個(gè)出隊(duì)列的隊(duì)列號(hào);第二步按照單播的方式入隊(duì)列,不拷貝數(shù)據(jù)包和生成新的數(shù)據(jù)包描述字,不需要判斷該數(shù)據(jù)包是否需要在這個(gè)隊(duì)列中發(fā)送;第三步判斷是否是最后一個(gè)出隊(duì)列,如果不是則返回第一步,如果是則結(jié)束入隊(duì)列,組播包出隊(duì)列進(jìn)一步包括如下步驟第一步按照單播的方式出隊(duì)列,修改隊(duì)列中指針的結(jié)構(gòu),修改隊(duì)列描述字中的頭指針,不釋放出隊(duì)列的數(shù)據(jù)包描述字的空間,不歸還數(shù)據(jù)包的空間;第二步判斷這個(gè)包是否需要在本隊(duì)列發(fā)送,如果是則進(jìn)行第三步,如果不是,則進(jìn)行第四步;第三步發(fā)送本數(shù)據(jù)包;第四步讀取該包描述字中的發(fā)送數(shù)據(jù)包結(jié)束標(biāo)志位圖,判斷是不是最后一次發(fā)送,如果不是則在發(fā)送數(shù)據(jù)包結(jié)束標(biāo)志位圖中設(shè)置本隊(duì)列發(fā)送結(jié)束標(biāo)志位,如果是最后一次發(fā)送,則需要?dú)w還數(shù)據(jù)包所占的空間,釋放該包描述字的空間。
全文摘要
一種在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí)實(shí)現(xiàn)減少內(nèi)存占用空間的方法,特別是在組播數(shù)據(jù)包轉(zhuǎn)發(fā)時(shí),通過(guò)鏈表隊(duì)列的改進(jìn)實(shí)現(xiàn)減少內(nèi)存占用空間的方法。其特征在于所述方法包括在內(nèi)存中只存有一份需要轉(zhuǎn)發(fā)數(shù)據(jù)包的拷貝;在內(nèi)存中只存在一條由包描述字連接而成的鏈表,各個(gè)發(fā)送隊(duì)列的隊(duì)列描述字通過(guò)頭指針連接到該鏈表;在最后一個(gè)和該鏈表相連的隊(duì)列發(fā)送結(jié)束后,將該數(shù)據(jù)包占用的空間歸還給緩存(buffer)。使用本發(fā)明后,數(shù)據(jù)包實(shí)現(xiàn)零拷貝發(fā)送,而且各個(gè)隊(duì)列發(fā)送線程的關(guān)聯(lián)性很小,發(fā)送時(shí)不需要相互等待,大大提高了組播發(fā)送的效率。
文檔編號(hào)H04L12/54GK1545274SQ20031010387
公開(kāi)日2004年11月10日 申請(qǐng)日期2003年11月18日 優(yōu)先權(quán)日2003年11月18日
發(fā)明者陳崢, 劉欣, 李家國(guó), 茹黎濤, 陳 崢 申請(qǐng)人:中興通訊股份有限公司