两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

線速分組并行轉(zhuǎn)發(fā)方法和裝置的制作方法

文檔序號(hào):7591065閱讀:531來源:國知局

專利名稱::線速分組并行轉(zhuǎn)發(fā)方法和裝置的制作方法
技術(shù)領(lǐng)域
:本發(fā)明涉及分組轉(zhuǎn)發(fā)方法和裝置,特別涉及線速分組并行轉(zhuǎn)發(fā)方法和裝置。
背景技術(shù)
:分組轉(zhuǎn)發(fā)是構(gòu)建因特網(wǎng)(Internet)的核心技術(shù)。盡管不同的廠家采用不同的技術(shù)設(shè)計(jì)各種型號(hào)的交換機(jī)和路由器,運(yùn)行的操作系統(tǒng)和處理性能上也有很大的差別,但最核心的工作相同,就是進(jìn)行數(shù)據(jù)的分組轉(zhuǎn)發(fā)。分組轉(zhuǎn)發(fā)的過程大體上可以概括為接收分組,提取分組中的目的地址,查找轉(zhuǎn)發(fā)表,決定分組下一跳的出端口,之后將分組從出端口中發(fā)送。對(duì)于任一分組,這幾個(gè)過程一直在網(wǎng)絡(luò)中持續(xù)下去,直到分組到達(dá)目的地。當(dāng)前Internet中的數(shù)據(jù)處理設(shè)備多種多樣,但處理分組的方式可以劃分為兩種(1)非并行的分組處理方式。這是較為傳統(tǒng)的分組處理,系統(tǒng)中的單個(gè)中央處理單元(CPU)通過運(yùn)行分組處理進(jìn)程來完成分組的轉(zhuǎn)發(fā),這種設(shè)備占領(lǐng)了數(shù)據(jù)產(chǎn)品市場的較大份額,但性能較差。文中針對(duì)這種分組處理設(shè)備的不足進(jìn)行了深刻的剖析;(2)并行的分組處理方式。通過多個(gè)處理器并行地進(jìn)行分組的處理,來提高系統(tǒng)的整體性能提高吞吐量、減少時(shí)延、減少丟包率、減少實(shí)時(shí)業(yè)務(wù)的抖動(dòng)等等。盡管實(shí)現(xiàn)并行分組轉(zhuǎn)發(fā)的方法很多,但能達(dá)到線速處理的并行處理方法很少。本文介紹的并行分組處理方法經(jīng)過F-Engine系列設(shè)備的多次測試,證明性能優(yōu)異,并行分組處理能力能達(dá)到線速。對(duì)分組處理的實(shí)現(xiàn)方法研究很多,大部分是采用非并行的分組處理方式。不少的路由器和交換機(jī)采用通用的CPU或是嵌入式的CPU(俗稱通訊處理器)進(jìn)行分組轉(zhuǎn)發(fā)。在這種系統(tǒng)中,系統(tǒng)依靠唯一的處理器資源,運(yùn)行系統(tǒng)中的多個(gè)進(jìn)程來完成系統(tǒng)中的多項(xiàng)任務(wù),如進(jìn)程調(diào)度、資源分配、異常處理、系統(tǒng)日志等,分組處理進(jìn)程只是其中一個(gè)。當(dāng)前較為流行的解決方案中,不少是采用MotorolaMPC860或是MotorolaMPC8240進(jìn)行分組的處理。Cisco2600路由器就是采用MPC860的一個(gè)典型的應(yīng)用,與眾不同的是,Cisco2600采用高速緩沖存儲(chǔ)器(Cache)作為分組處理加速器,雖然如此,其10/100M以太網(wǎng)的處理能力仍然不能達(dá)到線速處理的能力。類似的實(shí)現(xiàn)方案還有D-LinkDI-1750,清華同方TFR2501和TFR2502,等等。QuidwayR3600E、港灣NetHammerM262均是基于MPC8240的實(shí)現(xiàn),華為QuidwayR1760則采用了MPC8241進(jìn)行分組處理。在市場感召力下,Intel也推出了通信處理器IXP425,其分組處理借助于嵌入式、低功耗ARMCPU來完成。IXP425也是通過采用加速的方式來提高分組的處理能力。這些分組處理的實(shí)現(xiàn),均有一個(gè)共同點(diǎn),就是CPU參與分組的處理,但處理能力不高,為了提高系統(tǒng)的處理能力,往往借助于Cache或其它的加速處理模塊來提高系統(tǒng)的性能,但性能提升的幅度有限,不能達(dá)到線速處理,這種現(xiàn)象是此類設(shè)備的嚴(yán)重缺陷,它們占用了網(wǎng)絡(luò)上的接口資源,同時(shí)又讓這些接口成為數(shù)據(jù)轉(zhuǎn)發(fā)的瓶頸。當(dāng)前網(wǎng)絡(luò)上眾多的設(shè)備當(dāng)中,不少的中低端交換機(jī)和路由器均是采用單CPU單分組處理進(jìn)程的方式來完成分組轉(zhuǎn)發(fā)的。非并行的分組處理方法中,分組處理進(jìn)程在運(yùn)行一段時(shí)間后,可能由于別的原因(如系統(tǒng)中有中斷產(chǎn)生)而被操作系統(tǒng)換出。如此一來,分組處理的進(jìn)程就被掛起,放在分組緩沖區(qū)中的分組被無限的排隊(duì)等候,此時(shí)有兩種可能的情況發(fā)生(1)下次分組處理進(jìn)程被操作系統(tǒng)調(diào)度時(shí),繼續(xù)分組的處理,這時(shí)分組已經(jīng)在排隊(duì)緩沖區(qū)中等候多時(shí),造成了分組較大的時(shí)延,如圖1A和1B所示。圖1A和1B圖解說明了傳統(tǒng)路由器中分組時(shí)延的產(chǎn)生,其中圖1A圖示了連續(xù)發(fā)送的兩個(gè)語音分組,而圖1B圖示了時(shí)延造成語音分組的抖動(dòng)。用戶端在t=0的時(shí)刻,發(fā)送了兩個(gè)語音分組,間隔為Δt,在線路中經(jīng)過了一跳(onehop)非并行的分組處理路由器,由于調(diào)度上的原因,分組到達(dá)接收端,分組間的間隔變成了χ·Δt,當(dāng)χ·Δt>50ms時(shí),接收端就會(huì)明顯地感覺到語音抖動(dòng)。在基于傳統(tǒng)的分組處理方式上,出現(xiàn)上述現(xiàn)象是很常見的事情。(2)分組處理進(jìn)程被再次調(diào)度之前,網(wǎng)絡(luò)接口中可能已經(jīng)有大量的分組到來,放在隊(duì)列中的分組被“淹沒”,造成大量的分組丟失,這是實(shí)時(shí)業(yè)務(wù)傳送中造成傳輸質(zhì)量下滑的主要原因。圖2A和2B圖解說明了傳統(tǒng)分組處理設(shè)備中分組的丟失,其中圖2A圖示了在某一時(shí)刻系統(tǒng)中的排隊(duì)分組,而圖2B圖示了系統(tǒng)中的分組因處理不及時(shí)被“淹沒”。在圖2B中,圖2A中的P2,P3,...,Pn分組被P8,P9,...,Pm分組所覆蓋,對(duì)于實(shí)時(shí)語音業(yè)務(wù)而言,接收端就會(huì)感覺到語音不連貫;對(duì)于TCP連接,有可能造成連接丟失;對(duì)于動(dòng)態(tài)路由協(xié)議,如OSPF,BGP等,長時(shí)間的網(wǎng)絡(luò)擁塞,易出現(xiàn)鄰居關(guān)系的丟失,造成路由的翻轉(zhuǎn),網(wǎng)絡(luò)不穩(wěn)定。另外一種較大的缺陷就是系統(tǒng)的吞吐量小。非并行處理的情況下,系統(tǒng)的吞吐量大打折扣。假設(shè)系統(tǒng)中僅有5個(gè)進(jìn)程,其中一個(gè)為系統(tǒng)調(diào)度進(jìn)程,一個(gè)為資源管理進(jìn)程,一個(gè)為日志進(jìn)程,一個(gè)為輸入輸出處理進(jìn)程,另一個(gè)是分組處理進(jìn)程。這樣的系統(tǒng)中,分組處理進(jìn)程最多只能有20%的CPU時(shí)鐘周期在進(jìn)行分組的處理,其它大部分時(shí)間在執(zhí)行系統(tǒng)中的其它處理。這是最簡單的系統(tǒng)模型,在傳統(tǒng)的路由器和交換機(jī)中,分組進(jìn)程能擁有20%的處理機(jī)時(shí)間已經(jīng)是理論極限值。總之,就是CPU無法專注做好“分組轉(zhuǎn)發(fā)”這一任務(wù),因此系統(tǒng)的吞吐量相對(duì)于多轉(zhuǎn)發(fā)引擎上的并行分組處理來說,大為降低,而且整個(gè)系統(tǒng)中由于沒有進(jìn)行轉(zhuǎn)發(fā)平面和控制平面的分離,致使系統(tǒng)的穩(wěn)定性和安全性也較差。綜合上述,主要的弊端有以下幾點(diǎn)(1)系統(tǒng)中CPU資源由于處理各種事務(wù),如內(nèi)核調(diào)度,中斷處理等原因,導(dǎo)致分組處理進(jìn)程被調(diào)出,致使分組的轉(zhuǎn)發(fā)時(shí)延不確定;(2)用于分組處理的時(shí)間短,容易導(dǎo)致大量的分組由于來不及及時(shí)處理而被丟失;往往使實(shí)時(shí)業(yè)務(wù)出現(xiàn)抖動(dòng),而非實(shí)時(shí)業(yè)務(wù)如TCP報(bào)文丟失,必須進(jìn)行重傳;(3)系統(tǒng)的吞吐量小,不可能達(dá)到線速處理分組的能力;(4)安全性較差。當(dāng)系統(tǒng)中出現(xiàn)非法流量的攻擊,如網(wǎng)絡(luò)上較流行的沖擊波病毒時(shí),系統(tǒng)中的某些進(jìn)程由于資源耗盡無法繼續(xù)運(yùn)行,如ARP進(jìn)程,當(dāng)出現(xiàn)這種狀況時(shí),系統(tǒng)只能借助重新啟動(dòng)才能恢復(fù)正常;(5)穩(wěn)定性較差。當(dāng)存在設(shè)計(jì)上的邏輯錯(cuò)誤時(shí),如內(nèi)存泄漏,非法地址操作等,就會(huì)導(dǎo)致整個(gè)系統(tǒng)(轉(zhuǎn)發(fā)平面和控制平面)一起崩潰。
發(fā)明內(nèi)容本文的目的在于提供一種具有線速轉(zhuǎn)發(fā)能力的并行分組處理方法及裝置。根據(jù)本發(fā)明的一個(gè)方面,提供了一種分組轉(zhuǎn)發(fā)方法,用于將來自至少一個(gè)入端口的分組數(shù)據(jù)從至少一個(gè)出端口轉(zhuǎn)發(fā)出去,該方法包括提供相互分離的控制平面和轉(zhuǎn)發(fā)平面,在控制平面中進(jìn)行系統(tǒng)控制操作,而在轉(zhuǎn)發(fā)平面中進(jìn)行分組轉(zhuǎn)發(fā)操作,在轉(zhuǎn)發(fā)平面中提供至少一個(gè)并行的轉(zhuǎn)發(fā)引擎,每個(gè)轉(zhuǎn)發(fā)引擎上運(yùn)行多個(gè)線程,所述線程包括至少一個(gè)接收線程和至少一個(gè)發(fā)送線程,由所述接收線程從所述入端口接收分組;以及由所述發(fā)送線程將所接收到的分組并行發(fā)送到出端口。根據(jù)本發(fā)明的另一個(gè)方面,提供了一種分組轉(zhuǎn)發(fā)裝置,用于將來自至少一個(gè)入端口的分組數(shù)據(jù)從至少一個(gè)出端口轉(zhuǎn)發(fā)出去,該裝置包括控制平面,用于進(jìn)行系統(tǒng)控制操作;轉(zhuǎn)發(fā)平面,和控制平面相互分離,用于進(jìn)行分組轉(zhuǎn)發(fā)操作,所述轉(zhuǎn)發(fā)平面包括至少兩個(gè)轉(zhuǎn)發(fā)引擎,轉(zhuǎn)發(fā)引擎包括接收線程處理單元,用于產(chǎn)生至少一個(gè)接收線程,所述接收線程用于從所述入端口接收分組;以及發(fā)送線程處理單元,用于產(chǎn)生至少一個(gè)發(fā)送線程,所述發(fā)送線程用于將所接收到的分組并行發(fā)送到出端口。本發(fā)明還提供了一種擴(kuò)展分組轉(zhuǎn)發(fā)裝置,其通過使用交叉背板,將至少一個(gè)根據(jù)本發(fā)明的分組轉(zhuǎn)發(fā)裝置連接在一起。相對(duì)于傳統(tǒng)分組轉(zhuǎn)發(fā)方法和裝置的分析,本發(fā)明主要作出的改進(jìn)有(1)控制平面和轉(zhuǎn)發(fā)平面分離,增強(qiáng)系統(tǒng)的穩(wěn)定性和安全性;轉(zhuǎn)發(fā)線程只在數(shù)據(jù)平面運(yùn)行,對(duì)非法的數(shù)據(jù)流造成的不穩(wěn)定性在該平面中進(jìn)行了隔離,不會(huì)波及到控制平面;同樣,控制平面上的誤操作(如非法地址訪問,內(nèi)存泄漏等)不會(huì)波及到轉(zhuǎn)發(fā)平面;(2)采用多處理器進(jìn)行分組的并行轉(zhuǎn)發(fā);轉(zhuǎn)發(fā)的執(zhí)行單元為線程,相對(duì)于進(jìn)程而言,運(yùn)行過程中開銷更小,速度更快,效率更高,對(duì)存儲(chǔ)空間的訪問采用直接定位的方式進(jìn)行,而不需要操作系統(tǒng)進(jìn)行地址分配(如執(zhí)行malloc操作);(3)系統(tǒng)中的進(jìn)程調(diào)度、中斷處理、資源分配等任務(wù)全部在控制平面完成,轉(zhuǎn)發(fā)平面只是并行地進(jìn)行分組的處理;所有的轉(zhuǎn)發(fā)線程只是專注完成同一個(gè)任務(wù)處理分組;(4)在同一處理器上,轉(zhuǎn)發(fā)線程有多個(gè),當(dāng)其中的一個(gè)線程因訪問系統(tǒng)中的資源等待完成,如存放分組,等待信號(hào)量時(shí),它立刻進(jìn)入“休眠”狀態(tài),切換出處理器,讓其它的線程執(zhí)行,進(jìn)行分組的轉(zhuǎn)發(fā);當(dāng)?shù)却€程的等待事件發(fā)生時(shí),“休眠”的線程立即被調(diào)度線程喚醒;(5)調(diào)度線程非常簡單,在調(diào)度的過程中,占用處理器的時(shí)間很短,不同于非并行轉(zhuǎn)發(fā)方法中操作系統(tǒng)的調(diào)度機(jī)制,后者需要耗費(fèi)大量的處理器時(shí)間;(6)獲取分組存放位置的方法簡單,直接采用線性映射的方法完成;而非并行方法中,分組的存放位置由操作系統(tǒng)確定,進(jìn)行分組存放時(shí),必須運(yùn)行系統(tǒng)中的資源分配進(jìn)程,整個(gè)分組處理過程的效率大大降低。圖1A和1B圖解說明了傳統(tǒng)路由器中分組時(shí)延的產(chǎn)生,其中圖1A圖示了連續(xù)發(fā)送的兩個(gè)語音分組,而圖1B圖示了時(shí)延易造成語音分組的抖動(dòng);圖2A和2B圖解說明了傳統(tǒng)分組處理設(shè)備中分組的丟失,其中圖2A圖示了在某一時(shí)刻系統(tǒng)中的排隊(duì)分組,而圖2B圖示了系統(tǒng)中的分組因處理不及時(shí)被“淹沒”;圖3圖示了實(shí)現(xiàn)并行分組轉(zhuǎn)發(fā)的系統(tǒng)結(jié)構(gòu);圖4圖示了分組并行通過轉(zhuǎn)發(fā)引擎的邏輯視圖;圖5圖示了并行分組轉(zhuǎn)發(fā)的軟件體系結(jié)構(gòu);圖6圖示了空閑分組描述符隊(duì)列;圖7圖示了線程的狀態(tài)切換;圖8圖示了對(duì)發(fā)送線程進(jìn)行的發(fā)送調(diào)度;圖9圖示了基于郵箱的線程間通訊;圖10圖示了發(fā)送調(diào)度線程和發(fā)送線程之間的協(xié)調(diào)調(diào)度工作;圖11圖示了單個(gè)分組的處理過程;圖12圖示了并行度的擴(kuò)展。具體實(shí)施例方式下面參考附圖3至圖12詳細(xì)描述本發(fā)明的線速分組并行轉(zhuǎn)發(fā)方法和裝置。1.系統(tǒng)的體系結(jié)構(gòu)首先描述本發(fā)明所采用的系統(tǒng)的體系結(jié)構(gòu)。本發(fā)明的算法主要是基于圖3所示的網(wǎng)絡(luò)并行處理器。值得一提的是,本發(fā)明的分組并行轉(zhuǎn)發(fā)算法并不具有平臺(tái)依賴性(Platform-independent),稍作修改就可以移植到其它的網(wǎng)絡(luò)處理器上。為了討論的方便,文中的敘述以以太網(wǎng)為例。圖3圖示了實(shí)現(xiàn)并行分組轉(zhuǎn)發(fā)的系統(tǒng)結(jié)構(gòu)。圖3中,μP是實(shí)現(xiàn)分組并行轉(zhuǎn)發(fā)的微處理器(稱之為轉(zhuǎn)發(fā)引擎),多個(gè)微處理器上通過運(yùn)行多個(gè)發(fā)送和接收線程來實(shí)現(xiàn)分組的并行處理。與轉(zhuǎn)發(fā)引擎相連的SDRAM是實(shí)現(xiàn)存儲(chǔ)轉(zhuǎn)發(fā)的分組緩存,在SRAM中則駐留了為了實(shí)現(xiàn)高速分組查找的轉(zhuǎn)發(fā)表(forwardingtable)。本發(fā)明中作為示例采用了SDRAM和SRAM作為第一和第二存儲(chǔ)器,但是應(yīng)該明白,采用其它存儲(chǔ)器也可以實(shí)現(xiàn)本發(fā)明的技術(shù)方案。為了進(jìn)一步減少轉(zhuǎn)發(fā)操作的時(shí)間,用于存儲(chǔ)轉(zhuǎn)發(fā)表以及下文中將提到的分組描述符的第二存儲(chǔ)器的存取速度最好比用于存儲(chǔ)分組的第一存儲(chǔ)器快。主控CPU和μP之間提供了信令控制通道(ControlPath),當(dāng)轉(zhuǎn)發(fā)引擎收到協(xié)議分組,如OSPF、BGP報(bào)文的時(shí)候,通過該通道傳送到主控CPU,由主控CPU進(jìn)行相關(guān)的處理。以太網(wǎng)接口接收鏈路上的幀,送到接收FIFO(先入先出)(RFIFO)中,等待轉(zhuǎn)發(fā)引擎的進(jìn)一步轉(zhuǎn)發(fā)處理。分組經(jīng)由轉(zhuǎn)發(fā)引擎并行處理的邏輯視圖可參考圖4描述如下。其中,C表示分組的分類,F(xiàn)表示轉(zhuǎn)發(fā)引擎上多個(gè)線程并行地對(duì)分組進(jìn)行轉(zhuǎn)發(fā),S表示在接口上進(jìn)行分組的發(fā)送。數(shù)據(jù)總線(databus)可以根據(jù)具體的硬件配置進(jìn)行適配,如我們采用的POS-PHYL3數(shù)據(jù)總線,64位寬,設(shè)定32位用來接收數(shù)據(jù),32位用來發(fā)送數(shù)據(jù),接收和發(fā)送時(shí)鐘從60MHZ到104MHZ可配,在我們的系統(tǒng)設(shè)計(jì)原形中,我們選用了80MHZ的發(fā)送時(shí)鐘和接收時(shí)鐘??偩€上的RSOP、REOP和TSOP、TEOP是POS-PHYL3數(shù)據(jù)總線上分組開始和結(jié)束的信號(hào),前者是接收方向上的信號(hào),后者是發(fā)送方向上的信號(hào),考慮到文中的敘述容易辨別這兩對(duì)信號(hào),所以后面統(tǒng)稱為SOP和EOP。圖5是并行分組轉(zhuǎn)發(fā)的體系結(jié)構(gòu)。其中接收線程的運(yùn)行軌跡表明接收線程在進(jìn)行分組處理時(shí)要完成的主要任務(wù)。發(fā)送線程的運(yùn)行軌跡則表示發(fā)送線程在系統(tǒng)中要完成的發(fā)送任務(wù)。數(shù)據(jù)平面主要進(jìn)行分組的處理,通常稱之為快速通道。從數(shù)據(jù)平面到控制平面的路徑就是圖3中的控制通道(ControlPath),主要負(fù)責(zé)將控制分組從轉(zhuǎn)發(fā)平面發(fā)送到控制平面,并由控制平面進(jìn)行相應(yīng)的處理。2.數(shù)據(jù)結(jié)構(gòu)接下來,描述本發(fā)明所采用的數(shù)據(jù)結(jié)構(gòu)。分組在系統(tǒng)中被分割成大小相等的數(shù)據(jù)塊(cell),每塊的大小為64字節(jié)。不足64字節(jié)的塊稱為殘塊。在存儲(chǔ)轉(zhuǎn)發(fā)機(jī)制中,轉(zhuǎn)發(fā)引擎在將分組發(fā)往出端口之前,分組必須在系統(tǒng)中暫存。為了提高系統(tǒng)的轉(zhuǎn)發(fā)性能,需要迅速地確定分組的存放位置,在訪問完轉(zhuǎn)發(fā)表并進(jìn)行IP頭的修改之后,又必須快速的提取該分組,按照查找的結(jié)果進(jìn)行發(fā)送。文獻(xiàn)“SundarIyer,AmrAwadallah,andNickMcKeown,Analysisofapacketswitchwithmemoriesrunningslowerthantheline-rate(有關(guān)使用運(yùn)行速度低于線路速度的存儲(chǔ)器的分組交換的分析),IEEE/ACMTransactionsonNetworking(TON),volumell,Issue(2),2003.4”的研究顯示,存儲(chǔ)器的存取速度會(huì)直接影響到系統(tǒng)的轉(zhuǎn)發(fā)效率。所以為了提高轉(zhuǎn)發(fā)性能,必須減少存儲(chǔ)器的訪問次數(shù),特別是SDRAM的訪問。為達(dá)到這一目的,我們定義了分組描述符,作為分組的索引,將其存放在SRAM中。分組描述符的數(shù)據(jù)結(jié)構(gòu)如下structpkt_descriptor{unsignedintport7;/*入端口號(hào)*/unsignedintnotused1;/*未使用*/unsignedintsop1;/*分組起始(startofpackets)*/unsignedinteop1;/*分組結(jié)束(endofpackets)*/unsignedintnum_of_bytes6;/*字節(jié)數(shù)*/unsignedintnum_of_cell6;/*cell字節(jié)數(shù)*/unsignedintres10;/*保留*/structpkt_descriptor*p_dsc;/*指向下一個(gè)包描述符的指針*/}對(duì)于每一個(gè)分組,均有一個(gè)分組描述符進(jìn)行表述,以反映其基本情況,分組描述符的num_of_cell和num_of_bytes定義了分組的大小,為(num_of_cell×64+num_of_bytes)字節(jié)。同一個(gè)分組的所有數(shù)據(jù)塊(包括殘塊)按照固定的順序存放在一起。SOP被置位,表示數(shù)據(jù)塊是分組的第一個(gè)數(shù)據(jù)塊,EOP被置位表示數(shù)據(jù)塊是分組的最后一個(gè)數(shù)據(jù)塊(或殘塊)。系統(tǒng)在初始化的時(shí)候,所有尚未用于描述分組的空閑分組描述符通過指針鏈接在一起,形成一個(gè)隊(duì)列,如圖6所示。圖6圖示了空閑分組描述符隊(duì)列,其中Header是隊(duì)列頭指針,而Tailor是隊(duì)列尾指針。分組描述符pkt_dsc在SRAM中的存儲(chǔ)地址和分組在SDRAM中的存放地址pkt_buffer之間存在映射關(guān)系。映射函數(shù)f定義為pkt_buffer=f(pkt_dsc),考慮到映射函數(shù)的效率,通常將其定義為線性函數(shù),使映射過程能在有限的機(jī)器周期內(nèi)完成,如pkt_buffer=((pkt_dsc-sram_descriptor_base)<<bufsize_factor)+sdram_base其中,bufsize_factor為分組的大小因子,在實(shí)現(xiàn)中我們將每個(gè)分組的緩存大小定義為2K。sram_descriptor_base是描述符在SRAM中的基地址,而sdram_base是SDRAM中的基地址。通過將分組描述符在SRAM中的相對(duì)地址移位適當(dāng)?shù)姆纸M大小因子bufsize_factor次,獲得分組SDRAM中的相對(duì)地址,加上SDRAM中的基地址就是分組在SDRAM中的絕對(duì)地址。由于上述的映射函數(shù)是線性函數(shù),所以具有較高的轉(zhuǎn)換效率,能在有限的機(jī)器指令周期內(nèi)完成,通過分組描述符的地址來定位分組在SDRAM中的存放位置。值得一提的是,分組描述符的地址空間在SRAM中,這樣安排的目的主要是由于系統(tǒng)會(huì)對(duì)分組描述符訪問的次數(shù)較多,而SRAM的存取速度較快,在我們的實(shí)現(xiàn)中,SRAM與SDRAM的速度相差幾倍以上。除了分組描述符隊(duì)列外,還為每個(gè)端口均形成了8個(gè)由分組描述符組成的發(fā)送隊(duì)列,分別對(duì)應(yīng)于8個(gè)不同的優(yōu)先級(jí)。通過上面定義的映射關(guān)系,在完成轉(zhuǎn)發(fā)表的查找后,發(fā)送線程能根據(jù)分組描述符很快地定位到分組存放的位置,將其從發(fā)送端口發(fā)送出去。在接收分組時(shí),從空閑分組描述符隊(duì)列中取出一個(gè)分組描述符,將分組存放到該分組描述符所對(duì)應(yīng)的存放地址,并根據(jù)所接收的分組的狀況,填寫該分組描述符,并在分組接收結(jié)束時(shí),將修改后的分組描述符插入到對(duì)應(yīng)的發(fā)送隊(duì)列中。在發(fā)送分組時(shí),從發(fā)送隊(duì)列中取出一個(gè)分組描述符,相應(yīng)地發(fā)送其所對(duì)應(yīng)的分組,并在發(fā)送成功之后,將分組描述符回收到空閑分組描述符隊(duì)列中。需要注意的是,將分組描述符從隊(duì)列中“取出”或“插入”隊(duì)列中的操作并不意味著改變分組描述符在SRAM中實(shí)際存儲(chǔ)位置,而只是改變其在隊(duì)列中指針指向關(guān)系。3.并行轉(zhuǎn)發(fā)處理下面詳細(xì)描述轉(zhuǎn)發(fā)引擎上的線程并行轉(zhuǎn)發(fā)分組的處理。在轉(zhuǎn)發(fā)引擎中,使用接收線程將分組從端口的RFIFO中接收到網(wǎng)絡(luò)處理器內(nèi)進(jìn)行處理,而使用發(fā)送線程將分組從SDRAM中拷貝到TFIFO中。轉(zhuǎn)發(fā)引擎上的線程有三種狀態(tài),運(yùn)行(executing)、休眠(sleeping)和就緒(ready)。為了達(dá)到實(shí)時(shí)分組處理的要求,線程間采用的是非搶占性的調(diào)度方式。正在執(zhí)行的線程因等待I/O執(zhí)行完成或收到上下文換出信號(hào)時(shí)進(jìn)入休眠狀態(tài),當(dāng)I/O執(zhí)行完成或收到上下文換入時(shí)則轉(zhuǎn)入就緒狀態(tài)。引擎空閑時(shí),調(diào)度線程將處于就緒狀態(tài)的某個(gè)線程進(jìn)行調(diào)度,轉(zhuǎn)為運(yùn)行狀態(tài),如圖7所示。圖7圖示了線程的狀態(tài)切換。通常轉(zhuǎn)發(fā)引擎上的每個(gè)線程均有自己的上下文寄存器,可以實(shí)現(xiàn)零開銷的上下文切換。調(diào)度線程的調(diào)度有兩種,一是接收線程的調(diào)度,它喚醒接收線程,接收狀態(tài)機(jī)在相應(yīng)端口的RFIFO中接受分組,接收線程則將分組傳送到分組緩存中進(jìn)行處理,并等待轉(zhuǎn)發(fā);二是發(fā)送線程的調(diào)度,它喚醒發(fā)送線程,將分組從計(jì)算出的分組緩存中移出到出端口的TFIFO中,等待發(fā)送。圖3所示的網(wǎng)絡(luò)處理器中具有多個(gè)轉(zhuǎn)發(fā)引擎,轉(zhuǎn)發(fā)引擎并行工作,進(jìn)行分組的處理。而每個(gè)轉(zhuǎn)發(fā)引擎上并發(fā)運(yùn)行著多個(gè)接收線程或發(fā)送線程,這些線程在調(diào)度線程的統(tǒng)一調(diào)度下,進(jìn)行分組的存儲(chǔ)轉(zhuǎn)發(fā)。基于實(shí)現(xiàn)上的考慮,調(diào)度線程分為兩部分,即接收調(diào)度(接收調(diào)度線程)和發(fā)送調(diào)度(發(fā)送調(diào)度線程)。調(diào)度線程本身也要占用μP時(shí)間片和相應(yīng)的資源,因此,提高調(diào)度的效率和合理安排線程運(yùn)行的時(shí)間片對(duì)提高系統(tǒng)的吞吐量至關(guān)重要。在轉(zhuǎn)發(fā)引擎中,這些線程并行地對(duì)多個(gè)分組進(jìn)行轉(zhuǎn)發(fā)處理。而就一個(gè)分組的轉(zhuǎn)發(fā)處理而言,包括以下幾個(gè)步驟。首先,響應(yīng)分組的到達(dá),接收調(diào)度線程喚醒接收線程。接下來,接收線程將分組接收到SDRAM中。然后,發(fā)送調(diào)度線程向發(fā)送線程分配發(fā)送任務(wù)。最后,發(fā)送線程將分組從SDRAM拷貝到TFIFO中。下面以接收調(diào)度線程、接收線程、發(fā)送調(diào)度線程、發(fā)送線程的順序依次描述這幾個(gè)線程的處理。需要注意的是,這些線程在轉(zhuǎn)發(fā)引擎中實(shí)際上是并行執(zhí)行的。3.1接收調(diào)度線程接收調(diào)度線程輪詢32位的接收控制寄存器Rev_control,當(dāng)寄存器Rev_control中有相應(yīng)的位被置位時(shí),表示對(duì)應(yīng)的端口有分組到達(dá)。接收調(diào)度線程就進(jìn)行調(diào)度,喚醒一個(gè)接收線程,向其分配接收任務(wù),同時(shí)將接收控制寄存器中對(duì)應(yīng)的位清零,以便清除已經(jīng)調(diào)度了的接收請(qǐng)求??梢詾槊總€(gè)入端口提供對(duì)應(yīng)的接收線程,當(dāng)該入端口有分組到達(dá)時(shí),如果其所對(duì)應(yīng)的接收線程當(dāng)前在休眠的話,就直接將其喚醒。接收線程與入端口也可以不對(duì)應(yīng),當(dāng)有分組到達(dá)時(shí),就尋找一個(gè)休眠的線程,并將其喚醒。其調(diào)度算法如算法1所示。算法1接收調(diào)度算法系統(tǒng)初始化;while(1)讀Rev_control到rec_task中;for(j=0;j<32,j++){if(rec_task&&(1<<j))thread_lock;/*實(shí)現(xiàn)調(diào)度過程中線程的原子切換*/clearbitjinRev_control;/*清除已經(jīng)調(diào)度了的接收請(qǐng)求*/signalrec_thread[j];/*喚醒接收線程*/thread_unlock;context_swap;/*上下文切換,接收線程開始工作*/endif}/*endfor*/}/*endwhile*/3.2接收線程(receiving_thread)接收線程主要完成從端口的RFIFO中將分組接收到網(wǎng)絡(luò)處理器內(nèi)進(jìn)行處理。接收線程由接收調(diào)度線程喚醒,表明某個(gè)物理端口有分組到達(dá)。接收線程被喚醒后首先使一個(gè)分組描述符出列,提供給該分組,計(jì)算該分組描述符對(duì)應(yīng)的分組存放地址pkt_buffer,并向接收狀態(tài)機(jī)發(fā)送一個(gè)接收請(qǐng)求,然后繼續(xù)休眠,等待接收狀態(tài)機(jī)的回應(yīng)。接收狀態(tài)機(jī)的回應(yīng)再次喚醒接收線程,使之開始進(jìn)行分組的接收處理。接收線程從指定的RFIFO單元讀取數(shù)據(jù)塊存放到SDRAM中。若是IP分組,就同時(shí)進(jìn)行解析,查轉(zhuǎn)發(fā)表,找到輸出端口號(hào),并將分組描述符在相應(yīng)的出端口的輸出隊(duì)列中排隊(duì)。若不是IP分組,則把分組送到主控CPU上,由主控CPU進(jìn)行處理。在接收IP分組的同時(shí),修改分組描述符中包的字節(jié)數(shù)等內(nèi)容,以反映分組的狀況,并根據(jù)查找轉(zhuǎn)發(fā)表的結(jié)果將分組描述符插入到相應(yīng)出端口相應(yīng)優(yōu)先級(jí)的發(fā)送隊(duì)列中。在上述各步驟完成之后,IP分組的接收處理就已經(jīng)完成。接收線程的算法用算法2描述如下。算法2接收算法初始化信號(hào)量,寄存器初始化;while(1){sleep;/*等待被接收調(diào)度線程喚醒*/使一個(gè)分組描述符(packetdescriptor)出列(dequeue),計(jì)算該packetdescriptor對(duì)應(yīng)的pkt_buffer;發(fā)送接收請(qǐng)求;/*與接收狀態(tài)機(jī)進(jìn)行分組接收的交互*/sleep;/*切換出處理器,等待被接收狀態(tài)機(jī)喚醒*/檢查寄存器接收狀態(tài)(rec_state),如果出錯(cuò),就進(jìn)行出錯(cuò)處理;if(notSOPandnotEOP)更新packet_descripter中分組的字節(jié)數(shù),并把RFIFO中的數(shù)據(jù)塊寫到分組緩沖(packet_buffer)中的相應(yīng)位置;elifsop則進(jìn)行分組的處理提取IP報(bào)頭(header);驗(yàn)證IPheader的正確性;出錯(cuò),則丟棄;進(jìn)行IPheader的修正處理,如減TTL,重新計(jì)算分組頭校驗(yàn)和等;提取目的IP;查找轉(zhuǎn)發(fā)表,確定分組的出端口,并提取出端口的MAC地址;修改以太網(wǎng)幀的源MAC和目的MAC,重新進(jìn)行以太網(wǎng)幀的封裝;將新的分組頭(含以太網(wǎng)幀頭)寫回packet_buffer;endif/*endifof(notSOPandnotEOP)*/ifEOPif(notdiscarded)修改packetdescripter中包的字節(jié)數(shù);根據(jù)查找轉(zhuǎn)發(fā)表的結(jié)果將packetdescripter插入到相應(yīng)優(yōu)先級(jí)的發(fā)送隊(duì)列;else丟棄處理;endifendif/*endifofEOP*/}/*endofwhile*/3.3發(fā)送調(diào)度線程發(fā)送調(diào)度線程依次從低到高輪詢發(fā)送向量寄存器XMIT_VECTOR,該向量寄存器由接收線程設(shè)置,其中的某一位置位表示對(duì)應(yīng)端口的發(fā)送隊(duì)列非空。如果發(fā)送調(diào)度線程輪詢到XMIT_VECTOR中的某一位置位,則喚醒一個(gè)發(fā)送線程,并為其分配一個(gè)發(fā)送任務(wù),指明要發(fā)送的端口,然后繼續(xù)輪詢。如果輪詢到下一位為零,則為下一個(gè)發(fā)送線程分配空任務(wù),依次反復(fù)。圖8是發(fā)送調(diào)度線程thd0通過發(fā)送信號(hào)1、2、3給發(fā)送線程thd1、thd2、thd3輪流分配發(fā)送任務(wù)的示意圖。如圖8所示,當(dāng)系統(tǒng)中有發(fā)送請(qǐng)求時(shí),發(fā)送調(diào)度線程就向輪到接收發(fā)送任務(wù)的發(fā)送線程發(fā)送喚醒信號(hào),使之就緒,并占領(lǐng)引擎資源開始運(yùn)行。相應(yīng)的算法如下。算法3發(fā)送調(diào)度算法常量定義;硬件寄存器初始化;初始化三個(gè)發(fā)送線程;while(1){輪詢發(fā)送向量寄存器XMIT_VECTOR第(i++mod32)位;if對(duì)應(yīng)位為1向(j++modnum_of_XMIT_thd)號(hào)發(fā)送線程分配一個(gè)發(fā)送任務(wù);喚醒該發(fā)送線程;/*j為發(fā)送任務(wù)計(jì)數(shù),循環(huán)分配給線程,num_of_XMIT_thd為發(fā)送線程的數(shù)目*/else向(j++modnum_of_XMIT_thd)號(hào)發(fā)送線程分配一個(gè)空任務(wù);喚醒該發(fā)送線程;/*j為發(fā)送任務(wù)計(jì)數(shù),循環(huán)分配給線程,num_of_XMIT_thd為發(fā)送線程的數(shù)目*/context_swap;......}3.4發(fā)送線程(transmitting_thread)發(fā)送線程主要是以數(shù)據(jù)塊為單位,將數(shù)據(jù)塊從SDRAM中拷貝到TFIFO中。當(dāng)數(shù)據(jù)塊拷貝完畢,就發(fā)送相應(yīng)的發(fā)送控制字,指示發(fā)送狀態(tài)機(jī)進(jìn)行發(fā)送。當(dāng)發(fā)送調(diào)度線程為發(fā)送線程分配了發(fā)送任務(wù)時(shí),發(fā)送線程從發(fā)送隊(duì)列中取出一個(gè)分組描述符并更新分組描述符隊(duì)列結(jié)構(gòu),確定該分組描述符所對(duì)應(yīng)的SDRAM中的分組存放位置,并將SDRAM中與該分組描述符對(duì)應(yīng)的存放地址暫存的分組拷貝到TFIFO中,同時(shí)修改該分組描述符中的長度計(jì)數(shù),在發(fā)送結(jié)束后,回收一個(gè)分組描述符到空閑分組描述符隊(duì)列中。發(fā)送線程的發(fā)送算法用算法4描述如下。算法4發(fā)送算法常量定義,相關(guān)寄存器初始化;while(1){等待發(fā)送任務(wù)并為該任務(wù)設(shè)置輸出隊(duì)列(outputqueue),TFIFO單元(element)等信息;ifSOP從發(fā)送隊(duì)列中取一個(gè)分組描述符并更新分組描述符隊(duì)列結(jié)構(gòu);ifEOP/*SOPandEOP*/將最后一個(gè)cell傳送到TFIFOelement中;設(shè)置發(fā)送狀態(tài)控制字;等待目標(biāo)端口準(zhǔn)備好,使目標(biāo)TFIFOelement有效;if發(fā)送成功回收一個(gè)分組描述符到空閑分組描述符隊(duì)列中;else保存端口信息,下次重發(fā);endifelse/*SOPbutnotEOP*/將數(shù)據(jù)寫到TFIFOelement中,設(shè)置發(fā)送狀態(tài)控制字;等待目標(biāo)端口準(zhǔn)備好,使目標(biāo)TFIFOelement有效;if發(fā)送成功更新發(fā)送相關(guān)信息,為發(fā)送下一個(gè)數(shù)據(jù)塊作準(zhǔn)備;else保存剩余的element數(shù),狀態(tài)字節(jié)以及buffer偏移量;endifendif/*SOPbutnotEOP*/else/*notSOP*/ifEOP/*notSOPbutEOP*/將最后一個(gè)cell傳送到TFIFOelement中;設(shè)置發(fā)送狀態(tài)控制字;等待目標(biāo)端口準(zhǔn)備好,使目標(biāo)TFIFOelement有效;if發(fā)送成功回收一個(gè)分組描述符到空閑分組描述符隊(duì)列中;更新端口信息;endifelse/*notSOPandnotEOP*/將數(shù)據(jù)傳送到TFIFOelement中;設(shè)置發(fā)送狀態(tài)控制字;等待目標(biāo)端口準(zhǔn)備好,使目標(biāo)TFIFOelement有效;if發(fā)送成功更新端口信息;endifendif/*notSOPandnotEOP*/endif/*endofSOP*/}/*endofwhile*/上面描述了接收調(diào)度線程、接收線程、發(fā)送調(diào)度、發(fā)送線程借助于分組描述符對(duì)分組進(jìn)行并行轉(zhuǎn)發(fā)的處理方法。從上面的分析可以看出,接收調(diào)度和發(fā)送調(diào)度的設(shè)計(jì)都很簡潔。這樣處理的主要目的是讓調(diào)度過程盡可能的簡單,較少地占用引擎資源,使引擎上運(yùn)行的接收和發(fā)送線程有足夠的處理機(jī)時(shí)間來進(jìn)行分組的接收和發(fā)送,從而提高系統(tǒng)的吞吐量(throughput),減少分組的轉(zhuǎn)發(fā)時(shí)延。需要注意的是,這里所給出的算法1-4只是作為例子來說明本發(fā)明的實(shí)施例,而不是用于限制本發(fā)明。本領(lǐng)域一般技術(shù)人員完全可以對(duì)本文中所描述的調(diào)度線程、接收線程、發(fā)送調(diào)度、發(fā)送線程的處理做出各種修改和替換。這樣的修改和替換同樣落在本發(fā)明的范圍之內(nèi)。4.線速分組并行轉(zhuǎn)發(fā)裝置上文中描述的線速分組并行轉(zhuǎn)發(fā)方法可以通過,例如,下文中描述的線速分組并行轉(zhuǎn)發(fā)裝置來執(zhí)行。該分組轉(zhuǎn)發(fā)裝置具有相互分離的控制平面和轉(zhuǎn)發(fā)平面??刂破矫嬗糜谶M(jìn)行系統(tǒng)控制操作,而轉(zhuǎn)發(fā)平面用于進(jìn)行分組轉(zhuǎn)發(fā)操作。轉(zhuǎn)發(fā)平面包括至少兩個(gè)轉(zhuǎn)發(fā)引擎。轉(zhuǎn)發(fā)引擎包括接收線程處理單元,用于產(chǎn)生至少一個(gè)接收線程,所述接收線程用于從所述入端口接收分組;發(fā)送線程處理單元,用于產(chǎn)生至少一個(gè)發(fā)送線程,所述發(fā)送線程用于將所接收到的分組并行發(fā)送到出端口;接收調(diào)度線程處理單元,用于產(chǎn)生接收調(diào)度線程,以在有分組到達(dá)入端口時(shí),向?qū)?yīng)的接收線程分配接收任務(wù);以及發(fā)送調(diào)度線程處理單元,用于產(chǎn)生發(fā)送調(diào)度線程,以在接收所述分組之后,向所述至少一個(gè)發(fā)送線程分配發(fā)送任務(wù)。該分組轉(zhuǎn)發(fā)裝置通過線程分配裝置,將所述接收調(diào)度線程以及所述至少一個(gè)接收線程分配在某一個(gè)引擎上,并將所述發(fā)送調(diào)度線程以及所述至少一個(gè)發(fā)送線程分配在另一個(gè)引擎上。響應(yīng)接收線程的指令,用于產(chǎn)生描述所接收到的分組的分組描述符的裝置根據(jù)該分組填寫分組描述符。響應(yīng)接收線程的指令,用于將描述要由同一個(gè)端口發(fā)送的分組的分組描述符排成發(fā)送隊(duì)列的裝置將該分組描述符插入發(fā)送隊(duì)列中。用于檢測發(fā)送隊(duì)列是否為空的裝置響應(yīng)發(fā)送調(diào)度線程的指令進(jìn)行其操作。而用于在發(fā)送隊(duì)列非空時(shí),從發(fā)送隊(duì)列中取出分組描述符,以便向出端口發(fā)送所述分組描述符所描述的分組的裝置響應(yīng)發(fā)送線程的指令進(jìn)行其操作。使用第一存儲(chǔ)器(SDRAM)在將分組發(fā)送到出端口之前暫存所述分組。在第二存儲(chǔ)器(SRAM)中存儲(chǔ)至少一個(gè)分組描述符,用于描述接收到的分組,所述分組描述符與所述分組在第一存儲(chǔ)器中的暫存位置對(duì)應(yīng),本實(shí)施例中,兩者存在線性映射關(guān)系。相應(yīng)地為該分組轉(zhuǎn)發(fā)裝置提供一個(gè)裝置,以在向出端口發(fā)送所述分組時(shí),使用分組描述符確定所述分組在第一存儲(chǔ)器中的暫存位置。該分組轉(zhuǎn)發(fā)裝置具有用于使尚未用于描述分組的至少一個(gè)空閑分組描述符形成空閑分組描述符隊(duì)列的裝置;用于形成發(fā)送隊(duì)列的裝置,所述發(fā)送隊(duì)列由用于描述分組的分組描述符組成。所述用于形成發(fā)送隊(duì)列的裝置為所述至少一個(gè)入端口中的每一個(gè)提供了至少一個(gè)發(fā)送隊(duì)列,各個(gè)發(fā)送隊(duì)列具有不同的優(yōu)先級(jí)。該分組轉(zhuǎn)發(fā)裝置中還提供了用于在從入端口接收到分組之后,從所述空閑分組描述符隊(duì)列中取出一個(gè)分組描述符,并更新所述空閑分組描述符隊(duì)列的結(jié)構(gòu)的裝置;用于將所述分組暫存到所述第一存儲(chǔ)器中與用來對(duì)所述分組進(jìn)行描述的分組描述符相對(duì)應(yīng)的暫存地址的裝置;用于修改所取出的分組描述符,以描述所述分組的裝置;以及用于將修改后的分組描述符插入到發(fā)送隊(duì)列中的裝置。這些裝置都響應(yīng)接收線程的指令執(zhí)行其操作。該分組轉(zhuǎn)發(fā)裝置中還提供了用于在所述發(fā)送隊(duì)列非空時(shí),從發(fā)送隊(duì)列中取出一個(gè)分組描述符,并更新發(fā)送隊(duì)列的結(jié)構(gòu)的裝置;以及用于在成功地發(fā)送了所取出的分組描述符所描述的分組之后,將所述分組描述符回收到所述空閑分組描述符隊(duì)列中的裝置。這些裝置都響應(yīng)發(fā)送線程的指令執(zhí)行其操作。5.線程間的通訊引擎上的不同線程可以通過消息的方式進(jìn)行彼此間的通訊。如,接收線程完成數(shù)據(jù)分組的處理之后,可以進(jìn)入休眠狀態(tài),等待調(diào)度線程喚醒發(fā)送線程來完成分組的發(fā)送。它也可以通過寫消息的方式,告知發(fā)送線程相關(guān)的發(fā)送事件,當(dāng)發(fā)送線程被喚醒時(shí),從郵箱(mailbox)中取出消息,進(jìn)行相應(yīng)的處理。存放消息的數(shù)據(jù)結(jié)構(gòu)稱之為郵箱,系統(tǒng)中所有的線程可以通過互斥的方式對(duì)郵箱進(jìn)行訪問。當(dāng)郵箱中有多個(gè)消息事件時(shí),就形成了基于郵箱的消息隊(duì)列,如圖9所示。圖9圖示了基于郵箱的線程間通訊。消息分成消息頭和消息體,消息頭中指明了發(fā)送線程和接收線程的線程號(hào),而消息體則表明了具體的消息事件。也就是說,在本發(fā)明的線速并行分組轉(zhuǎn)發(fā)裝置中,可以提供線程間通信裝置,其形成上述消息隊(duì)列。線程間通信裝置響應(yīng)接收線程的指令,向消息隊(duì)列寫入用于告知相關(guān)的發(fā)送事件的消息,并由發(fā)送線程讀取。6.多個(gè)μP間的并行性和同一個(gè)μP上多個(gè)線程的并發(fā)性在實(shí)現(xiàn)的時(shí)候,必須充分地考慮到系統(tǒng)的開銷。進(jìn)行跨引擎的線程調(diào)度在實(shí)現(xiàn)上是可行的,但造成系統(tǒng)的延時(shí)卻是不可預(yù)知。因此,采用靜態(tài)的方法進(jìn)行線程的引擎調(diào)度,雖然會(huì)使系統(tǒng)缺乏靈活性,但可以減少系統(tǒng)在調(diào)度過程中的開銷,至少系統(tǒng)不必花大量的時(shí)間來收集當(dāng)前多個(gè)引擎的運(yùn)行狀態(tài)。因此,在進(jìn)行引擎上的線程分配時(shí),采用先分類再分配的靜態(tài)分配方式,即將接收線程(包括接收調(diào)度線程)分配到相同的引擎上,而將發(fā)送線程(包括發(fā)送調(diào)度線程)分配到相同的引擎上。在上述的調(diào)度算法中,體現(xiàn)了這一分配原則。另外,由于接收任務(wù)相對(duì)于發(fā)送任務(wù)來說要復(fù)雜,所以接收線程與發(fā)送線程的數(shù)目之比也直接影響到系統(tǒng)的吞吐量。經(jīng)過多次實(shí)驗(yàn),我們發(fā)現(xiàn),當(dāng)接收線程與發(fā)送線程的比例為2∶1時(shí),發(fā)送與接收的配合最為協(xié)調(diào),系統(tǒng)獲得的吞吐量最大,分組轉(zhuǎn)發(fā)時(shí)延最小。圖10是這一引擎分配原則下,發(fā)送線程的并發(fā)示意圖。圖中,調(diào)度線程T0喚醒T1,進(jìn)行分組P0發(fā)送任務(wù)的處理;假設(shè)這是P1發(fā)送任務(wù)已經(jīng)到達(dá),T2就被喚醒,執(zhí)行發(fā)送任務(wù)P1,從而通過并發(fā)的方式完成系統(tǒng)中分組的發(fā)送。圖11中描述了分組在系統(tǒng)中的處理過程。其中的接收狀態(tài)機(jī)將分組從鏈路上收入到RFIFO中,發(fā)送狀態(tài)機(jī)則將分組發(fā)送到與出端口相連的鏈路上??梢钥闯?,分組從進(jìn)入系統(tǒng)開始,分成幾個(gè)不同的處理階段。就單個(gè)分組而言,這幾個(gè)過程是串行執(zhí)行的,但從多個(gè)分組的角度看,分組之間的處理是并行的。圖中Δt1和Δt3是訪問存儲(chǔ)器引起的延遲,Δt2則是由于接收線程進(jìn)行分組的處理如解析分組頭、查找轉(zhuǎn)發(fā)表等引起的延遲。S0、S1、S2、S3則分別表示整個(gè)分組轉(zhuǎn)發(fā)的四個(gè)處理過程。其中響應(yīng)接收信號(hào)Rcv_signal開始接收處理S1,而響應(yīng)發(fā)送信號(hào)Xmit_signal開始發(fā)送處理S2。7.采用本發(fā)明的效果性能分析。網(wǎng)絡(luò)性能的評(píng)價(jià)通常是用一些具體的參數(shù)值來進(jìn)行度量的。網(wǎng)絡(luò)帶寬、時(shí)延、吞吐率、及丟包率是進(jìn)行網(wǎng)絡(luò)性能評(píng)價(jià)的幾個(gè)主要參數(shù),也是檢驗(yàn)并行分組轉(zhuǎn)發(fā)算法的重要依據(jù)。在我們的測試平臺(tái)中,主控CPU及轉(zhuǎn)發(fā)引擎的時(shí)鐘頻率均為200M,SRAM和SDRAM總線的時(shí)鐘頻率均為100M,數(shù)據(jù)總線為64位的POS_PHYL3總線,時(shí)鐘為80M。2001年,武漢烽火網(wǎng)絡(luò)公司進(jìn)行了文中算法的實(shí)現(xiàn),并推出了F-engine系列交換和路由設(shè)備。表1-表3是用測試儀表SmartBits測出的性能參數(shù)。表1.10/100M以太網(wǎng)并行分組轉(zhuǎn)發(fā)帶寬/吞吐量的性能測試表2.10/100M以太網(wǎng)并行分組轉(zhuǎn)發(fā)丟包率測試表3.10/100M以太網(wǎng)并行分組轉(zhuǎn)發(fā)的網(wǎng)絡(luò)時(shí)延測試根據(jù)上表測試所得到的參數(shù),我們可以進(jìn)行兩方面的討論。7.1吞吐量分析。整個(gè)系統(tǒng)的測試結(jié)果表明,線程間的并發(fā)和引擎間的并行分組處理,使系統(tǒng)獲得了較好的轉(zhuǎn)發(fā)性能,每個(gè)端口均達(dá)到了線速處理分組能力,時(shí)延小,分組丟失率為0。按照我國《高端路由器的測試規(guī)范》,該系統(tǒng)的算法設(shè)計(jì)和實(shí)現(xiàn)均是成功的。如果以吞吐量作為性能指標(biāo),我們可以算出這種線程間并發(fā)、引擎間并行的分組處理,使整個(gè)系統(tǒng)獲得的性能加速比。我們同時(shí)測定,非并行分組處理(單線程單引擎對(duì)單端口進(jìn)行轉(zhuǎn)發(fā))時(shí),其吞吐量的值如表4所示。表4.單端口單引擎單線程時(shí)系統(tǒng)的吞吐量注上表中單線程的吞吐量測試是在過100M的鏈路上進(jìn)行的表1-表3中的值是在16端口的情況下單端口的吞吐量。就吞吐量而言,我們定義系統(tǒng)的性能加速比為其中,下標(biāo)L表示分組的長度。因此,不同包長的情況下,系統(tǒng)獲得的加速比為a64=148810×16734375=3.24;a128=84459×16419921=3.21;]]>a256=45290×16234375=3.09;a521=23496×16122953=3.06;]]>a1024=11973×1663016=3.04;a1518=8127×1642819=3.03;]]>從中可以看出,采用多引擎并發(fā)式的并行分組處理可以提高系統(tǒng)的處理能力。我們的實(shí)現(xiàn)中采用的是六引擎并行分組轉(zhuǎn)發(fā)方式,從理論上分析,系統(tǒng)應(yīng)該獲得加速比為6的并行處理能力,但基于下列的一些制約因素,致使系統(tǒng)的性能維持在3以上。(1)上述設(shè)計(jì)中引入了必不可少的線程調(diào)度,會(huì)占用引擎處理機(jī)時(shí)間,I/O操作的時(shí)間往往也較長,因此,當(dāng)線程進(jìn)行I/O操作時(shí),通常立刻進(jìn)行線程的切換;操作完成后再進(jìn)行喚醒并調(diào)度;(2)由于線程間是并行工作的,但使用的系統(tǒng)資源并不是彼此分離的,對(duì)許多資源的訪問必須采用互斥的方式進(jìn)行,如對(duì)分組描述符的訪問就必須互斥進(jìn)行,導(dǎo)致某些線程在對(duì)公共資源的訪問時(shí)出現(xiàn)互斥等待的現(xiàn)象發(fā)生,從而較低了系統(tǒng)的吞吐量;(3)對(duì)存儲(chǔ)器的訪問也是一個(gè)重要的制約因素。隨著系統(tǒng)的吞吐量增加,存儲(chǔ)器的制約因素就更加明顯;并成為提高系統(tǒng)瓶頸的主要因素;(4)從64字節(jié)的分組到1518字節(jié)的分組中,我們可以看出,系統(tǒng)的加速必呈現(xiàn)出減小的趨勢,主要原因是,雖然分組數(shù)目的增加,導(dǎo)致分組頭的處理時(shí)間加長,但相比之下小的分組存取時(shí)間短,因而性能更優(yōu)。(5)線程間的通訊也會(huì)占用參與通訊的引擎的處理機(jī)的時(shí)間,導(dǎo)致它們的工作在一段時(shí)間內(nèi)與分組的收發(fā)無關(guān),降低了系統(tǒng)的吞吐量。7.2性能上的擴(kuò)展。文中所介紹的并行分組處理,可以實(shí)現(xiàn)100M、16個(gè)端口的全線速轉(zhuǎn)發(fā)。但在大規(guī)模的組網(wǎng)應(yīng)用上,存在端口密度不夠的情形。但我們可以進(jìn)一步進(jìn)行并行分組處理的擴(kuò)展,在系統(tǒng)結(jié)構(gòu)上采用交叉背板(SwitchFabric)相連,文中所述的測試平臺(tái)作為分組處理線卡的方式進(jìn)行拓展,即采用分布并行的方式,使系統(tǒng)的并行處理能力進(jìn)一步加強(qiáng),如圖12所示。圖12圖示了并行度的擴(kuò)展。圖中所示的擴(kuò)展規(guī)模(即線卡數(shù))受交叉背板容量的制約,擴(kuò)展的設(shè)備可以用在網(wǎng)絡(luò)核心層上。也就是說,可以采用交叉背板將多個(gè)根據(jù)本發(fā)明的分組轉(zhuǎn)發(fā)裝置連接在一起,以作為擴(kuò)展分組轉(zhuǎn)發(fā)裝置使用。7.3與非并行處理的對(duì)照相對(duì)于非并行分組處理,吞吐量大、時(shí)延小、無抖動(dòng)是本方法中并行分組處理的主要特征。最為主要的是,系統(tǒng)通過并行處理獲得了線速分組處理的能力。不論分組的大小,時(shí)延均較小,最大平均時(shí)延與最小平均時(shí)延之差不足6μS,而且在滿線速的情況下,分組丟失率為0。另外,簡化調(diào)度機(jī)制,提高分組的處理能力,也是本方法的重要特征。8.總結(jié)分組轉(zhuǎn)發(fā)是構(gòu)建Internet網(wǎng)絡(luò)的核心技術(shù)。本文首先分析了傳統(tǒng)的分組處理方式的弊端,然后提出了一個(gè)并行的分組轉(zhuǎn)發(fā)方法。文中就分組轉(zhuǎn)發(fā)涉及到的數(shù)據(jù)結(jié)構(gòu)進(jìn)行了介紹,并就發(fā)送和接收分組的具體實(shí)現(xiàn)算法進(jìn)行了詳細(xì)的描述。著重闡述了多個(gè)轉(zhuǎn)發(fā)引擎間的并行工作行為和單個(gè)引擎上的并發(fā)工作模式。線程調(diào)度是提高系統(tǒng)性能的關(guān)鍵,文中就發(fā)送和接收調(diào)度也作了詳細(xì)的介紹。最后討論了在該并行轉(zhuǎn)發(fā)方法的基礎(chǔ)上,設(shè)計(jì)的系統(tǒng)的性能,主要是測定了系統(tǒng)的吞吐量、時(shí)延、帶寬和丟包率。測試的結(jié)果符合我國《高端路由器的測試規(guī)范》。根據(jù)測定的參數(shù),計(jì)算了并行分組轉(zhuǎn)發(fā)方法下系統(tǒng)的加速比,并與理想的并行值進(jìn)行了對(duì)照,分析了兩者之間差異的主要原因。由于篇幅的限制,文中對(duì)分組緩沖隊(duì)列的管理、發(fā)送隊(duì)列的調(diào)度及QOS的控制等略去。盡管參考本發(fā)明的優(yōu)選實(shí)施例具體展示和描述了本發(fā)明,但是本領(lǐng)域一般技術(shù)人員應(yīng)該明白,在不脫離所附權(quán)利要求限定的本發(fā)明的精神和范圍的情況下,可以對(duì)其進(jìn)行形式和細(xì)節(jié)上的各種修改。權(quán)利要求1.一種分組轉(zhuǎn)發(fā)方法,用于將來自至少一個(gè)入端口的分組數(shù)據(jù)從至少一個(gè)出端口轉(zhuǎn)發(fā)出去,該方法包括提供相互分離的控制平面和轉(zhuǎn)發(fā)平面,在控制平面中進(jìn)行系統(tǒng)控制操作,而在轉(zhuǎn)發(fā)平面中進(jìn)行分組轉(zhuǎn)發(fā)操作,在轉(zhuǎn)發(fā)平面中提供至少一個(gè)并行的轉(zhuǎn)發(fā)引擎,每個(gè)轉(zhuǎn)發(fā)引擎上運(yùn)行多個(gè)線程,所述線程包括至少一個(gè)接收線程和至少一個(gè)發(fā)送線程,由所述接收線程從所述入端口接收分組;以及由所述發(fā)送線程將所接收到的分組并行發(fā)送到出端口。2.如權(quán)利要求1所述的分組轉(zhuǎn)發(fā)方法,其特征在于,所述線程還包括接收調(diào)度線程和發(fā)送調(diào)度線程,當(dāng)有分組到達(dá)入端口時(shí),所述接收調(diào)度線程向接收線程分配接收任務(wù);所述發(fā)送調(diào)度線程向所述至少一個(gè)發(fā)送線程輪流分配發(fā)送任務(wù)。3.如權(quán)利要求2所述的分組轉(zhuǎn)發(fā)方法,還包括將所述接收調(diào)度線程以及所述至少一個(gè)接收線程分配在某一引擎上運(yùn)行;以及將所述發(fā)送調(diào)度線程以及所述至少一個(gè)發(fā)送線程分配在另一引擎上運(yùn)行。4.如權(quán)利要求1所述的分組轉(zhuǎn)發(fā)方法,還包括接收線程填寫用于描述其所接收到的所述分組的分組描述符;將同一個(gè)出端口發(fā)送的分組的分組描述符排成發(fā)送隊(duì)列;以及發(fā)送線程從發(fā)送隊(duì)列中取出分組描述符,以便向出端口發(fā)送所述分組描述符所對(duì)應(yīng)的分組。5.如權(quán)利要求1所述的分組轉(zhuǎn)發(fā)方法,還包括接收線程通過寫消息的方式,向發(fā)送線程告知相關(guān)的發(fā)送事件。6.如權(quán)利要求1所述的分組轉(zhuǎn)發(fā)方法,其特征在于,每個(gè)線程具有運(yùn)行、休眠、就緒三種狀態(tài)。7.如權(quán)利要求1-6中任何一個(gè)所述的分組轉(zhuǎn)發(fā)方法,還包括在將分組發(fā)送到出端口之前,將分組暫存在第一存儲(chǔ)器中。8.如權(quán)利要求7所述的分組轉(zhuǎn)發(fā)方法,還包括對(duì)每一個(gè)分組提供分組描述符,所述分組描述符與所述分組在第一存儲(chǔ)器中的暫存位置相對(duì)應(yīng);在向出端口發(fā)送所述分組時(shí),使用分組描述符確定所述分組在第一存儲(chǔ)器中的暫存位置。9.如權(quán)利要求8所述的分組轉(zhuǎn)發(fā)方法,其特征在于,所述分組描述符存儲(chǔ)在第二存儲(chǔ)器中,所述第二存儲(chǔ)器的存取速度比所述第一存儲(chǔ)器快。10.如權(quán)利要求9所述的分組轉(zhuǎn)發(fā)方法,其特征在于,所述第一存儲(chǔ)器為SDRAM,而所述第二存儲(chǔ)器為SRAM。11.如權(quán)利要求9所述的分組轉(zhuǎn)發(fā)方法,其特征在于,所述分組在所述第一存儲(chǔ)器中的暫存位置與所述分組描述符在所述第二存儲(chǔ)器中的存儲(chǔ)位置之間的對(duì)應(yīng)關(guān)系為線性映射關(guān)系。12.如權(quán)利要求9所述的分組轉(zhuǎn)發(fā)方法,該方法還包括在所述第二存儲(chǔ)器中存儲(chǔ)至少一個(gè)分組描述符,每個(gè)分組描述符與所述第一存儲(chǔ)器上的分組存儲(chǔ)位置對(duì)應(yīng);使尚未用于描述分組的至少一個(gè)空閑分組描述符形成空閑分組描述符隊(duì)列;形成發(fā)送隊(duì)列;在從入端口接收到分組之后,從所述空閑分組描述符隊(duì)列中取出一個(gè)分組描述符,并自動(dòng)更新所述空閑分組描述符隊(duì)列的結(jié)構(gòu);在將所述分組暫存到所述第一存儲(chǔ)器的同時(shí),修改所取出的分組描述符,以反映所述分組的狀況;經(jīng)查表后,將修改后的分組描述符插入到發(fā)送隊(duì)列中,13.如權(quán)利要求12所述的分組轉(zhuǎn)發(fā)方法,還包括為所述每個(gè)端口提供至少一個(gè)發(fā)送隊(duì)列。14.如權(quán)利要求13所述的分組轉(zhuǎn)發(fā)方法,其特征在于所述每個(gè)端口的多個(gè)發(fā)送隊(duì)列具有不同的發(fā)送優(yōu)先級(jí)。15.如權(quán)利要求12所述的分組轉(zhuǎn)發(fā)方法,還包括當(dāng)所述發(fā)送隊(duì)列非空時(shí),從發(fā)送隊(duì)列中取出一個(gè)分組描述符,并更新發(fā)送隊(duì)列的結(jié)構(gòu);在成功地發(fā)送了所取出的分組描述符所描述的分組之后,將所述分組描述符回收到所述空閑分組描述符隊(duì)列中。16.一種分組轉(zhuǎn)發(fā)裝置,用于將來自至少一個(gè)入端口的分組數(shù)據(jù)從至少一個(gè)出端口轉(zhuǎn)發(fā)出去,該裝置包括控制平面,用于進(jìn)行系統(tǒng)控制操作;轉(zhuǎn)發(fā)平面,和控制平面相互分離,用于進(jìn)行分組轉(zhuǎn)發(fā)操作,所述轉(zhuǎn)發(fā)平面包括至少兩個(gè)轉(zhuǎn)發(fā)引擎,轉(zhuǎn)發(fā)引擎包括接收線程處理單元,用于產(chǎn)生至少一個(gè)接收線程,所述接收線程用于從所述入端口接收分組;以及發(fā)送線程處理單元,用于產(chǎn)生至少一個(gè)發(fā)送線程,所述發(fā)送線程用于將所接收到的分組并行發(fā)送到出端口。17.如權(quán)利要求16所述的分組轉(zhuǎn)發(fā)裝置,其中所述轉(zhuǎn)發(fā)引擎還包括接收調(diào)度線程處理單元,用于產(chǎn)生接收調(diào)度線程,以在有分組到達(dá)入端口時(shí),向?qū)?yīng)的接收線程分配接收任務(wù);以及發(fā)送調(diào)度線程處理單元,用于產(chǎn)生發(fā)送調(diào)度線程,以在接收所述分組之后,向所述至少一個(gè)發(fā)送線程分配發(fā)送任務(wù)。18.如權(quán)利要求17所述的分組轉(zhuǎn)發(fā)裝置,還包括線程分配裝置,用于將所述接收調(diào)度線程以及所述至少一個(gè)接收線程分配在某一個(gè)引擎上,并將所述發(fā)送調(diào)度線程以及所述至少一個(gè)發(fā)送線程分配在另一個(gè)引擎上。19.如權(quán)利要求16所述的分組轉(zhuǎn)發(fā)裝置,還包括線程間通信裝置,用于形成消息隊(duì)列,以使所述線程之間可以通過發(fā)送消息的方式互相通訊。20.如權(quán)利要求19所述的分組轉(zhuǎn)發(fā)裝置,其特征在于,所述線程間通信裝置響應(yīng)所述接收線程的指令,向消息隊(duì)列寫入用于告知相關(guān)的發(fā)送事件的消息,并由發(fā)送線程讀取。21.如權(quán)利要求16所述的分組轉(zhuǎn)發(fā)裝置,還包括用于產(chǎn)生描述所接收到的分組的分組描述符的裝置;用于將描述要由同一個(gè)端口發(fā)送的分組的分組描述符排成發(fā)送隊(duì)列的裝置;用于檢測發(fā)送隊(duì)列是否為空的裝置;以及用于在發(fā)送隊(duì)列非空時(shí),從發(fā)送隊(duì)列中取出分組描述符,以便向出端口發(fā)送所述分組描述符所描述的分組的裝置。22.如權(quán)利要求16-21中任何一個(gè)所述的分組轉(zhuǎn)發(fā)裝置,還包括第一存儲(chǔ)器,用于在將分組發(fā)送到出端口之前暫存所述分組。23.如權(quán)利要求22所述的分組轉(zhuǎn)發(fā)裝置,還包括第二存儲(chǔ)器,其上存儲(chǔ)了至少一個(gè)分組描述符,用于描述接收到的分組,所述分組描述符與所述分組在第一存儲(chǔ)器中的暫存位置相對(duì)應(yīng);用于在向出端口發(fā)送所述分組時(shí),使用分組描述符確定所述分組在第一存儲(chǔ)器中的暫存位置的裝置。24.如權(quán)利要求23所述的分組轉(zhuǎn)發(fā)裝置,其特征在于,所述第二存儲(chǔ)器的存取速度比所述第一存儲(chǔ)器快。25.如權(quán)利要求24所述的分組轉(zhuǎn)發(fā)裝置,其特征在于,所述第一存儲(chǔ)器為SDRAM,而所述第二存儲(chǔ)器為SRAM。26.如權(quán)利要求23所述的分組轉(zhuǎn)發(fā)裝置,其特征在于,所述第一存儲(chǔ)器中暫存所述分組的位置與所述第二存儲(chǔ)器中存儲(chǔ)所述分組描述符的位置之間的對(duì)應(yīng)關(guān)系為線性映射關(guān)系。27.如權(quán)利要求23所述的分組轉(zhuǎn)發(fā)裝置,還包括用于使尚未用于描述分組的至少一個(gè)空閑分組描述符形成空閑分組描述符隊(duì)列的裝置;用于形成發(fā)送隊(duì)列的裝置,所述發(fā)送隊(duì)列由用于描述分組的分組描述符組成;用于在從入端口接收到分組之后,從所述空閑分組描述符隊(duì)列中取出一個(gè)分組描述符,并更新所述空閑分組描述符隊(duì)列的結(jié)構(gòu)的裝置;用于將所述分組暫存到所述第一存儲(chǔ)器中與用來對(duì)所述分組進(jìn)行描述的分組描述符相對(duì)應(yīng)的暫存地址的裝置;用于修改所取出的分組描述符,以描述所述分組的裝置;用于將修改后的分組描述符插入到發(fā)送隊(duì)列中的裝置。28.如權(quán)利要求27所述的分組轉(zhuǎn)發(fā)裝置,其特征在于,所述用于形成發(fā)送隊(duì)列的裝置為所述至少一個(gè)入端口中的每一個(gè)提供了至少一個(gè)發(fā)送隊(duì)列。29.如權(quán)利要求28所述的分組轉(zhuǎn)發(fā)裝置,其特征在于所述各個(gè)發(fā)送隊(duì)列具有不同的優(yōu)先級(jí)。30.如權(quán)利要求27所述的分組轉(zhuǎn)發(fā)裝置,還包括用于在所述發(fā)送隊(duì)列非空時(shí),從發(fā)送隊(duì)列中取出一個(gè)分組描述符,并更新發(fā)送隊(duì)列的結(jié)構(gòu)的裝置;用于在成功地發(fā)送了所取出的分組描述符所描述的分組之后,將所述分組描述符回收到所述空閑分組描述符隊(duì)列中的裝置。31.一種擴(kuò)展分組轉(zhuǎn)發(fā)裝置,包括至少一個(gè)如權(quán)利要求16所述的分組轉(zhuǎn)發(fā)裝置;以及交叉背板,用于連接所述至少一個(gè)分組轉(zhuǎn)發(fā)的裝置。全文摘要本發(fā)明提供了一種線速分組并行轉(zhuǎn)發(fā)的方法和裝置。其中提供了相互分離的控制平面和轉(zhuǎn)發(fā)平面,轉(zhuǎn)發(fā)平面上具有多個(gè)轉(zhuǎn)發(fā)引擎。還提供了兩個(gè)存儲(chǔ)器SDRAM和SRAM,其中SDRAM用于暫存分組,而SRAM用于存儲(chǔ)分組描述符。SRAM中的分組描述符與SDRAM中的分組存放地址之間存在線性映射關(guān)系。當(dāng)有分組到達(dá)入端口時(shí),接收調(diào)度線程調(diào)度多個(gè)接收線程執(zhí)行接收任務(wù);接收線程將分組存放到一個(gè)分組描述符所對(duì)應(yīng)的存放地址,修改該分組描述符,查找分組轉(zhuǎn)發(fā)表后將其插入發(fā)送隊(duì)列;發(fā)送調(diào)度線程調(diào)度多個(gè)發(fā)送線程輪流執(zhí)行發(fā)送任務(wù);發(fā)送線程從發(fā)送隊(duì)列中取出一個(gè)分組描述符,將該分組描述符所對(duì)應(yīng)的分組拷貝到TFIFO中。文檔編號(hào)H04L12/56GK1677952SQ20041003186公開日2005年10月5日申請(qǐng)日期2004年3月30日優(yōu)先權(quán)日2004年3月30日發(fā)明者董喜明,余少華,王強(qiáng)申請(qǐng)人:武漢烽火網(wǎng)絡(luò)有限責(zé)任公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
共和县| 吉隆县| 遵义县| 拜城县| 汪清县| 祥云县| 南川市| 台东县| 安塞县| 岳阳市| 阜新市| 峨山| 吴旗县| 九龙坡区| 东兴市| 樟树市| 平陆县| 镇巴县| 邮箱| 江安县| 宜黄县| 合作市| 婺源县| 麻栗坡县| 句容市| 株洲市| 商南县| 潮州市| 新闻| 沾化县| 石柱| 玉屏| 定日县| 金阳县| 中卫市| 东城区| 丹阳市| 曲沃县| 绥中县| 二连浩特市| 社旗县|