欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種流表查找方法和裝置的制作方法

文檔序號(hào):7699730閱讀:193來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):一種流表查找方法和裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及數(shù)據(jù)通信技術(shù),具體涉及一種提高流表查找性能的方法和裝置。
背景技術(shù)
在數(shù)據(jù)通信領(lǐng)域中,會(huì)涉及到一些二、三層數(shù)據(jù)轉(zhuǎn)發(fā)的控制。該數(shù)據(jù)轉(zhuǎn) 發(fā)是通過(guò)查找流表得到數(shù)據(jù)的出接口或者其它一些屬性值。流表的查找效率 影響著數(shù)據(jù)在網(wǎng)絡(luò)上的高效傳輸,如何快速實(shí)現(xiàn)高效的查找是實(shí)現(xiàn)高速報(bào)文 轉(zhuǎn)發(fā)的一個(gè)研究重點(diǎn)。
圖1為現(xiàn)有技術(shù)中流表查找和匹配過(guò)程的流程圖。如圖1所示,當(dāng)報(bào)文
到達(dá)后,從報(bào)文中提取用于散列(Hash)運(yùn)算的關(guān)鍵字(key),該關(guān)鍵字 為報(bào)文特征信息,具體可以根據(jù)實(shí)際網(wǎng)絡(luò)、功能等需求預(yù)先確定,例如可以 為介質(zhì)訪問(wèn)控制(MAC)地址、IP地址、虛擬局域網(wǎng)標(biāo)識(shí)(VLAN ID)等 等。然后采用一種Hash函數(shù)對(duì)提取的關(guān)鍵字進(jìn)行Hash運(yùn)算,得到的運(yùn)算結(jié) 果稱(chēng)為Hash索引,簡(jiǎn)稱(chēng)Index。 Index指示出對(duì)當(dāng)前被處理報(bào)文進(jìn)行轉(zhuǎn)發(fā)控 制的流表表項(xiàng)在外部緩存中的地址。然后,以Index為讀取地址,在存儲(chǔ)于 外部緩存的流表中讀取流表表項(xiàng)。流表表項(xiàng)中包含所述關(guān)鍵字,還包括出接 口等一系列用于轉(zhuǎn)發(fā)控制的屬性值。在讀取流表表項(xiàng)后,需要判斷從報(bào)文中 提取的關(guān)鍵字是否與所讀取流表表項(xiàng)中的關(guān)鍵字相匹配,如果匹配,則確定 命中流表,采用讀取的流表表項(xiàng)對(duì)報(bào)文進(jìn)行轉(zhuǎn)發(fā)控制;否則確定未命中流表, 對(duì)才艮文進(jìn)行未命中流表的處理,例如丟棄或廣播該報(bào)文。
Hash函數(shù)所建立的關(guān)鍵字到Index的映射是多對(duì)一的映射關(guān)系,也就是 說(shuō),多個(gè)不同的關(guān)^t字經(jīng)同一Hash函數(shù)處理后,得到相同的Index,那么這個(gè)Index作為地址的位置上需要保存對(duì)應(yīng)的所有關(guān)鍵字,而一個(gè)存儲(chǔ)地址無(wú) 法保存多個(gè)數(shù)據(jù),這種現(xiàn)象稱(chēng)為Hash沖突。
目前可以采用Hash桶的形式解決這種沖突,圖2為外部緩存中采用 Hash桶存儲(chǔ)流表表項(xiàng)的示意圖。如圖2所示,假設(shè)keyl、 key2和key3經(jīng)同 一函數(shù)Hash(x)的運(yùn)算后均得到Indexl,那么以Indexl為基址的Hash桶需 要依次存儲(chǔ)key 1 、 key2和key3所屬的流表表項(xiàng)。同理,key4和key5經(jīng)Hash(x) 運(yùn)算后均得到Index2,以Index2為基址的Hash桶需要依次存儲(chǔ)key4和key5 所屬的流表表項(xiàng);key6經(jīng)Hash(x)運(yùn)算后得到Index3,以Index3為基址的 Hash桶只需存儲(chǔ)key6所屬的流表表項(xiàng)。在流表查找時(shí),根據(jù)從報(bào)文提取的 關(guān)鍵字得到Index,從Index指示的Hash桶中依次讀取各流表表項(xiàng)并確定讀 取的表項(xiàng)判斷是否為匹配表項(xiàng),從而判定是否命中流表,并根據(jù)判斷結(jié)果進(jìn) 行后續(xù)處理。圖2中的"……"表示表項(xiàng)中除key值以外的其它內(nèi)容??梢?jiàn), 采用這種Hash桶的方式解決了多個(gè)關(guān)鍵字對(duì)應(yīng)相同Index帶來(lái)的沖突問(wèn)題。
但是,如果匹配表項(xiàng)不在Hash桶的頂層,例如key3對(duì)應(yīng)的表項(xiàng)在Hash 桶的第三層,那么需要在以Indexl為基址的Hash桶中讀取和匹配3次,才 能夠命中到匹配表項(xiàng)。由于流表設(shè)置在通信設(shè)備處理芯片的外部緩存,訪問(wèn) 速度不夠快,因此在Hash桶較深的情況下雖然可以在一定程度上解決Hash 沖突問(wèn)題,但是由于查找速度低,會(huì)嚴(yán)重影響報(bào)文轉(zhuǎn)發(fā)性能。
而且,由于各個(gè)Hash桶的深度相同、但同一 Index對(duì)應(yīng)的關(guān)鍵字?jǐn)?shù)量 卻有所不同,因此有些Hash桶的利用率較高,例如圖2中Indexl地址處的 Hash桶,而有些Hash桶的利用率卻很低,例如圖2中Index3地址處的Hash 桶。

