專利名稱:保證報(bào)文順序的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)通信領(lǐng)域,特別涉及一種保證報(bào)文順序的方法和裝置。
背景技術(shù):
數(shù)據(jù)通信設(shè)備的一個(gè)基本功能是轉(zhuǎn)發(fā)IP(Internet Protocol,互聯(lián)網(wǎng)協(xié)議)報(bào)文。有很多業(yè)務(wù)要求數(shù)據(jù)通信設(shè)備嚴(yán)格保證報(bào)文的順序,比如語音、圖形等實(shí)時(shí)業(yè)務(wù)。對(duì)路由器來說,保證同一分組的報(bào)文轉(zhuǎn)發(fā)順序尤為重要,同一條數(shù)據(jù)流進(jìn)入路由器和離開路由器的順序應(yīng)嚴(yán)格保證相同。
對(duì)于分布式體系結(jié)構(gòu)的路由器,一般由硬件轉(zhuǎn)發(fā)引擎完成IP報(bào)文的轉(zhuǎn)發(fā)。一些多線程的網(wǎng)絡(luò)處理器由硬件機(jī)制來保證報(bào)文順序,例如,使用信號(hào)量機(jī)制,在線程為串行和并行混合時(shí),通常在并行和串行的接口處利用信號(hào)量同步來保序;或者通過接收單元硬件給報(bào)文打label(標(biāo)簽),在發(fā)送報(bào)文的時(shí)候由硬件保證按照label順序發(fā)送報(bào)文。這些依賴硬件機(jī)制保證報(bào)文順序的好處是,系統(tǒng)的性能基本不會(huì)受到影響,但是會(huì)有因芯片失效而造成線程間信號(hào)量收發(fā)混亂的隱患。
報(bào)文保序功能還可以通過軟件方案來實(shí)現(xiàn),這種方式主要應(yīng)用在由多核多線程CPU完成報(bào)文轉(zhuǎn)發(fā)的系統(tǒng)中。采用軟件方案實(shí)現(xiàn)報(bào)文保序基本不依賴于硬件單元實(shí)現(xiàn),可移植性優(yōu)于用硬件機(jī)制實(shí)現(xiàn)的方案,而且受芯片的影響較小。不同的軟件方案導(dǎo)致系統(tǒng)的性能也不同,這種性能差異不僅僅體現(xiàn)在報(bào)文保序的算法本身,更重要的是體現(xiàn)在整個(gè)系統(tǒng)性能之中,所以往往需要綜合考慮系統(tǒng)的整體性能情況來設(shè)計(jì)報(bào)文保序的軟件方案。
圖1為現(xiàn)有技術(shù)在由多核多線程的CPU完成IP報(bào)文轉(zhuǎn)發(fā)的系統(tǒng)中軟件實(shí)現(xiàn)報(bào)文保序的原理示意圖。參見圖1,RX(Receive,接收單元)將一條數(shù)據(jù)流內(nèi)的報(bào)文以輪詢的方式分到并行的多個(gè)處理線程中,即線程0、線程1、...、線程n,再經(jīng)過處理單元分配到多個(gè)包保序線程中并行處理,即包保序線程0、包保序線程1、...、包保序線程n,然后交給TX(Transmit,發(fā)送單元)發(fā)送。
在接收單元接收到報(bào)文時(shí),按一定規(guī)則給每個(gè)報(bào)文分配一個(gè)flow_id(數(shù)據(jù)流id)和seq_num(報(bào)文序列號(hào))。數(shù)據(jù)流id是為了區(qū)分不同的數(shù)據(jù)流,所以同一條數(shù)據(jù)流內(nèi)的報(bào)文都具有相同的flow_id,但是同一條數(shù)據(jù)流內(nèi)的報(bào)文的seq_num均不相同。另外預(yù)先設(shè)置一個(gè)固定長(zhǎng)度的隊(duì)列Seqs[x],用來緩存當(dāng)前數(shù)據(jù)流內(nèi)的報(bào)文,并和當(dāng)前可以發(fā)送的報(bào)文的序列號(hào)Seq_current一起保存在一個(gè)數(shù)據(jù)結(jié)構(gòu)中,如表1所示。其中隊(duì)列的長(zhǎng)度x可以根據(jù)實(shí)際情況設(shè)定。
表1
參見圖2,保序算法類似于滑動(dòng)窗口機(jī)制。假設(shè)預(yù)設(shè)隊(duì)列長(zhǎng)度x為64,則報(bào)文隊(duì)列能夠緩存64個(gè)報(bào)文,將報(bào)文隊(duì)列看成是一個(gè)可以滑動(dòng)的窗體,根據(jù)當(dāng)前可以發(fā)送的報(bào)文序列號(hào)來確定窗體在當(dāng)前數(shù)據(jù)流上的位置。如果接收的報(bào)文在當(dāng)前緩存隊(duì)列的范圍內(nèi),即滿足下面的條件時(shí)(seq_num>=seq_current)&&(seq_num<(seq_current+64))&&(窗口中seq_num對(duì)應(yīng)的位置沒有報(bào)文);才將當(dāng)前報(bào)文緩存到當(dāng)前數(shù)據(jù)流的報(bào)文隊(duì)列seq[64]中,進(jìn)行報(bào)文排序;如果接收的報(bào)文不在當(dāng)前緩存隊(duì)列的范圍內(nèi),則丟棄報(bào)文。
報(bào)文排序完成后,根據(jù)seq_current從緩存隊(duì)列中對(duì)應(yīng)的位置讀出報(bào)文,由發(fā)送單元連續(xù)發(fā)送隊(duì)列中的報(bào)文,直到隊(duì)列中某個(gè)位置還沒有填入報(bào)文為止。
上述現(xiàn)有技術(shù)需要占用單獨(dú)的包保序線程組來完成報(bào)文保序,占用較多的系統(tǒng)資源;而且用同一款多核多線程芯片實(shí)現(xiàn)不同的軟件保序方案,雖然是多線程并行處理,卻沒有提高系統(tǒng)的性能。
發(fā)明內(nèi)容
為了解決現(xiàn)有技術(shù)中軟件保序占用較多的系統(tǒng)資源等問題,本發(fā)明實(shí)施例提供了一種保證報(bào)文順序的方法,具體包括以下步驟在轉(zhuǎn)發(fā)多條數(shù)據(jù)流的報(bào)文時(shí),為接收到的每個(gè)報(bào)文分配一個(gè)序列號(hào),并以輪詢的方式將接收到的報(bào)文分配到并行的多個(gè)線程中;為每條數(shù)據(jù)流設(shè)置一個(gè)當(dāng)前發(fā)送序列號(hào);在每個(gè)線程轉(zhuǎn)發(fā)報(bào)文時(shí),先找到待轉(zhuǎn)發(fā)報(bào)文所屬數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào),并對(duì)所述當(dāng)前發(fā)送序列號(hào)進(jìn)行加鎖,比較所述當(dāng)前發(fā)送序列號(hào)和待轉(zhuǎn)發(fā)報(bào)文的序列號(hào)是否相等,如果相等,則轉(zhuǎn)發(fā)該報(bào)文,更新所述當(dāng)前發(fā)送序列號(hào),對(duì)所述當(dāng)前發(fā)送序列號(hào)解鎖。
本發(fā)明實(shí)施例中還提供了一種保證報(bào)文順序的裝置,所述裝置包括
初始化模塊,用于在轉(zhuǎn)發(fā)多條數(shù)據(jù)流的報(bào)文時(shí),為接收到的每個(gè)報(bào)文分配一個(gè)序列號(hào),并以輪詢的方式將接收到的報(bào)文分配到并行的多個(gè)線程中;還用于為每條數(shù)據(jù)流設(shè)置一個(gè)當(dāng)前發(fā)送序列號(hào);保序模塊,用于在每個(gè)線程轉(zhuǎn)發(fā)報(bào)文時(shí),先找到待轉(zhuǎn)發(fā)報(bào)文所屬數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào),并對(duì)所述當(dāng)前發(fā)送序列號(hào)進(jìn)行加鎖,比較所述當(dāng)前發(fā)送序列號(hào)和待轉(zhuǎn)發(fā)報(bào)文的序列號(hào)是否相等,如果相等,則轉(zhuǎn)發(fā)該報(bào)文,更新所述當(dāng)前發(fā)送序列號(hào),對(duì)所述當(dāng)前發(fā)送序列號(hào)解鎖。
本發(fā)明實(shí)施例算法簡(jiǎn)單,不需要單獨(dú)的保序線程,對(duì)內(nèi)存需求小,具有系統(tǒng)整體性能優(yōu)勢(shì)。
圖1是現(xiàn)有技術(shù)在由多核多線程的CPU完成IP報(bào)文轉(zhuǎn)發(fā)的系統(tǒng)中軟件實(shí)現(xiàn)報(bào)文保序的原理示意圖;圖2是現(xiàn)有技術(shù)軟件保序算法原理示意圖;圖3是本發(fā)明實(shí)施例保證報(bào)文順序的方法線程處理的示意圖;圖4是本發(fā)明實(shí)施例保證報(bào)文順序的方法的流程圖;圖5是本發(fā)明實(shí)施例保證報(bào)文順序的裝置的結(jié)構(gòu)圖。
具體實(shí)施例方式
下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明作進(jìn)一步說明,但本發(fā)明不局限于下面的實(shí)施例。
本發(fā)明實(shí)施例采用類似spin_lock(自旋鎖)的方式來實(shí)現(xiàn)報(bào)文保序,而且不需要單獨(dú)的保序線程。參見圖3,在轉(zhuǎn)發(fā)多條數(shù)據(jù)流的報(bào)文時(shí),接收單元RX給接收到的每個(gè)報(bào)文分配序列號(hào),并將報(bào)文以輪詢(round robin)的方式分到并行的處理線程中(線程0至線程n,n為自然數(shù)),同一條數(shù)據(jù)流內(nèi)的報(bào)文可能被分發(fā)到不同的線程中去處理,在這些并行處理的線程中,通過對(duì)預(yù)先為每條數(shù)據(jù)流設(shè)置的當(dāng)前發(fā)送序列號(hào)進(jìn)行加鎖,在報(bào)文序列號(hào)符合當(dāng)前發(fā)送序列號(hào)的情況下發(fā)送報(bào)文,以及發(fā)送后解鎖當(dāng)前發(fā)送序列號(hào)的方式來實(shí)現(xiàn)報(bào)文保序。
參見圖4,本發(fā)明實(shí)施例提供了一種保證報(bào)文順序的方法,具體包括以下步驟步驟101在轉(zhuǎn)發(fā)多條數(shù)據(jù)流的報(bào)文時(shí),接收單元給接收到的每個(gè)報(bào)文都分配一個(gè)序列號(hào)seq_num,并以輪詢的方式將報(bào)文分配到并行的多個(gè)處理線程中。
多條數(shù)據(jù)流按照一定的分組規(guī)則進(jìn)行區(qū)分,例如,報(bào)文信息中的端口號(hào)均為端口2的報(bào)文,可以看做是同一條數(shù)據(jù)流內(nèi)的報(bào)文。為同一條數(shù)據(jù)流內(nèi)的報(bào)文分配的序列號(hào)均不相同,用于區(qū)分同一條數(shù)據(jù)流內(nèi)的不同報(bào)文。
步驟102為每條數(shù)據(jù)流設(shè)置一個(gè)當(dāng)前發(fā)送序列號(hào)seq_current,相應(yīng)地,多條數(shù)據(jù)流就會(huì)有多個(gè)當(dāng)前發(fā)送序列號(hào),將所有當(dāng)前發(fā)送序列號(hào)seq_current保存在內(nèi)存中的一塊共享地址中;所有并行的處理線程都可以訪問此共享地址來讀取當(dāng)前發(fā)送序列號(hào)。
步驟103每個(gè)線程在轉(zhuǎn)發(fā)報(bào)文時(shí),先從共享地址中找到待轉(zhuǎn)發(fā)報(bào)文所屬數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào)seq_current,并對(duì)該序列號(hào)seq_current進(jìn)行加鎖。
步驟104比較該報(bào)文的序列號(hào)seq_num和當(dāng)前發(fā)送序列號(hào)seq_current是否相等,如果相等,則執(zhí)行步驟105;否則執(zhí)行步驟106。
步驟105發(fā)送該報(bào)文,并更新seq_current,即將seq_current的值加1,作為下次判斷是否發(fā)送報(bào)文的依據(jù),對(duì)seq_current解鎖。
步驟106不轉(zhuǎn)發(fā)該報(bào)文,對(duì)seq_current進(jìn)行解鎖,繼續(xù)執(zhí)行步驟103,直到全部報(bào)文轉(zhuǎn)發(fā)完畢。
加鎖和解鎖的過程可分別通過函數(shù)PKT_ORDER_LOCK()和PKT_ORDER_UNLOCK()來實(shí)現(xiàn)。
參見圖5,本發(fā)明實(shí)施例還提供了一種保證報(bào)文順序的裝置,具體包括1)初始化模塊,用于在轉(zhuǎn)發(fā)多條數(shù)據(jù)流的報(bào)文時(shí),為接收到的每個(gè)報(bào)文分配一個(gè)序列號(hào)seq_num,并以輪詢的方式將接收到的報(bào)文分配到并行的多個(gè)線程中;還用于為每條數(shù)據(jù)流設(shè)置一個(gè)當(dāng)前發(fā)送序列號(hào)seq_current;2)保序模塊,用于在每個(gè)線程轉(zhuǎn)發(fā)報(bào)文時(shí),先找到待轉(zhuǎn)發(fā)報(bào)文所屬數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào)seq_current,并對(duì)該當(dāng)前發(fā)送序列號(hào)seq_current進(jìn)行加鎖,比較當(dāng)前發(fā)送序列號(hào)seq_current和待轉(zhuǎn)發(fā)報(bào)文的序列號(hào)seq_num是否相等,如果相等,則轉(zhuǎn)發(fā)該報(bào)文,更新當(dāng)前發(fā)送序列號(hào)seq_current,并對(duì)其解鎖。
上述保序模塊更新當(dāng)前發(fā)送序列號(hào)seq_current具體是指對(duì)當(dāng)前發(fā)送序列號(hào)seq_current加1,即seq_current=seq_current+1。
上述保序模塊還用于在當(dāng)前發(fā)送序列號(hào)和待轉(zhuǎn)發(fā)報(bào)文的序列號(hào)不相等時(shí),對(duì)當(dāng)前發(fā)送序列號(hào)進(jìn)行解鎖,且不轉(zhuǎn)發(fā)待轉(zhuǎn)發(fā)報(bào)文。
上述保證報(bào)文順序的裝置還包括保存模塊,用于在設(shè)置完所有數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào)后,以上述所有并行的線程均能訪問的方式保存所有數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào),即保存在一塊共享地址中,所有并行的線程都能訪問該共享地址。
以上所述的實(shí)施例,只是本發(fā)明較優(yōu)選的具體實(shí)施方式
的幾種,本領(lǐng)域的技術(shù)人員在本發(fā)明技術(shù)方案范圍內(nèi)進(jìn)行的通常變化和替換都應(yīng)包含在本發(fā)明的保護(hù)范圍內(nèi)。
權(quán)利要求
1.一種保證報(bào)文順序的方法,其特征在于,所述方法包括在轉(zhuǎn)發(fā)多條數(shù)據(jù)流的報(bào)文時(shí),為接收到的每個(gè)報(bào)文分配一個(gè)序列號(hào),并以輪詢的方式將接收到的報(bào)文分配到并行的多個(gè)線程中;為每條數(shù)據(jù)流設(shè)置一個(gè)當(dāng)前發(fā)送序列號(hào);在每個(gè)線程轉(zhuǎn)發(fā)報(bào)文時(shí),先找到待轉(zhuǎn)發(fā)報(bào)文所屬數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào),并對(duì)所述當(dāng)前發(fā)送序列號(hào)進(jìn)行加鎖,比較所述當(dāng)前發(fā)送序列號(hào)和待轉(zhuǎn)發(fā)報(bào)文的序列號(hào)是否相等,如果相等,則轉(zhuǎn)發(fā)該報(bào)文,更新所述當(dāng)前發(fā)送序列號(hào),對(duì)所述當(dāng)前發(fā)送序列號(hào)解鎖。
2.根據(jù)權(quán)利要求1所述的保證報(bào)文順序的方法,其特征在于,所述更新所述當(dāng)前發(fā)送序列號(hào),包括對(duì)所述當(dāng)前發(fā)送序列號(hào)加1。
3.根據(jù)權(quán)利要求1所述的保證報(bào)文順序的方法,其特征在于,所述方法還包括在所述當(dāng)前發(fā)送序列號(hào)和待轉(zhuǎn)發(fā)報(bào)文的序列號(hào)不相等時(shí),對(duì)所述當(dāng)前發(fā)送序列號(hào)進(jìn)行解鎖,且不轉(zhuǎn)發(fā)所述待轉(zhuǎn)發(fā)報(bào)文。
4.根據(jù)權(quán)利要求1或2或3所述的保證報(bào)文順序的方法,其特征在于,所述方法還包括在設(shè)置完所述多條數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào)后,以所述并行的多個(gè)線程均能訪問的方式保存所述每條數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào)。
5.根據(jù)權(quán)利要求1或2或3所述的保證報(bào)文順序的方法,其特征在于,所述多條數(shù)據(jù)流按照設(shè)定的分組規(guī)則進(jìn)行區(qū)分。
6.根據(jù)權(quán)利要求1或2或3所述的保證報(bào)文順序的方法,其特征在于,為接收到的每個(gè)報(bào)文分配一個(gè)序列號(hào)時(shí),對(duì)屬于同一條數(shù)據(jù)流內(nèi)的報(bào)文分配不相同的序列號(hào)。
7.一種保證報(bào)文順序的裝置,其特征在于,所述裝置包括初始化模塊,用于在轉(zhuǎn)發(fā)多條數(shù)據(jù)流的報(bào)文時(shí),為接收到的每個(gè)報(bào)文分配一個(gè)序列號(hào),并以輪詢的方式將接收到的報(bào)文分配到并行的多個(gè)線程中;還用于為每條數(shù)據(jù)流設(shè)置一個(gè)當(dāng)前發(fā)送序列號(hào);保序模塊,用于在每個(gè)線程轉(zhuǎn)發(fā)報(bào)文時(shí),先找到待轉(zhuǎn)發(fā)報(bào)文所屬數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào),并對(duì)所述當(dāng)前發(fā)送序列號(hào)進(jìn)行加鎖,比較所述當(dāng)前發(fā)送序列號(hào)和待轉(zhuǎn)發(fā)報(bào)文的序列號(hào)是否相等,如果相等,則轉(zhuǎn)發(fā)該報(bào)文,更新所述當(dāng)前發(fā)送序列號(hào),對(duì)所述當(dāng)前發(fā)送序列號(hào)解鎖。
8.根據(jù)權(quán)利要求7所述的保證報(bào)文順序的裝置,其特征在于,所述更新所述當(dāng)前發(fā)送序列號(hào),包括對(duì)所述當(dāng)前發(fā)送序列號(hào)加1。
9.根據(jù)權(quán)利要求7所述的保證報(bào)文順序的裝置,其特征在于,所述保序模塊還用于在所述當(dāng)前發(fā)送序列號(hào)和待轉(zhuǎn)發(fā)報(bào)文的序列號(hào)不相等時(shí),對(duì)所述當(dāng)前發(fā)送序列號(hào)進(jìn)行解鎖,且不轉(zhuǎn)發(fā)所述待轉(zhuǎn)發(fā)報(bào)文。
10.根據(jù)權(quán)利要求7或8或9所述的保證報(bào)文順序的裝置,其特征在于,所述裝置還包括保存模塊,用于在設(shè)置完所述多條數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào)后,以所述并行的多個(gè)線程均能訪問的方式保存所述每條數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào)。
全文摘要
本發(fā)明提供了一種保證報(bào)文順序的方法和裝置,屬于數(shù)據(jù)通信領(lǐng)域。為了解決現(xiàn)有技術(shù)中軟件保序占用較多的系統(tǒng)資源等問題,本發(fā)明提供了一種保證報(bào)文順序的方法,包括以下步驟在轉(zhuǎn)發(fā)多條數(shù)據(jù)流的報(bào)文時(shí),為接收到的每個(gè)報(bào)文分配一個(gè)序列號(hào),并以輪詢的方式將報(bào)文分配到并行的多個(gè)線程中;為每條數(shù)據(jù)流設(shè)置一個(gè)當(dāng)前發(fā)送序列號(hào);在每個(gè)線程轉(zhuǎn)發(fā)報(bào)文時(shí),先找到待轉(zhuǎn)發(fā)報(bào)文所屬數(shù)據(jù)流的當(dāng)前發(fā)送序列號(hào)并進(jìn)行加鎖,在當(dāng)前發(fā)送序列號(hào)和待轉(zhuǎn)發(fā)報(bào)文的序列號(hào)相等時(shí)轉(zhuǎn)發(fā)該報(bào)文,更新當(dāng)前發(fā)送序列號(hào)并解鎖。本發(fā)明還提供了一種保證報(bào)文順序的裝置,包括初始化模塊和保序模塊。本發(fā)明算法簡(jiǎn)單,不需要單獨(dú)的保序線程,對(duì)內(nèi)存需求小,具有系統(tǒng)整體性能優(yōu)勢(shì)。
文檔編號(hào)H04L29/06GK1996958SQ20061017224
公開日2007年7月11日 申請(qǐng)日期2006年12月30日 優(yōu)先權(quán)日2006年12月30日
發(fā)明者夏陽, 王慧, 郭英輝, 薛蘊(yùn)全, 高秋明 申請(qǐng)人:華為技術(shù)有限公司