發(fā)明內(nèi)容
有鑒于此,本發(fā)明提供了一種流表查找方法,能夠提高流表查找速度。 該方法包括
A、以報(bào)文特征信息為關(guān)鍵字,采用預(yù)設(shè)散列Hash函數(shù)建立關(guān)鍵字與Hash索引之間的對(duì)應(yīng)關(guān)系;在設(shè)置于內(nèi)部緩存的預(yù)查找表中,針對(duì)每個(gè)Hash索引順 序記錄該Hash索引對(duì)應(yīng)的各關(guān)鍵字的部分比特,所述部分比特稱(chēng)為流量特征 Flow值;針對(duì)對(duì)應(yīng)同 一關(guān)4建字的Flow值和Hash索引,根椐Flow值在預(yù)查找 表表項(xiàng)中的排序位置和Hash索引值,確定該關(guān)鍵字所屬流表表項(xiàng)在外部緩存 Hash桶中的記錄位置,在所確定的記錄位置上記錄該關(guān)鍵字所屬流表表項(xiàng);
B、查找流表時(shí),采用所述預(yù)設(shè)Hash函數(shù)計(jì)算待處理報(bào)文中關(guān)鍵字key-x 的Hash索引,記為Index-x;在所述預(yù)查找表中查找與Index-x對(duì)應(yīng)的、且 與key-x匹配的Flow值;根據(jù)該匹配的Flow值在預(yù)查找表表項(xiàng)中的排序位 置和所述Index-x確定所述key-x所屬流表表項(xiàng)的讀取地址,從外部緩存中 讀取流表表項(xiàng)。
較佳地,所述確定該關(guān)鍵字所屬流表表項(xiàng)在外部緩存Hash桶中的記錄位置 為以Hash索引值為基址Index,以Flow值在預(yù)查找表表項(xiàng)中的排序位置為 偏移地址offset,將Index+offset作為所述流表表項(xiàng)在外部緩存中的記錄位置;
所述根據(jù)該匹配的Flow值在預(yù)查找表表項(xiàng)中的排序位置和所述Index-x確 定所述key-x所屬流表表項(xiàng)的讀取地址,從外部緩存中讀取流表表項(xiàng)為根據(jù) 該匹配的Flow值在預(yù)查找表表項(xiàng)中的排序位置,確定key-x所屬流表表項(xiàng)在相 應(yīng)Hash桶中的偏移位置offset-x;以Index-x與offset-x之和為讀取地址,從外 部緩存中讀取流表表項(xiàng)。
較佳地,所述步驟A進(jìn)一步包括當(dāng)采用相同Hash函數(shù)將多個(gè)關(guān)鍵字映 射到同一Hash索引、且所述多個(gè)關(guān)鍵字的數(shù)量大于Hash桶的桶深時(shí),將所述 多個(gè)關(guān)鍵字分為至少兩個(gè)部分,不同部分采用不同級(jí)別的預(yù)設(shè)Hash函數(shù)建立關(guān) 鍵字與Hash索引之間的對(duì)應(yīng)關(guān)系;
所述預(yù)查找表進(jìn)一步記錄建立Hash索引與關(guān)鍵字之間的對(duì)應(yīng)關(guān)系所采用 的預(yù)i殳Hash函數(shù)的標(biāo)識(shí)。
較佳地,用于建立所述對(duì)應(yīng)關(guān)系的預(yù)設(shè)Hash函數(shù)為兩級(jí)預(yù)設(shè)Hash函數(shù), 分別記為Hash0(x)和Hashl(x);
所述步驟A包括采用HashO(x)計(jì)算各關(guān)鍵字的Hash索引,記為Indexh(),采用預(yù)查找表順 序記錄各Indexh。對(duì)應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用HashO(x)計(jì)算得 到;并在各Hash索《1為基址的Hash桶中保存相應(yīng)流表表項(xiàng);
對(duì)于采用HashO(x)計(jì)算Hash索引出現(xiàn)沖突的關(guān)鍵字,采用Hashl(x)計(jì)算 Hash索引,記為Indexhl,在Indexhl指向的預(yù)查找表表項(xiàng)中順序增加與Indexhl 對(duì)應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用Hashl(x)計(jì)算得到;并在各IndeXh, 為基址的Hash桶中增加相應(yīng)流表表項(xiàng)。
所述步驟B包括
采用第一預(yù)設(shè)Hash函數(shù)計(jì)算key-x的Hash索引,記為Indexh(rx;在所述 預(yù)查找表中查找與第一預(yù)設(shè)Hash函數(shù)和Indexh(rx對(duì)應(yīng)的、且與key-x匹配的 Flow值;
如果查找到,則根據(jù)該匹配的Flow值在預(yù)查找表表項(xiàng)中的排序位置,確定 key-x所屬流表表項(xiàng)在相應(yīng)Hash桶中的偏移位置offseth(rx;以Indexh(rx與 offseth(rx之和為讀取地址,從外部緩存中讀取流表表項(xiàng);
如果未查找到,則采用下一級(jí)預(yù)設(shè)Hash函數(shù)計(jì)算key-x的Hash索引,記 為Indexhn-x;在所述預(yù)查找表中查找與所述下一級(jí)預(yù)設(shè)Hash函數(shù)和Indexhn-x 對(duì)應(yīng)的、且與key-x匹配的Flow值,如果查找到,根據(jù)匹配的Flow值在預(yù)查 找表表項(xiàng)中的排序位置,確定key-x所屬流表表項(xiàng)在相應(yīng)Hash桶中的偏移位置 offsethn-x;以Indexhn-x與offsethn-x之和為讀取地址,從外部緩存中讀取流表表 項(xiàng),如果未查找到,則采用再下一級(jí)的預(yù)i殳Hash函數(shù)執(zhí)行所述計(jì)算key-x的 Hash索引的操作,直到達(dá)到最后一級(jí)預(yù)設(shè)Hash函數(shù)。
較佳地,該方法進(jìn)一步包括對(duì)于采用所述預(yù)設(shè)Hash函數(shù)計(jì)算Hash索引 出現(xiàn)沖突的關(guān)鍵字,采用備用Hash函數(shù)進(jìn)行處理,得到的Hash索引記為Indexh,; 采用備用Hash表記錄關(guān)鍵字的Indexh,與關(guān)鍵字所屬流表表項(xiàng)之間的對(duì)應(yīng)關(guān)系;
所述步驟B進(jìn)一步包括采用所述備用Hash函數(shù),對(duì)key-x進(jìn)行Hash運(yùn) 算,得到的Hash索引記為Indexh.-x,從所述備用Hash表中讀取與Indexh,-x對(duì) 應(yīng)的流表表項(xiàng);如果key-x命中讀取的流表表項(xiàng),則終止查找預(yù)查找表的流程。較佳地,采用預(yù)查找表記錄每個(gè)Hash索引對(duì)應(yīng)的各Flow值為以Hash 索引為記錄基址,在內(nèi)部緩存的預(yù)查找表中依次記錄該Hash索引對(duì)應(yīng)的各Flow值。
本發(fā)明還提供了一種流表查找裝置,能夠提高流表查找速度。 該裝置包括內(nèi)部緩存單元、外部緩存單元、關(guān)系建立單元和流表查找單
元;
所述外部緩存單元,用于以Hash桶形式存儲(chǔ)流表表項(xiàng); 所述內(nèi)部緩存單元,用于存儲(chǔ)預(yù)查找表;
所述關(guān)系建立單元,用于以報(bào)文特征信息為關(guān)鍵字,采用預(yù)設(shè)Hash函數(shù)建 立關(guān)鍵字與Hash索引之間的對(duì)應(yīng)關(guān)系;在預(yù)查找表中,針對(duì)每個(gè)Hash索引順 序記錄該Hash索引對(duì)應(yīng)的各關(guān)鍵字的部分比特,所述部分比特稱(chēng)為流量特征 Flow值;針對(duì)對(duì)應(yīng)同 一關(guān)鍵字的Flow值和Hash索引,根據(jù)Flow值在預(yù)查找 表表項(xiàng)中的排序位置和Hash索引值,確定該關(guān)鍵字所屬流表表項(xiàng)在外部緩存 Hash桶中的記錄位置,在所確定的記錄位置上記錄該關(guān)鍵字所屬流表表;
所述流表查找單元,用于采用所述預(yù)設(shè)Hash函數(shù)計(jì)算待處理報(bào)文中關(guān) 鍵字key-x的Hash索引,記為Index-x;在所述預(yù)查找表中查找與Index-x 對(duì)應(yīng)的、且與key-x匹配的Flow值;根據(jù)該匹配的Flow值在預(yù)查找表表項(xiàng) 中的排序位置和所述Index-x確定所述key-x所屬流表表項(xiàng)的讀取地址,從 所述外部緩存單元中讀取流表表項(xiàng)。
所述關(guān)系建立單元進(jìn)一步用于,以Hash索引值為基址Index,以Flow值在 預(yù)查找表表項(xiàng)中的排序位置為偏移地址offset,將Index+offset作為所述流表表 項(xiàng)在外部緩存中的記錄位置;
所述流表查找單元進(jìn)一步用于,根據(jù)該匹配的Flow值在預(yù)查找表表項(xiàng) 中的排序位置,確定key-x所屬流表表項(xiàng)在相應(yīng)Hash桶中的偏移位置 offset-x;以Index-x與offset-x之和為讀取地址,從外部緩存中讀取流表表 項(xiàng)。
其中,所述關(guān)系建立單元進(jìn)一步用于,當(dāng)采用相同Hash函數(shù)將多個(gè)關(guān)鍵字
11映射到同一Hash索引、且所述多個(gè)關(guān)鍵字的數(shù)量大于Hash桶的桶深時(shí),將所 述多個(gè)關(guān)鍵字分為至少兩個(gè)部分,不同部分采用不同級(jí)別的預(yù)設(shè)Hash函數(shù)建立 關(guān)鍵字與Hash索引之間的對(duì)應(yīng)關(guān)系;
該關(guān)系建立單元還進(jìn)一步在預(yù)查找表中記錄建立Hash索引與關(guān)鍵字之間 的對(duì)應(yīng)關(guān)系所采用的預(yù)設(shè)Hash函數(shù)的標(biāo)識(shí)。
其中,所述流表查找單元包括第一級(jí)查找單元和沖突解決單元;
第一級(jí)查找單元,用于采用第一預(yù)設(shè)Hash函數(shù)計(jì)算待處理報(bào)文中關(guān)鍵字 key-x的Hash索引,記為Indexh0-x;在所述預(yù)查找表中查找與第一預(yù)設(shè)Hash 函數(shù)和Indexho對(duì)應(yīng)的、且與key-x匹配的Flow值;如果查找到,則根據(jù)該匹 配的Flow值在預(yù)查找表表項(xiàng)中的排序位置,確定key-x所屬流表表項(xiàng)在相應(yīng) Hash桶中的偏移位置offsetho-x ;以Indexh(rx與offsethQ-x之和為讀取地址,從 所述外部緩存單元讀取流表表項(xiàng);如果未查找到,則通知所述沖突解決單元;
所述沖突解決單元,在接收到所述通知后,采用下一級(jí)預(yù)設(shè)Hash函數(shù)計(jì)算 key-x的Hash索引,記為Indexhn-x;在所述預(yù)查找表中查找與所述下一級(jí)預(yù)設(shè) Hash函數(shù)和Indexhn-x對(duì)應(yīng)的、且與key-x匹配的Flow值,如果查找到,根據(jù) 匹配的Flow值在表項(xiàng)中的排序位置,確定key-x所屬流表表項(xiàng)在相應(yīng)Hash桶 中的偏移位置offsethn-x;以Indexhn-x與offsethn-x之和為讀取地址,從所述外部 緩存單元中讀取流表表項(xiàng),.如果未查找到,則采用再下一級(jí)的預(yù)設(shè)Hash函數(shù)執(zhí) 行所述計(jì)算key-x的Hash索引的操作,直到達(dá)到最后一級(jí)預(yù)設(shè)Hash函數(shù)。
較佳地,所述內(nèi)部緩存單元進(jìn)一步存儲(chǔ)備用Hash表;
所述關(guān)系建立單元,進(jìn)一步用于對(duì)采用所述預(yù)設(shè)Hash函數(shù)均出現(xiàn)沖突的關(guān) 鍵字,采用備用Hash函數(shù)進(jìn)行處理,得到對(duì)應(yīng)的Hash索引,記為Index';采 用備用Hash表記錄關(guān)鍵字的Indexh,與關(guān)鍵字的所屬流表表項(xiàng)之間的對(duì)應(yīng)關(guān)系;
所述流表查找單元進(jìn)一步包括備用查找模塊,用于采用所述備用Hash函 數(shù),對(duì)key-x進(jìn)行Hash運(yùn)算,得到Hash索引記為Indexh,-x;從所述備用Hash 表中讀取與Indexh,-x對(duì)應(yīng)的流表表項(xiàng);如果key-x命中讀取的流表表項(xiàng),則終 止流表查找單元查找預(yù)查找表的處理。較佳地,所述關(guān)系建立單元在針對(duì)每個(gè)Hash索引順序記錄該Hash索引 對(duì)應(yīng)的各Flow值時(shí),以Hash索引為記錄基址,在所述內(nèi)部緩存單元中依次 記錄該Hash索引對(duì)應(yīng)的各Flow值。
根據(jù)以上技術(shù)方案可見(jiàn),本發(fā)明在存儲(chǔ)于內(nèi)部緩存的預(yù)查找表中記錄各 個(gè)Index與關(guān)鍵字的對(duì)應(yīng)關(guān)系,記錄時(shí)只記錄關(guān)鍵字的部分字段,稱(chēng)為Flow 值,以適應(yīng)內(nèi)部緩存極為有限的存儲(chǔ)空間。同時(shí),關(guān)鍵字的Flow值在預(yù)查 找表的記錄位置與關(guān)鍵字對(duì)應(yīng)的流表表項(xiàng)在Hash桶中的記錄位置相應(yīng),這 樣,在流表查找時(shí),可以根據(jù)對(duì)報(bào)文的關(guān)鍵字進(jìn)行Hash運(yùn)算得到的Index, 以及與報(bào)文關(guān)鍵字匹配的Flow值在預(yù)查找表表項(xiàng)中位置,確定所需流表表 項(xiàng)在外部緩存中的具體位置,然后只需要訪問(wèn)外部緩存一次,即可得到所需 的流表表項(xiàng),無(wú)需像現(xiàn)有技術(shù)一樣在Hash桶中逐一查找和匹配,從而達(dá)到 快速查找的目的。而且由于預(yù)查找表設(shè)置在芯片內(nèi)部緩存,查找速度快,進(jìn) 一步提高查找速度。
其次,本發(fā)明提供的多級(jí)Hash查找方案,可以減少Hash沖突,且充分 利用Hash桶資源。
此外,本發(fā)明進(jìn)一步在內(nèi)部緩存中設(shè)置備用Hash表,可以進(jìn)一步減少 Hash沖突,且由于備用Hash表直接設(shè)置在內(nèi)部緩存,因此查找速度快,不 影響預(yù)查找表的查找過(guò)程。


圖1為現(xiàn)有技術(shù)中流表查找和匹配過(guò)程的流程圖。 圖2為現(xiàn)有技術(shù)中流表的存儲(chǔ)方式示意圖。 圖3為本發(fā)明實(shí)施例中預(yù)查找表的一種實(shí)現(xiàn)示意圖。 圖4為本發(fā)明實(shí)施例中預(yù)查找表的另一種實(shí)現(xiàn)示意圖。 圖5為本發(fā)明實(shí)施例一中流表查找的實(shí)例示意圖。 圖6為本發(fā)明實(shí)施例二中流表查找的實(shí)例示意圖。
圖7為本發(fā)明實(shí)施例二中采用圖6中的預(yù)查找表實(shí)現(xiàn)流表查找的流程圖。
圖8為本發(fā)明實(shí)施例三中備用Hash表的示意圖。 圖9為本發(fā)明實(shí)施例中流表查找裝置的結(jié)構(gòu)示意圖。
具體實(shí)施例方式
下面結(jié)合附圖并舉實(shí)施例,對(duì)本發(fā)明進(jìn)行詳細(xì)描述。
本發(fā)明實(shí)施例一提供了一種流表查找方法,其基本思想為在芯片內(nèi)部 緩存中設(shè)置預(yù)查找表,在該預(yù)查找表中,針對(duì)每個(gè)Index,順序記錄該Index 對(duì)應(yīng)的各關(guān)鍵字的部分比特,本發(fā)明將該部分比特稱(chēng)為流量特征值,簡(jiǎn)稱(chēng)為 Flow值;針對(duì)對(duì)應(yīng)同 一關(guān)4走字的Flow值和Hash索引,根據(jù)Flow值在預(yù)查 找表表項(xiàng)中的排序位置和Hash索引值,確定該關(guān)鍵字所屬流表表項(xiàng)在外部 緩存Hash桶中的記錄位置,在所確定的記錄位置上記錄該關(guān)鍵字所屬流表 表項(xiàng)。
查找流表時(shí),采用預(yù)設(shè)Hash函數(shù)計(jì)算待轉(zhuǎn)發(fā)報(bào)文中關(guān)鍵字key-x的Hash 索引,記為Index-x;在預(yù)查找表中查找與Index-x對(duì)應(yīng)的、且與key-x匹配 的Flow值;根據(jù)該匹配的Flow值在表項(xiàng)中的排序位置和Index-x確定key-x 所屬流表表項(xiàng)的讀取地址,從外部緩存中讀取流表表項(xiàng)。
然后,對(duì)讀取的流表表項(xiàng)判斷是否為命中表項(xiàng),如果是,則采用讀取的 流表表項(xiàng)執(zhí)行轉(zhuǎn)發(fā)控制操作,如果不是,則對(duì)報(bào)文進(jìn)行未命中流表的處理, 例如丟棄或廣播該報(bào)文。
其中,由于芯片內(nèi)部緩存容量極為有限,F(xiàn)low值可以采用關(guān)鍵字中的 2~4bit,例如前2 4bit,或后2 ~ 4bit。當(dāng)然,在緩存容量允許的情況下, Flow值的長(zhǎng)度可以設(shè)置較長(zhǎng),長(zhǎng)度越長(zhǎng),則匹配的準(zhǔn)確性越高。關(guān)鍵字可 以取報(bào)文中的MAC地址、IP地址或VLAN ID值等報(bào)文特征信息。
采用預(yù)查找表記錄Index對(duì)應(yīng)的Flow值時(shí),可以如圖3所示,在預(yù)查 找表中對(duì)應(yīng)記錄Index值以及各Flow值。為了進(jìn)一步節(jié)省存儲(chǔ)空間,較佳 地實(shí)施方式為如圖4所示,以Index為記錄基址,在內(nèi)部緩存的預(yù)查找表中
14記錄該Index對(duì)應(yīng)的各Flow值。
其中,根據(jù)Flow值在預(yù)查找表表項(xiàng)中的排序位置和Index確定相關(guān)流 表表項(xiàng)在Hash桶中的存儲(chǔ)位置時(shí),可以以Index為基址,以Flow值在預(yù)查 找表表項(xiàng)中的排序位置為偏移地址offset,將Index+offset作為相關(guān)流表表 項(xiàng)在外部緩存中的記錄位置。那么在查找流表時(shí),在按照上述實(shí)施例一的流 程確定Index-x和Flow值之后,確定key-x所屬流表表項(xiàng)在相應(yīng)Hash桶中 的偏移位置offset-x,以Index-x與offset-x之和為讀取地址,從外部緩存中 讀取流表表項(xiàng)。這種實(shí)施方式比較簡(jiǎn)單,采用加法作為變換關(guān)系。在實(shí)際中 還可以采用其他的變換關(guān)系確定相關(guān)流表表項(xiàng)的存儲(chǔ)地址。
為了便于理解,針對(duì)實(shí)施例一舉一個(gè)實(shí)例。圖5示出了本實(shí)施例一中采 用圖4的預(yù)查找表進(jìn)行流表查找的一實(shí)例示意圖。如圖5所示,對(duì)報(bào)文中可 能出現(xiàn)的各key值進(jìn)行Hash運(yùn)算。假設(shè)Hash函數(shù)為Hash(x), Hash(keyl)=Hash(key2)=Indexl , Hash(key4)=Hash(key5)= Index2 , Hash(key6)=Index3, Hash(key7)=Index4,則以Indexl為基址,在內(nèi)部緩存 中順序記錄FLOW0和FLOWl, FLOW0為keyl的前2bit, FLOW1為key2 的前2bit,同時(shí)按照相同順序,在以Indexl為基址的外部緩存Hash桶中記 錄keyl和key2的流表表項(xiàng)。以此類(lèi)推,從而建立其如圖5中示出的預(yù)查找 表和Hash桶。圖5所示F1OW0和FlOWl僅代表Flow值的位置,不表示具 體數(shù)值,如果查找到FlOW0,表示偏移量為0,查找到FlOWl ,表示偏移 量為1。 Hash桶的深度為2。
流表查找時(shí),參見(jiàn)圖5,假設(shè)從當(dāng)前報(bào)文中提取關(guān)鍵字key2,對(duì)key2 進(jìn)行Hash(x)運(yùn)算得到Indexl,以Indexl為起始地址在內(nèi)部緩存的預(yù)查找表 中查找與Indexl對(duì)應(yīng)的各Flow值,并依次讀耳又并與key2進(jìn)行匹配,結(jié)果 匹配到第一行的F10W1,此時(shí)確定偏移量為1。然后以(Indexl + 1)為地址, 在外部緩存中直接讀取key2所在流表表項(xiàng)。然后,判斷從報(bào)文中提取的關(guān) 鍵字key2是否與流表表項(xiàng)中的key2相同;如果相同,則確定命中流表,采 用讀取的流表表項(xiàng)對(duì)當(dāng)前報(bào)文進(jìn)行轉(zhuǎn)發(fā)控制;如果確定未命中流表,出現(xiàn)沖突,對(duì)沖突報(bào)文進(jìn)行常規(guī)處理,例如丟棄或廣播。
可見(jiàn),采用本實(shí)施例的流表查找方法可以利用預(yù)查找表快速確定所需流 表表項(xiàng)在外部緩存中的位置,然后只需要訪問(wèn)外部緩存一次,即可得到所需
的流表表項(xiàng),無(wú)需像現(xiàn)有技術(shù)一樣在Hash桶中逐一查找和匹配,從而達(dá)到 快速查找的目的。
實(shí)施例二
采用實(shí)施例 一 的方案可能產(chǎn)生Hash沖突。假設(shè)存在Hash(key3)=Index 1, 且Indexl對(duì)應(yīng)的Hash桶已滿(mǎn),無(wú)法再容納key3的流表表項(xiàng),則key3為沖 突關(guān)鍵字。 一種解決方式是通過(guò)調(diào)整Hash桶的桶高來(lái)容納更多的表項(xiàng),但 是調(diào)整桶高時(shí)需要對(duì)所有Hash桶實(shí)施相同調(diào)整,這樣會(huì)降低Hash桶的利用率。
為此,本發(fā)明的實(shí)施例二提出一種多級(jí)Hash的流表查找方法,不僅解 決了上述可能產(chǎn)生的Hash沖突,還有效地利用Hash桶的剩余空間。該實(shí)施 例中,針對(duì)采用相同Hash函數(shù)將較多關(guān)鍵字映射到同一 Index值、且較多 關(guān)鍵字的數(shù)量大于Hash桶深的情況,將該較多關(guān)鍵字分為至少兩個(gè)部分, 不同部分采用不同級(jí)別的預(yù)i殳Hash函數(shù)進(jìn)行處理,從而得到不同的Index 值,這樣使得該較多關(guān)鍵字可以保存到不同的Hash桶中。同時(shí),還需要對(duì) 前述預(yù)查找表進(jìn)行改進(jìn)在預(yù)查找表中記錄每個(gè)Index對(duì)應(yīng)的多個(gè)關(guān)鍵字部 分比特(Flow值)時(shí),還需要進(jìn)一步記錄建立Index與關(guān)鍵字之間對(duì)應(yīng)關(guān) 系所采用的Hash函數(shù)的標(biāo)識(shí)。
需要注意的是,每一部分的關(guān)鍵字?jǐn)?shù)量應(yīng)該不超過(guò)相應(yīng)Hash桶的剩余 空間。為此,在實(shí)際建立預(yù)查找表時(shí),可以先采用第一 Hash函數(shù)對(duì)所有key 值進(jìn)行處理并將相應(yīng)流表表項(xiàng)保存到Hash桶,當(dāng)遇到Hash桶溢出時(shí),將沖 突的key值擱置;當(dāng)所有key值被循環(huán)一次后,采用第二 Hash函數(shù)對(duì)擱置 的key值進(jìn)行二次處理并將相應(yīng)流表表項(xiàng)保存到Hash桶中。通過(guò)實(shí)驗(yàn)可以 發(fā)現(xiàn),通常將Hash桶深設(shè)置為8到16,并采用兩級(jí)Hash已經(jīng)能夠較好地解決Hash沖突。如果第二 Hash函數(shù)處理key值時(shí)仍出現(xiàn)Hash桶溢出情況, 則再次將沖突的key值擱置,采用第三Hash函數(shù)進(jìn)行處理,直到所有key 值對(duì)應(yīng)的流表表項(xiàng)均成功保存到Hash桶中。如果多級(jí)Hash處理后仍出現(xiàn)沖 突,那么可以將這些key值認(rèn)為是沖突值,不保存相應(yīng)流表表項(xiàng),當(dāng)攜帶這 些key值的報(bào)文來(lái)到時(shí),對(duì)其進(jìn)行丟棄或廣播操作?;蛘撸部梢圆捎煤笫?實(shí)施例三的方案解決。
在實(shí)際中可以采用兩級(jí)、三級(jí)或更多級(jí)的Hash查找,級(jí)數(shù)增多意味著 沖突進(jìn)一步減少,但同時(shí)會(huì)帶來(lái)存儲(chǔ)量增加,計(jì)算量增加的缺陷。
下面結(jié)合圖6示出了一個(gè)實(shí)例,對(duì)本發(fā)明實(shí)施例二的實(shí)現(xiàn)方式進(jìn)一步詳 細(xì)描述。假設(shè)兩級(jí)Hash函數(shù)分別為Hash0(x)和Hashl(x)。 Hash桶桶深為2。
在該兩級(jí)Hash方案中,首先建立并填充預(yù)查找表和Hash桶。具體來(lái)說(shuō),
先采用HashO(x)計(jì)算各個(gè)key值的Index值,如圖6所示,采用預(yù)查找 表順序記錄各Index值對(duì)應(yīng)的Flow值,記錄方式為在Index為基址的內(nèi)部緩 存位置上記錄該Index對(duì)應(yīng)的Flow值;同時(shí),將這些Flow值標(biāo)記為采用 HashO(x)計(jì)算得到,例如圖6中在每個(gè)Flow值之前標(biāo)注HASHO;并且在各 Index對(duì)應(yīng)的外部緩存Hash桶中保存相應(yīng)流表表項(xiàng)。
在HashO(x)的計(jì)算過(guò)程中,對(duì)于發(fā)生Hash沖突的關(guān)鍵字先暫時(shí)擱置, 當(dāng)采用HashO(x)的計(jì)算過(guò)程完成后,繼續(xù)采用Hashl(x)對(duì)沖突部分的key值 進(jìn)行運(yùn)算,得到Indexhl,在預(yù)查找表中與Indexhl的值相同的Index表項(xiàng)中 順序增加Indexw對(duì)應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用Hashl(x)計(jì) 算得到,例如圖6中在每個(gè)Flow值之前標(biāo)注HASHl,并且各Indexw對(duì)應(yīng) 的在外部緩存Hash桶中增加相應(yīng)流表表項(xiàng)。
參見(jiàn)圖6,假設(shè)HashO(keyl)=HashO(key2)=HashO(key3) = Index 1 , HashO(key4)=HashO(key5Hndex2 ,HashO(key6)=Index3 , Hash0(key7)= Hashl(key3)=Index4。那么,在采用HashO(x)處理時(shí),由于HashO(key3)= Indexl ,但I(xiàn)ndexl對(duì)應(yīng)的Hash桶已滿(mǎn),此時(shí)擱置key3;當(dāng)HashO(x)的計(jì)算 過(guò)程完成后,采用Hashl(x)對(duì)key3進(jìn)行處理,由于Hashl(key3)=Index4,因此將key3的流表表項(xiàng)保存到Index4對(duì)應(yīng)的Hash桶中。
圖7為本發(fā)明實(shí)施例二中采用圖6中的預(yù)查找表實(shí)現(xiàn)流表查找的流程
圖。如圖7所示,該流程包括以下步驟
步驟701:從待轉(zhuǎn)發(fā)報(bào)文中提取關(guān)鍵字key-x。
步驟702:采用HashO(x)計(jì)算key-x的Hash索引,記為Indexh0。
步驟703:在內(nèi)部緩存的預(yù)查找表中查找與HashO(x)和Indexho對(duì)應(yīng)的、
且與key-x匹配的Flow值。圖6中的預(yù)查找表以Index為地址記錄信息,因
此本步驟具體為,以Indexho為查找的起始地址,在預(yù)查找表中查找與key-x
匹配的、且標(biāo)記為采用HashO(x)計(jì)算得到的Flow值。
本實(shí)施例中在預(yù)查找表中設(shè)置結(jié)束字段N-VAILD,當(dāng)讀取到N-VAILD
字段時(shí),表示當(dāng)前查找的Indexho對(duì)應(yīng)的表項(xiàng)已經(jīng)查找完畢,沒(méi)有查找到匹
配的Flow值,需要進(jìn)入后續(xù)步驟。本實(shí)施例采用N-VAILD作為結(jié)束字段,
在實(shí)際中也可以采用其它字段,或者當(dāng)讀取完預(yù)設(shè)bit數(shù)目后,仍沒(méi)有找到
匹配值,則確定當(dāng)前Indexho對(duì)應(yīng)的表項(xiàng)已經(jīng)查找完畢。
步驟704:判斷是否查找到匹配值,如果是,則執(zhí)行步驟705;否則,
執(zhí)行步驟706。
步驟705:根據(jù)匹配的Flow值在預(yù)查找表表項(xiàng)中的排序位置,確定key-x 的流表表項(xiàng)在相應(yīng)Hash桶中的偏移位置offsethQ。如前所述,F(xiàn)1OW0表示偏 移量為0, F10W1表示偏移量為1。然后,以Indexh() +offsetho為地址,從外 部緩存中的Hash桶中讀取流表表項(xiàng),^丸行步驟710。
步驟706:采用Hashl(x)計(jì)算key-x的Hash索引,記為Indexhl。
步驟707:在內(nèi)部緩存的預(yù)查找表中查找與Hashl(x)和Indexh,對(duì)應(yīng)的、 且與key-x匹配的Flow值。圖6中的預(yù)查找表以Index為地址記錄信息,因 此本步驟中,以Indexhl為查找的起始地址,在預(yù)查找表中查找與key-x匹配 的、且標(biāo)記為采用Hashl(x)計(jì)算得到的Flow值。
步驟708:判斷是否查找到匹配值,如果是,則執(zhí)行步驟709;否則, 執(zhí)行步驟712。步驟709:根據(jù)匹配的Flow值在預(yù)查找表表項(xiàng)中的排序位置,確定key-x 的流表表項(xiàng)在相應(yīng)Hash桶中的偏移位置offseth,。然后,以Indexh, + offseth, 為地址,從外部緩存中的Hash桶中讀取流表表項(xiàng),執(zhí)行步驟710。
步驟710:判斷key-x是否命中讀取的流表表項(xiàng),如果命中,則執(zhí)行步 驟711;否則,執(zhí)行步驟712。
步驟711:確定命中流表,采用讀取的流表表項(xiàng)對(duì)待轉(zhuǎn)發(fā)報(bào)文進(jìn)行轉(zhuǎn)發(fā) 控制。結(jié)束本流程。
步驟712:確定未命中流表,對(duì)待轉(zhuǎn)發(fā)報(bào)文進(jìn)行未命中流表常規(guī)處理。 結(jié)束本流程。
至此,本流程結(jié)束。
以圖6所示數(shù)值為例,假設(shè)采用圖7的流程對(duì)關(guān)鍵字為key3的報(bào)文進(jìn) 行查流表處理。首先計(jì)算HashO(key3)=Indexl,以Indexl為起始地址,在內(nèi) 部緩存的預(yù)查找表中查找與key3匹配且標(biāo)記為HASH0的FLOW值。當(dāng)讀 取到N-VAILD字段時(shí),獲知Index 1對(duì)應(yīng)的表項(xiàng)已經(jīng)查找完畢,仍沒(méi)有查找 到匹配的Flow值。此后,再計(jì)算Hashl(key3)=Index4,以Index4為起始地 址,在內(nèi)部緩存的預(yù)查找表中查找與key3匹配且標(biāo)記為HASH1的FLOW 值,查找到匹配值FLOWl,并確定偏移位置為1,此時(shí)采用Index4+1為地 址,在外部緩沖中讀取流表表項(xiàng),從該流表表項(xiàng)中獲取key3,判斷該key3 與報(bào)文中提取的key3相同,確定命中流表,進(jìn)行后續(xù)轉(zhuǎn)發(fā)控制操作。
圖7的流程是以?xún)杉?jí)Hash為例,如果采用三級(jí)、四級(jí)或等多級(jí)的Hash, 則在步驟708判定第二級(jí)Hash也未查找到匹配Flow值時(shí),進(jìn)一步采用再下 一級(jí)的預(yù)設(shè)Hash函數(shù)(例如Hash2(x)、 Hash3(x)等等)執(zhí)行所述計(jì)算key-x 的Hash索引以及后續(xù)操作,直到達(dá)到最后一級(jí)預(yù)設(shè)Hash函數(shù)。如果采用最 后一級(jí)Hash函數(shù)仍未查找到匹配Flow值,則再進(jìn)入步驟712或者采用下述 實(shí)施例三的處理方案解決。
可見(jiàn),采用本實(shí)施例二的多級(jí)Hash查找方法同樣只需要訪問(wèn)外部緩存 一次,即可得到所需的流表表項(xiàng),達(dá)到快速查找的目的,而且可以減少?zèng)_突,
19充分利用了 Hash桶資源。 實(shí)施例三
考慮到上述實(shí)施例二中多級(jí)Hash之后仍然會(huì)有很小概率的沖突事件發(fā) 生,例如HashO(key8)=Index2,且Hash 1 (key8)=Index 1 ,由于Indexl和Index2 對(duì)應(yīng)的Hash桶已滿(mǎn),從而產(chǎn)生了沖突。雖然當(dāng)Hash深度設(shè)為8~ 16時(shí),產(chǎn) 生沖突的概率非常小,但是為了進(jìn)一步杜絕沖突,本發(fā)明在本實(shí)施例三中, 在芯片內(nèi)部緩存中進(jìn)一步設(shè)置一個(gè)小的備用Hash表來(lái)解決這種沖突。
圖8為本實(shí)施例三中備用Hash表的示意圖。對(duì)于多級(jí)Hash后仍沖突的 key值,采用不同于HashO(x)和Hashl(x)的備用Hash函數(shù)(記為Hash,(x)) 對(duì)這些key值進(jìn)行Hash運(yùn)算,得到的Hash索引記為Indexh.;采用備用Hash 表記錄key值的Indexh,與key值所屬流表表項(xiàng)的對(duì)應(yīng)關(guān)系。記錄時(shí)可以直接 記錄Indexh,以及對(duì)應(yīng)的流表,也可以以Indexh,為記錄地址,在備用Hash表 中記錄該Indexh,對(duì)應(yīng)的流表表項(xiàng)。
在流表查找時(shí),采用Hash,(x)對(duì)key-x進(jìn)行Hash運(yùn)算,得到Hash索引, 記為Indexh,-x;該查找操作可以在步驟701以后的任意時(shí)刻執(zhí)行,例如步驟 708判定未查找到匹配值時(shí),或與步驟702的找表操作并發(fā)進(jìn)行。以Indexh,-x 為地址,從備用Hash表中讀取流表表項(xiàng),采用讀取的流表表項(xiàng)進(jìn)行后續(xù)判 斷是否命中和轉(zhuǎn)發(fā)控制操作。如果命中,則可以終止查找預(yù)查找表的流程。 如果未命中或不存在Indexh,-x對(duì)應(yīng)的表項(xiàng),則以預(yù)查找表的查找結(jié)果作為流 表查找結(jié)果。在實(shí)際中,也可以當(dāng)在預(yù)查找表中未查找到匹配Flow值時(shí), 再?gòu)膫溆肏ash表中讀取與Indexh.-x對(duì)應(yīng)的流表表項(xiàng)。
該備用Hash表的優(yōu)點(diǎn)是直接放在內(nèi)部緩存,用Hash,(x)得到的值可以 直接查到相應(yīng)的流表表項(xiàng),完全不影響硬件查表速度。
為了實(shí)現(xiàn)上述流表查找方法,本發(fā)明實(shí)施例還提供了相應(yīng)的流表查找裝 置。圖9為本發(fā)明實(shí)施例中流表查找裝置的結(jié)構(gòu)示意圖。如圖9所示,該裝置包括內(nèi)部緩存單元91、外部緩存單元92、關(guān)系建立單元93和流表查找單 元94。
其中,外部緩存單元92采用芯片外部緩存實(shí)現(xiàn),用于以Hash桶形式存 儲(chǔ)流表表項(xiàng)。
內(nèi)部緩存單元91采用芯片內(nèi)部緩存實(shí)現(xiàn),用于存儲(chǔ)預(yù)查找表。 關(guān)系建立單元93,用于采用預(yù)設(shè)Hash函數(shù)建立報(bào)文中的關(guān)鍵字與Hash 索引之間的對(duì)應(yīng)關(guān)系。在預(yù)查找表中,針對(duì)每個(gè)Hash索引,順序記錄該Hash 索引對(duì)應(yīng)的各關(guān)鍵字的部分比特,即Flow值;針對(duì)對(duì)應(yīng)同一關(guān)鍵字的Flow 值和Hash索引,根據(jù)Flow值在預(yù)查找表表項(xiàng)中的排序位置和Hash索引值, 確定該關(guān)鍵字所屬流表表項(xiàng)在外部緩存Hash桶中的記錄位置,在所確定的 記錄位置上記錄該關(guān)鍵字所屬流表表。
其中,在預(yù)查找表中記錄Hash索引與對(duì)應(yīng)的Flow值時(shí),較佳實(shí)施方式 為,以Hash索引為記錄基址,在內(nèi)部緩存單元91中記錄該Hash索引對(duì)應(yīng) 的各Flow值。
關(guān)系建立單元93在確定根據(jù)Flow值在預(yù)查找表表項(xiàng)中的排序位置和 Hash索引值確定相關(guān)流表表項(xiàng)的記錄位置時(shí),以Hash索引值為基址Index, 以Flow值在預(yù)查找表表項(xiàng)中的排序位置為偏移地址offset,將Index+offset 作為所述流表表項(xiàng)在外部緩存中的記錄位置。
為了實(shí)現(xiàn)前述多級(jí)緩存,關(guān)系建立單元93進(jìn)一步用于,當(dāng)采用相同Hash 函數(shù)將多個(gè)關(guān)鍵字映射到同一 Hash索引、且這多個(gè)關(guān)鍵字的數(shù)量大于Hash 桶的桶深,從而出現(xiàn)Hash沖突時(shí),將這多個(gè)關(guān)鍵字分為至少兩個(gè)部分,不 同部分采用不同級(jí)別的預(yù)設(shè)Hash函數(shù)建立關(guān)鍵字與Hash索引之間的對(duì)應(yīng)關(guān) 系。
在這種情況下,該關(guān)系建立單元93還進(jìn)一步在內(nèi)部緩存單元91內(nèi)的預(yù) 查找表中記錄建立Hash索引與關(guān)鍵字之間的對(duì)應(yīng)關(guān)系所采用的預(yù)設(shè)Hash 函數(shù)的標(biāo)識(shí)。
當(dāng)多級(jí)Hash為二級(jí)Hash時(shí),且兩級(jí)預(yù)設(shè)Hash函凄t分別為HashO(x)和Hashl(x),則關(guān)系建立單元93首先采用Hash0(x)計(jì)算各關(guān)4建字的Hash索引, 記為IndexhQ,采用預(yù)查找表順序記錄各Indexho對(duì)應(yīng)的Flow值,且將這些 Flow值標(biāo)記為采用HashO(x)計(jì)算得到;并在各Hash索引為基址的Hash桶 中保存相應(yīng)流表表項(xiàng);
對(duì)于采用HashO(x)計(jì)算Hash索引出現(xiàn)沖突的關(guān)鍵字,采用Hashl(x)計(jì)算 Hash索引,記為Indexhl ,在Indexhl指向的預(yù)查找表表項(xiàng)中順序增加Indexhl對(duì) 應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用Hashl(x)計(jì)算得到;并在各Indexhl 為基址的Hash桶中增加相應(yīng)流表表項(xiàng)。
流表查找單元94,用于采用預(yù)設(shè)Hash函數(shù)計(jì)算待轉(zhuǎn)發(fā)報(bào)文中關(guān)鍵字 key-x的Hash索引,記為Index-x;在內(nèi)部緩存單元91存儲(chǔ)的預(yù)查找表中查 找與Index-x對(duì)應(yīng)的、且與key-x匹配的Flow值;才艮據(jù)該匹配的Flow值在 預(yù)查找表表項(xiàng)中的排序位置和所述Index-x確定所述key-x所屬流表表項(xiàng)的 讀取地址,從外部緩存單元92存儲(chǔ)的Hash桶中讀取流表表項(xiàng)。
當(dāng)關(guān)系建立單元93以Index+offset為記錄地址時(shí),流表查找單元94根 據(jù)Flow值在預(yù)查找表表項(xiàng)中的排序位置,確定key-x所屬流表表項(xiàng)在相應(yīng) Hash桶中的偏移位置offset-x;以Index-x與offset-x之和為讀取地址,從外 部緩存單元92中讀取流表表項(xiàng)。
當(dāng)采用多級(jí)Hash方案時(shí),流表查找單元94具體包括第一級(jí)查找模塊941 和沖突解決模塊942。其中,
第一級(jí)查找模塊941 ,用于采用第一預(yù)設(shè)Hash函數(shù)計(jì)算待轉(zhuǎn)發(fā)報(bào)文中關(guān)鍵 字key-x的Hash索引,記為Indexh0-x;在預(yù)查找表中查找與第一預(yù)設(shè)Hash函 數(shù)和Indexho-x對(duì)應(yīng)的、且與key-x匹配的Flow值;如果查找到,則根據(jù)該匹配 的Flow值在預(yù)查找表表項(xiàng)中的排序位置,確定key-x所屬流表表項(xiàng)在相應(yīng)Hash 桶中的偏移位置offseth(rx;以Indexh『x與offseth(rx之和為讀取地址,從外部緩 存單元92存儲(chǔ)的Hash桶中讀取流表表項(xiàng);如果未查找到,則通知沖突解決模 塊942。
沖突解決模塊942,在接收到所述通知后,采用下一級(jí)預(yù)設(shè)Hash函數(shù)計(jì)算key-x的Hash索引,記為Indexhn-x;在內(nèi)部緩存單元91存儲(chǔ)的預(yù)查找 表中查找與下一級(jí)預(yù)設(shè)Hash函數(shù)和Indexhn-x對(duì)應(yīng)的、且與key-x匹配的 Flow值,如果查找到,根據(jù)匹配的Flow值在表項(xiàng)中的排序位置,確定key-x 所屬流表表項(xiàng)在相應(yīng)Hash桶中的偏移位置offsethn-x;以Indexhn-x與offsethn-x 之和為讀取地址,從外部緩存單元92中讀取流表表項(xiàng),如果未查找到,則 采用再下一級(jí)的預(yù)設(shè)Hash函數(shù)執(zhí)行所述計(jì)算key-x的Hash索引的操作,直 到達(dá)到最后一級(jí)預(yù)設(shè)Hash函數(shù)。
較佳地,關(guān)系建立單元93,進(jìn)一步用于對(duì)采用預(yù)設(shè)Hash函數(shù)均出現(xiàn)沖 突的關(guān)鍵字,采用備用Hash函數(shù)進(jìn)行處理,得到對(duì)應(yīng)的Hash索引,記為 Index,;采用備用Hash表記錄關(guān)鍵字的Indexh,與關(guān)鍵字所屬流表表項(xiàng)之間 的對(duì)應(yīng)關(guān)系,例如以Indexh,為記錄地址,在備用Hash表中記錄Indexh.對(duì)應(yīng) 的流表表項(xiàng)。備用Hash表設(shè)置在內(nèi)部緩存單元91中。
在這種情況下,流表查找單元94進(jìn)一步包括備用查找模塊943,用于 采用備用Hash函數(shù),對(duì)key-x進(jìn)行Hash運(yùn)算,得到Hash索引記為Indexh.-x; 從備用Hash表中讀取與Indexh,-x對(duì)應(yīng)的流表表項(xiàng);如果key-x命中讀取的 流表表項(xiàng),則終止流表查找單元94查找預(yù)查找表的處理,具體可以為通知 第一級(jí)查找模塊941和沖突解決模塊942停止其操作。如果key-x未命中或 不存在Indexh,-x對(duì)應(yīng)的表項(xiàng),則以流表查找單元94的查找結(jié)果作為最終流 表查找結(jié)果。
該流表查找裝置只是完成了流表的查找操作,得到流表表項(xiàng),后續(xù)還需 將查找到的流表表項(xiàng)輸入相關(guān)功能模塊,由相關(guān)功能模塊完成判斷是否命中 流表,以及命中流表后的轉(zhuǎn)發(fā)控制操作和未命中流表后的處理操作。
綜上所述,以上僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的 保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改 進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1、一種流表查找方法,其特征在于,該方法包括A、以報(bào)文特征信息為關(guān)鍵字,采用預(yù)設(shè)散列Hash函數(shù)建立關(guān)鍵字與Hash索引之間的對(duì)應(yīng)關(guān)系;在設(shè)置于內(nèi)部緩存的預(yù)查找表中,針對(duì)每個(gè)Hash索引順序記錄該Hash索引對(duì)應(yīng)的各關(guān)鍵字的部分比特,所述部分比特稱(chēng)為流量特征Flow值;針對(duì)對(duì)應(yīng)同一關(guān)鍵字的Flow值和Hash索引,根據(jù)Flow值在預(yù)查找表表項(xiàng)中的排序位置和Hash索引值,確定該關(guān)鍵字所屬流表表項(xiàng)在外部緩存Hash桶中的記錄位置,在所確定的記錄位置上記錄該關(guān)鍵字所屬流表表項(xiàng);B、查找流表時(shí),采用所述預(yù)設(shè)Hash函數(shù)計(jì)算待處理報(bào)文中關(guān)鍵字key-x的Hash索引,記為Index-x;在所述預(yù)查找表中查找與Index-x對(duì)應(yīng)的、且與key-x匹配的Flow值;根據(jù)該匹配的Flow值在預(yù)查找表表項(xiàng)中的排序位置和所述Index-x確定所述key-x所屬流表表項(xiàng)的讀取地址,從外部緩存中讀取流表表項(xiàng)。
2、 如權(quán)利要求l所述的方法,其特征在于,所述確定該關(guān)^:字所屬流表表 項(xiàng)在外部緩存Hash桶中的記錄位置為以Hash索引值為基址Index,以Flow 值在預(yù)查找表表項(xiàng)中的排序位置為偏移地址offset,將Index+offset作為所述流 表表項(xiàng)在外部緩存中的記錄位置;所述根據(jù)該匹配的Flow值在預(yù)查找表表項(xiàng)中的排序位置和所述Index-x確 定所述key-x所屬流表表項(xiàng)的讀取地址,從外部緩存中讀取流表表項(xiàng)為根據(jù) 該匹配的Flow值在預(yù)查找表表項(xiàng)中的排序位置,確定key-x所屬流表表項(xiàng)在相 應(yīng)Hash桶中的偏移位置offset-x;以Index-x與offset-x之和為讀取地址,從外 部緩存中讀取流表表項(xiàng)。
3、 如權(quán)利要求2所述的方法,其特征在于,所述步驟A進(jìn)一步包括當(dāng) 采用相同Hash函數(shù)將多個(gè)關(guān)鍵字映射到同一 Hash索引、且所述多個(gè)關(guān)鍵字的 數(shù)量大于Hash桶的桶深時(shí),將所述多個(gè)關(guān)鍵字分為至少兩個(gè)部分,不同部分采 用不同級(jí)別的預(yù)設(shè)Hash函數(shù)建立關(guān)鍵字與Hash索引之間的對(duì)應(yīng)關(guān)系;所述預(yù)查找表進(jìn)一步記錄建立Hash索引與關(guān)鍵字之間的對(duì)應(yīng)關(guān)系所采用 的預(yù)設(shè)Hash函數(shù)的標(biāo)識(shí)。
4、 如權(quán)利要求3所述的方法,其特征在于,用于建立所述對(duì)應(yīng)關(guān)系的預(yù)設(shè) Hash函數(shù)為兩級(jí)預(yù)設(shè)Hash函數(shù),分別記為Hash0(x)和Hashl(x);所述步驟A包括采用HashO(x)計(jì)算各關(guān)鍵字的Hash索引,記為Indexh0,采用預(yù)查找表順 序記錄各lndexh。對(duì)應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用HashO(x)計(jì)算得 到;并在各Hash索引為基址的Hash桶中保存相應(yīng)流表表項(xiàng);對(duì)于采用HashO(x)計(jì)算Hash索引出現(xiàn)沖突的關(guān)鍵字,采用Hashl(x)計(jì)算 Hash索引,記為Indexhl,在Indexhl指向的預(yù)查找表表項(xiàng)中順序增加與Indexhl 對(duì)應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用Hashl(x)計(jì)算得到;并在各Indexhl 為基址的Hash桶中增加相應(yīng)流表表項(xiàng)。
5、 如權(quán)利要求3所述的方法,其特征在于,所述步驟B包括采用第一預(yù)設(shè)Hash函數(shù)計(jì)算key-x的Hash索引,記為Indexh(rx;在所述 預(yù)查找表中查找與第一預(yù)設(shè)Hash函數(shù)和Indexho-x對(duì)應(yīng)的、且與key-x匹配的 Flow值;如果查找到,貝']根據(jù)該匹配的Flow值在預(yù)查找表表項(xiàng)中的排序位置,確定 key-x所屬流表表項(xiàng)在相應(yīng)Hash桶中的偏移位置offseth(rx;以Indexh(rx與 offseth(rx之和為讀取地址,從外部緩存中讀取流表表項(xiàng);如果未查找到,則采用下一級(jí)預(yù)設(shè)Hash函數(shù)計(jì)算key-x的Hash索引,記 為Indexhn-x;在所述預(yù)查找表中查找與所述下一級(jí)預(yù)設(shè)Hash函數(shù)和Indexhn-x 對(duì)應(yīng)的、且與key-x匹配的Flow值,如果查找到,根據(jù)匹配的Flow值在預(yù)查 找表表項(xiàng)中的排序位置,確定key-x所屬流表表項(xiàng)在相應(yīng)Hash桶中的偏移位置 offsethn-x;以Indexhn-x與offsethn-x之和為讀取地址,從外部緩存中讀取流表表 項(xiàng),如果未查找到,則采用再下一級(jí)的預(yù)設(shè)Hash函數(shù)執(zhí)行所述計(jì)算key-x的 Hash索引的操作,直到達(dá)到最后一級(jí)預(yù)設(shè)Hash函數(shù)。
6、 如權(quán)利要求1至5任意一項(xiàng)所述的方法,其特征在于,該方法進(jìn)一步包括對(duì)于采用所述預(yù)設(shè)Hash函數(shù)計(jì)算Hash索引出現(xiàn)沖突的關(guān)鍵字,采用備用 Hash函數(shù)進(jìn)行處理,得到的Hash索引記為Indexh,;采用備用Hash表記錄關(guān)鍵 字的Indexh,與關(guān)鍵字所屬流表表項(xiàng)之間的對(duì)應(yīng)關(guān)系;所述步驟B進(jìn)一步包括采用所述備用Hash函數(shù),對(duì)key-x進(jìn)行Hash運(yùn) 算,得到的Hash索引記為Indexh,-x,從所述備用Hash表中讀取與Indexh,-x對(duì) 應(yīng)的流表表項(xiàng);如果key-x命中讀取的流表表項(xiàng),則終止查找預(yù)查找表的流程。
7、 如權(quán)利要求1至5任意一項(xiàng)所述的方法,其特征在于,采用預(yù)查找表記 錄每個(gè)Hash索51對(duì)應(yīng)的各Flow值為以Hash索引為記錄基址,在內(nèi)部緩存 的預(yù)查找表中依次記錄該Hash索引對(duì)應(yīng)的各Flow值。
8、 一種流表查找裝置,其特征在于,該裝置包括內(nèi)部緩存單元、外部緩 存單元、關(guān)系建立單元和流表查找單元;所述外部緩存單元,用于以Hash桶形式存儲(chǔ)流表表項(xiàng); 所述內(nèi)部緩存單元,用于存儲(chǔ)預(yù)查找表;所述關(guān)系建立單元,用于以報(bào)文特征信息為關(guān)鍵字,釆用預(yù)設(shè)Hash函數(shù)建 立關(guān)鍵字與Hash索引之間的對(duì)應(yīng)關(guān)系;在預(yù)查找表中,針對(duì)每個(gè)Hash索引順 序記錄該Hash索引對(duì)應(yīng)的各關(guān)鍵字的部分比特,所述部分比特稱(chēng)為流量特征 Flow值;針對(duì)對(duì)應(yīng)同一關(guān)鍵字的Flow值和Hash索引,根據(jù)Flow值在預(yù)查找 表表項(xiàng)中的排序位置和Hash索引值,確定該關(guān)鍵字所屬流表表項(xiàng)在外部緩存 Hash桶中的記錄位置,在所確定的記錄位置上記錄該關(guān)鍵字所屬流表表;所述流表查找單元,用于采用所述預(yù)設(shè)Hash函數(shù)計(jì)算待處理報(bào)文中關(guān)鍵字 key-x的Hash索引,記為Index-x;在所述預(yù)查找表中查找與Index-x對(duì)應(yīng)的、 且與key-x匹配的Flow值;根據(jù)該匹配的Flow值在預(yù)查找表表項(xiàng)中的排序位 置和所述Index-x確定所述key-x所屬流表表項(xiàng)的讀取地址,從所述外部緩存單 元中讀耳又流表表項(xiàng)。
9、 如權(quán)利要求8所述的裝置,其特征在于,所述關(guān)系建立單元進(jìn)一步用于, 以Hash索引值為基址Index,以Flow值在預(yù)查找表表項(xiàng)中的排序位置為偏移 地址offset,將Index+offset作為所述流表表項(xiàng)在外部緩存中的記錄位置;所述流表查找單元進(jìn)一步用于,根據(jù)Flow值在預(yù)查找表表項(xiàng)中的排序位 置,確定key-x所屬流表表項(xiàng)在相應(yīng)Hash桶中的偏移位置offset-x;以Index-x 與offset-x之和為讀取地址,從外部緩存單元中讀取流表表項(xiàng)。
10、 如權(quán)利要求9所述的裝置,其特征在于,所述關(guān)系建立單元進(jìn)一步用 于,當(dāng)采用相同Hash函數(shù)將多個(gè)關(guān)鍵字映射到同一 Hash索引、且所述多個(gè)關(guān) 鍵字的數(shù)量大于Hash桶的桶深時(shí),將所述多個(gè)關(guān)鍵字分為至少兩個(gè)部分,不同 部分采用不同級(jí)別的預(yù)設(shè)Hash函數(shù)建立關(guān)鍵字與Hash索引之間的對(duì)應(yīng)關(guān)系;該關(guān)系建立單元還進(jìn)一步在預(yù)查找表中記錄建立Hash索引與關(guān)鍵字之間 的對(duì)應(yīng)關(guān)系所采用的預(yù)設(shè)Hash函數(shù)的標(biāo)識(shí)。
11、 如權(quán)利要求IO所述的裝置,其特征在于,所述流表查找單元包括第一 級(jí)查找單元和沖突解決單元;第一級(jí)查找單元,用于采用第一預(yù)設(shè)Hash函數(shù)計(jì)算待處理報(bào)文中關(guān)鍵字 key-x的Hash索引,記為Indexh(rx;在所述預(yù)查找表中查找與第一預(yù)設(shè)Hash 函數(shù)和Indexho對(duì)應(yīng)的、且與key-x匹配的Flow值;如果查找到,則根據(jù)該匹 配的Flow值在預(yù)查找表表項(xiàng)中的排序位置,確定key-x所屬流表表項(xiàng)在相應(yīng) Hash桶中的偏移位置offsetho-x ;以Indexh(rx與offseth(rx之和為讀取地址,從 所述外部緩存單元讀取流表表項(xiàng);如果未查找到,則通知所述沖突解決單元;所述沖突解決單元,在接收到所述通知后,采用下一級(jí)預(yù)設(shè)Hash函數(shù)計(jì)算 key-x的Hash索引,記為Indexhn-x;在所述預(yù)查找表中查找與所述下一級(jí)預(yù)設(shè) Hash函數(shù)和Indexhn-x對(duì)應(yīng)的、且與key-x匹配的Flow值,如果查找到,根據(jù) 匹配的Flow值在表項(xiàng)中的排序位置,確定key-x所屬流表表項(xiàng)在相應(yīng)Hash桶 中的偏移位置offsethn-x;以Indexhn-x與offsethn-x之和為讀取地址,從所述外部 緩存單元中讀取流表表項(xiàng),如果未查找到,則采用再下一級(jí)的預(yù)設(shè)Hash函數(shù)執(zhí) 行所述計(jì)算key-x的Hash索引的操作,直到達(dá)到最后一級(jí)預(yù)設(shè)Hash函數(shù)。
12、 如權(quán)利要求8至11任意一項(xiàng)所述的裝置,其特征在于,所述內(nèi)部緩存 單元進(jìn)一步存儲(chǔ)備用Hash表;所述關(guān)系建立單元,進(jìn)一步用于對(duì)采用所述預(yù)設(shè)Hash函數(shù)計(jì)算Hash索引出現(xiàn)沖突的關(guān)鍵字,采用備用Hash函數(shù)進(jìn)行處理,得到對(duì)應(yīng)的Hash索引,記 為Indexh,;采用備用Hash表記錄關(guān)鍵字的Indexh,與關(guān)鍵字的所屬流表表項(xiàng)之 間的對(duì)應(yīng)關(guān)系;所述流表查找單元進(jìn)一步包括備用查找模塊,用于采用所述備用Hash函 數(shù),對(duì)key-x進(jìn)行Hash運(yùn)算,得到Hash索引記為Indexh,-x;從所述備用Hash 表中讀取與Indexh,-x對(duì)應(yīng)的流表表項(xiàng);如果key-x命中讀取的流表表項(xiàng),則終 止流表查找單元查找預(yù)查找表的處理。
13、如權(quán)利要求8至ll任意一項(xiàng)所述的裝置,其特征在于,所述關(guān)系建立 單元在針對(duì)每個(gè)Hash索引順序記錄該Hash索引對(duì)應(yīng)的各Flow值時(shí),以Hash 索引為記錄基址,在所述內(nèi)部緩存單元中依次記錄該Hash索引對(duì)應(yīng)的各Flow 值。
全文摘要
本發(fā)明公開(kāi)了一種流表查找方法和裝置,所述方法在芯片內(nèi)部緩存中設(shè)置預(yù)查找表,采用該預(yù)查找表記錄關(guān)鍵字及其Index的對(duì)應(yīng)關(guān)系,記錄時(shí)只記錄關(guān)鍵字的部分字段稱(chēng)為Flow值。關(guān)鍵字的Flow值在預(yù)查找表的記錄位置與關(guān)鍵字對(duì)應(yīng)的流表表項(xiàng)在Hash桶中的記錄位置相應(yīng)。在為報(bào)文查找所需流表表項(xiàng)時(shí),可以根據(jù)對(duì)報(bào)文關(guān)鍵字進(jìn)行Hash運(yùn)算得到的Index以及與報(bào)文關(guān)鍵字匹配的Flow值在預(yù)查找表表項(xiàng)中位置,確定所需流表表項(xiàng)在外部緩存中的記錄位置,然后只需要訪問(wèn)外部緩存一次,即可得到所需的流表表項(xiàng),從而達(dá)到快速查找的目的。
文檔編號(hào)H04L12/56GK101540723SQ200910082268
公開(kāi)日2009年9月23日 申請(qǐng)日期2009年4月20日 優(yōu)先權(quán)日2009年4月20日
發(fā)明者彬 王 申請(qǐng)人:杭州華三通信技術(shù)有限公司
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
青神县| 扶余县| 开原市| 特克斯县| 栖霞市| 含山县| 鸡泽县| 饶平县| 庄浪县| 广东省| 延津县| 河南省| 海南省| 中牟县| 上杭县| 富裕县| 离岛区| 肥西县| 平原县| 金川县| 宁德市| 崇礼县| 萍乡市| 庄浪县| 日土县| 沙坪坝区| 永泰县| 石首市| 紫阳县| 盈江县| 屯昌县| 泉州市| 中西区| 尼玛县| 德惠市| 古蔺县| 无为县| 资阳市| 甘肃省| 当雄县| 泸定县|