專利名稱:一種流表查找方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)通信技術(shù),具體涉及一種提高流表查找性能的方法和裝置。
背景技術(shù):
在數(shù)據(jù)通信領(lǐng)域中,會涉及到一些二、三層數(shù)據(jù)轉(zhuǎn)發(fā)的控制。該數(shù)據(jù)轉(zhuǎn) 發(fā)是通過查找流表得到數(shù)據(jù)的出接口或者其它一些屬性值。流表的查找效率 影響著數(shù)據(jù)在網(wǎng)絡(luò)上的高效傳輸,如何快速實現(xiàn)高效的查找是實現(xiàn)高速報文 轉(zhuǎn)發(fā)的一個研究重點。
圖1為現(xiàn)有技術(shù)中流表查找和匹配過程的流程圖。如圖1所示,當(dāng)報文
到達(dá)后,從報文中提取用于散列(Hash)運算的關(guān)鍵字(key),該關(guān)鍵字 為報文特征信息,具體可以根據(jù)實際網(wǎng)絡(luò)、功能等需求預(yù)先確定,例如可以 為介質(zhì)訪問控制(MAC)地址、IP地址、虛擬局域網(wǎng)標(biāo)識(VLAN ID)等 等。然后采用一種Hash函數(shù)對提取的關(guān)鍵字進行Hash運算,得到的運算結(jié) 果稱為Hash索引,簡稱Index。 Index指示出對當(dāng)前被處理報文進行轉(zhuǎn)發(fā)控 制的流表表項在外部緩存中的地址。然后,以Index為讀取地址,在存儲于 外部緩存的流表中讀取流表表項。流表表項中包含所述關(guān)鍵字,還包括出接 口等一系列用于轉(zhuǎn)發(fā)控制的屬性值。在讀取流表表項后,需要判斷從報文中 提取的關(guān)鍵字是否與所讀取流表表項中的關(guān)鍵字相匹配,如果匹配,則確定 命中流表,采用讀取的流表表項對報文進行轉(zhuǎn)發(fā)控制;否則確定未命中流表, 對才艮文進行未命中流表的處理,例如丟棄或廣播該報文。
Hash函數(shù)所建立的關(guān)鍵字到Index的映射是多對一的映射關(guān)系,也就是 說,多個不同的關(guān)^t字經(jīng)同一Hash函數(shù)處理后,得到相同的Index,那么這個Index作為地址的位置上需要保存對應(yīng)的所有關(guān)鍵字,而一個存儲地址無 法保存多個數(shù)據(jù),這種現(xiàn)象稱為Hash沖突。
目前可以采用Hash桶的形式解決這種沖突,圖2為外部緩存中采用 Hash桶存儲流表表項的示意圖。如圖2所示,假設(shè)keyl、 key2和key3經(jīng)同 一函數(shù)Hash(x)的運算后均得到Indexl,那么以Indexl為基址的Hash桶需 要依次存儲key 1 、 key2和key3所屬的流表表項。同理,key4和key5經(jīng)Hash(x) 運算后均得到Index2,以Index2為基址的Hash桶需要依次存儲key4和key5 所屬的流表表項;key6經(jīng)Hash(x)運算后得到Index3,以Index3為基址的 Hash桶只需存儲key6所屬的流表表項。在流表查找時,根據(jù)從報文提取的 關(guān)鍵字得到Index,從Index指示的Hash桶中依次讀取各流表表項并確定讀 取的表項判斷是否為匹配表項,從而判定是否命中流表,并根據(jù)判斷結(jié)果進 行后續(xù)處理。圖2中的"……"表示表項中除key值以外的其它內(nèi)容。可見, 采用這種Hash桶的方式解決了多個關(guān)鍵字對應(yīng)相同Index帶來的沖突問題。
但是,如果匹配表項不在Hash桶的頂層,例如key3對應(yīng)的表項在Hash 桶的第三層,那么需要在以Indexl為基址的Hash桶中讀取和匹配3次,才 能夠命中到匹配表項。由于流表設(shè)置在通信設(shè)備處理芯片的外部緩存,訪問 速度不夠快,因此在Hash桶較深的情況下雖然可以在一定程度上解決Hash 沖突問題,但是由于查找速度低,會嚴(yán)重影響報文轉(zhuǎn)發(fā)性能。
而且,由于各個Hash桶的深度相同、但同一 Index對應(yīng)的關(guān)鍵字?jǐn)?shù)量 卻有所不同,因此有些Hash桶的利用率較高,例如圖2中Indexl地址處的 Hash桶,而有些Hash桶的利用率卻很低,例如圖2中Index3地址處的Hash 桶。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明提供了一種流表查找方法,能夠提高流表查找速度。 該方法包括
A、以報文特征信息為關(guān)鍵字,采用預(yù)設(shè)散列Hash函數(shù)建立關(guān)鍵字與Hash索引之間的對應(yīng)關(guān)系;在設(shè)置于內(nèi)部緩存的預(yù)查找表中,針對每個Hash索引順 序記錄該Hash索引對應(yīng)的各關(guān)鍵字的部分比特,所述部分比特稱為流量特征 Flow值;針對對應(yīng)同 一關(guān)4建字的Flow值和Hash索引,根椐Flow值在預(yù)查找 表表項中的排序位置和Hash索引值,確定該關(guān)鍵字所屬流表表項在外部緩存 Hash桶中的記錄位置,在所確定的記錄位置上記錄該關(guān)鍵字所屬流表表項;
B、查找流表時,采用所述預(yù)設(shè)Hash函數(shù)計算待處理報文中關(guān)鍵字key-x 的Hash索引,記為Index-x;在所述預(yù)查找表中查找與Index-x對應(yīng)的、且 與key-x匹配的Flow值;根據(jù)該匹配的Flow值在預(yù)查找表表項中的排序位 置和所述Index-x確定所述key-x所屬流表表項的讀取地址,從外部緩存中 讀取流表表項。
較佳地,所述確定該關(guān)鍵字所屬流表表項在外部緩存Hash桶中的記錄位置 為以Hash索引值為基址Index,以Flow值在預(yù)查找表表項中的排序位置為 偏移地址offset,將Index+offset作為所述流表表項在外部緩存中的記錄位置;
所述根據(jù)該匹配的Flow值在預(yù)查找表表項中的排序位置和所述Index-x確 定所述key-x所屬流表表項的讀取地址,從外部緩存中讀取流表表項為根據(jù) 該匹配的Flow值在預(yù)查找表表項中的排序位置,確定key-x所屬流表表項在相 應(yīng)Hash桶中的偏移位置offset-x;以Index-x與offset-x之和為讀取地址,從外 部緩存中讀取流表表項。
較佳地,所述步驟A進一步包括當(dāng)采用相同Hash函數(shù)將多個關(guān)鍵字映 射到同一Hash索引、且所述多個關(guān)鍵字的數(shù)量大于Hash桶的桶深時,將所述 多個關(guān)鍵字分為至少兩個部分,不同部分采用不同級別的預(yù)設(shè)Hash函數(shù)建立關(guān) 鍵字與Hash索引之間的對應(yīng)關(guān)系;
所述預(yù)查找表進一步記錄建立Hash索引與關(guān)鍵字之間的對應(yīng)關(guān)系所采用 的預(yù)i殳Hash函數(shù)的標(biāo)識。
較佳地,用于建立所述對應(yīng)關(guān)系的預(yù)設(shè)Hash函數(shù)為兩級預(yù)設(shè)Hash函數(shù), 分別記為Hash0(x)和Hashl(x);
所述步驟A包括采用HashO(x)計算各關(guān)鍵字的Hash索引,記為Indexh(),采用預(yù)查找表順 序記錄各Indexh。對應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用HashO(x)計算得 到;并在各Hash索《1為基址的Hash桶中保存相應(yīng)流表表項;
對于采用HashO(x)計算Hash索引出現(xiàn)沖突的關(guān)鍵字,采用Hashl(x)計算 Hash索引,記為Indexhl,在Indexhl指向的預(yù)查找表表項中順序增加與Indexhl 對應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用Hashl(x)計算得到;并在各IndeXh, 為基址的Hash桶中增加相應(yīng)流表表項。
所述步驟B包括
采用第一預(yù)設(shè)Hash函數(shù)計算key-x的Hash索引,記為Indexh(rx;在所述 預(yù)查找表中查找與第一預(yù)設(shè)Hash函數(shù)和Indexh(rx對應(yīng)的、且與key-x匹配的 Flow值;
如果查找到,則根據(jù)該匹配的Flow值在預(yù)查找表表項中的排序位置,確定 key-x所屬流表表項在相應(yīng)Hash桶中的偏移位置offseth(rx;以Indexh(rx與 offseth(rx之和為讀取地址,從外部緩存中讀取流表表項;
如果未查找到,則采用下一級預(yù)設(shè)Hash函數(shù)計算key-x的Hash索引,記 為Indexhn-x;在所述預(yù)查找表中查找與所述下一級預(yù)設(shè)Hash函數(shù)和Indexhn-x 對應(yīng)的、且與key-x匹配的Flow值,如果查找到,根據(jù)匹配的Flow值在預(yù)查 找表表項中的排序位置,確定key-x所屬流表表項在相應(yīng)Hash桶中的偏移位置 offsethn-x;以Indexhn-x與offsethn-x之和為讀取地址,從外部緩存中讀取流表表 項,如果未查找到,則采用再下一級的預(yù)i殳Hash函數(shù)執(zhí)行所述計算key-x的 Hash索引的操作,直到達(dá)到最后一級預(yù)設(shè)Hash函數(shù)。
較佳地,該方法進一步包括對于采用所述預(yù)設(shè)Hash函數(shù)計算Hash索引 出現(xiàn)沖突的關(guān)鍵字,采用備用Hash函數(shù)進行處理,得到的Hash索引記為Indexh,; 采用備用Hash表記錄關(guān)鍵字的Indexh,與關(guān)鍵字所屬流表表項之間的對應(yīng)關(guān)系;
所述步驟B進一步包括采用所述備用Hash函數(shù),對key-x進行Hash運 算,得到的Hash索引記為Indexh.-x,從所述備用Hash表中讀取與Indexh,-x對 應(yīng)的流表表項;如果key-x命中讀取的流表表項,則終止查找預(yù)查找表的流程。較佳地,采用預(yù)查找表記錄每個Hash索引對應(yīng)的各Flow值為以Hash 索引為記錄基址,在內(nèi)部緩存的預(yù)查找表中依次記錄該Hash索引對應(yīng)的各Flow值。
本發(fā)明還提供了一種流表查找裝置,能夠提高流表查找速度。 該裝置包括內(nèi)部緩存單元、外部緩存單元、關(guān)系建立單元和流表查找單
元;
所述外部緩存單元,用于以Hash桶形式存儲流表表項; 所述內(nèi)部緩存單元,用于存儲預(yù)查找表;
所述關(guān)系建立單元,用于以報文特征信息為關(guān)鍵字,采用預(yù)設(shè)Hash函數(shù)建 立關(guān)鍵字與Hash索引之間的對應(yīng)關(guān)系;在預(yù)查找表中,針對每個Hash索引順 序記錄該Hash索引對應(yīng)的各關(guān)鍵字的部分比特,所述部分比特稱為流量特征 Flow值;針對對應(yīng)同 一關(guān)鍵字的Flow值和Hash索引,根據(jù)Flow值在預(yù)查找 表表項中的排序位置和Hash索引值,確定該關(guān)鍵字所屬流表表項在外部緩存 Hash桶中的記錄位置,在所確定的記錄位置上記錄該關(guān)鍵字所屬流表表;
所述流表查找單元,用于采用所述預(yù)設(shè)Hash函數(shù)計算待處理報文中關(guān) 鍵字key-x的Hash索引,記為Index-x;在所述預(yù)查找表中查找與Index-x 對應(yīng)的、且與key-x匹配的Flow值;根據(jù)該匹配的Flow值在預(yù)查找表表項 中的排序位置和所述Index-x確定所述key-x所屬流表表項的讀取地址,從 所述外部緩存單元中讀取流表表項。
所述關(guān)系建立單元進一步用于,以Hash索引值為基址Index,以Flow值在 預(yù)查找表表項中的排序位置為偏移地址offset,將Index+offset作為所述流表表 項在外部緩存中的記錄位置;
所述流表查找單元進一步用于,根據(jù)該匹配的Flow值在預(yù)查找表表項 中的排序位置,確定key-x所屬流表表項在相應(yīng)Hash桶中的偏移位置 offset-x;以Index-x與offset-x之和為讀取地址,從外部緩存中讀取流表表 項。
其中,所述關(guān)系建立單元進一步用于,當(dāng)采用相同Hash函數(shù)將多個關(guān)鍵字
11映射到同一Hash索引、且所述多個關(guān)鍵字的數(shù)量大于Hash桶的桶深時,將所 述多個關(guān)鍵字分為至少兩個部分,不同部分采用不同級別的預(yù)設(shè)Hash函數(shù)建立 關(guān)鍵字與Hash索引之間的對應(yīng)關(guān)系;
該關(guān)系建立單元還進一步在預(yù)查找表中記錄建立Hash索引與關(guān)鍵字之間 的對應(yīng)關(guān)系所采用的預(yù)設(shè)Hash函數(shù)的標(biāo)識。
其中,所述流表查找單元包括第一級查找單元和沖突解決單元;
第一級查找單元,用于采用第一預(yù)設(shè)Hash函數(shù)計算待處理報文中關(guān)鍵字 key-x的Hash索引,記為Indexh0-x;在所述預(yù)查找表中查找與第一預(yù)設(shè)Hash 函數(shù)和Indexho對應(yīng)的、且與key-x匹配的Flow值;如果查找到,則根據(jù)該匹 配的Flow值在預(yù)查找表表項中的排序位置,確定key-x所屬流表表項在相應(yīng) Hash桶中的偏移位置offsetho-x ;以Indexh(rx與offsethQ-x之和為讀取地址,從 所述外部緩存單元讀取流表表項;如果未查找到,則通知所述沖突解決單元;
所述沖突解決單元,在接收到所述通知后,采用下一級預(yù)設(shè)Hash函數(shù)計算 key-x的Hash索引,記為Indexhn-x;在所述預(yù)查找表中查找與所述下一級預(yù)設(shè) Hash函數(shù)和Indexhn-x對應(yīng)的、且與key-x匹配的Flow值,如果查找到,根據(jù) 匹配的Flow值在表項中的排序位置,確定key-x所屬流表表項在相應(yīng)Hash桶 中的偏移位置offsethn-x;以Indexhn-x與offsethn-x之和為讀取地址,從所述外部 緩存單元中讀取流表表項,.如果未查找到,則采用再下一級的預(yù)設(shè)Hash函數(shù)執(zhí) 行所述計算key-x的Hash索引的操作,直到達(dá)到最后一級預(yù)設(shè)Hash函數(shù)。
較佳地,所述內(nèi)部緩存單元進一步存儲備用Hash表;
所述關(guān)系建立單元,進一步用于對采用所述預(yù)設(shè)Hash函數(shù)均出現(xiàn)沖突的關(guān) 鍵字,采用備用Hash函數(shù)進行處理,得到對應(yīng)的Hash索引,記為Index';采 用備用Hash表記錄關(guān)鍵字的Indexh,與關(guān)鍵字的所屬流表表項之間的對應(yīng)關(guān)系;
所述流表查找單元進一步包括備用查找模塊,用于采用所述備用Hash函 數(shù),對key-x進行Hash運算,得到Hash索引記為Indexh,-x;從所述備用Hash 表中讀取與Indexh,-x對應(yīng)的流表表項;如果key-x命中讀取的流表表項,則終 止流表查找單元查找預(yù)查找表的處理。較佳地,所述關(guān)系建立單元在針對每個Hash索引順序記錄該Hash索引 對應(yīng)的各Flow值時,以Hash索引為記錄基址,在所述內(nèi)部緩存單元中依次 記錄該Hash索引對應(yīng)的各Flow值。
根據(jù)以上技術(shù)方案可見,本發(fā)明在存儲于內(nèi)部緩存的預(yù)查找表中記錄各 個Index與關(guān)鍵字的對應(yīng)關(guān)系,記錄時只記錄關(guān)鍵字的部分字段,稱為Flow 值,以適應(yīng)內(nèi)部緩存極為有限的存儲空間。同時,關(guān)鍵字的Flow值在預(yù)查 找表的記錄位置與關(guān)鍵字對應(yīng)的流表表項在Hash桶中的記錄位置相應(yīng),這 樣,在流表查找時,可以根據(jù)對報文的關(guān)鍵字進行Hash運算得到的Index, 以及與報文關(guān)鍵字匹配的Flow值在預(yù)查找表表項中位置,確定所需流表表 項在外部緩存中的具體位置,然后只需要訪問外部緩存一次,即可得到所需 的流表表項,無需像現(xiàn)有技術(shù)一樣在Hash桶中逐一查找和匹配,從而達(dá)到 快速查找的目的。而且由于預(yù)查找表設(shè)置在芯片內(nèi)部緩存,查找速度快,進 一步提高查找速度。
其次,本發(fā)明提供的多級Hash查找方案,可以減少Hash沖突,且充分 利用Hash桶資源。
此外,本發(fā)明進一步在內(nèi)部緩存中設(shè)置備用Hash表,可以進一步減少 Hash沖突,且由于備用Hash表直接設(shè)置在內(nèi)部緩存,因此查找速度快,不 影響預(yù)查找表的查找過程。
圖1為現(xiàn)有技術(shù)中流表查找和匹配過程的流程圖。 圖2為現(xiàn)有技術(shù)中流表的存儲方式示意圖。 圖3為本發(fā)明實施例中預(yù)查找表的一種實現(xiàn)示意圖。 圖4為本發(fā)明實施例中預(yù)查找表的另一種實現(xiàn)示意圖。 圖5為本發(fā)明實施例一中流表查找的實例示意圖。 圖6為本發(fā)明實施例二中流表查找的實例示意圖。
圖7為本發(fā)明實施例二中采用圖6中的預(yù)查找表實現(xiàn)流表查找的流程圖。
圖8為本發(fā)明實施例三中備用Hash表的示意圖。 圖9為本發(fā)明實施例中流表查找裝置的結(jié)構(gòu)示意圖。
具體實施例方式
下面結(jié)合附圖并舉實施例,對本發(fā)明進行詳細(xì)描述。
本發(fā)明實施例一提供了一種流表查找方法,其基本思想為在芯片內(nèi)部 緩存中設(shè)置預(yù)查找表,在該預(yù)查找表中,針對每個Index,順序記錄該Index 對應(yīng)的各關(guān)鍵字的部分比特,本發(fā)明將該部分比特稱為流量特征值,簡稱為 Flow值;針對對應(yīng)同 一關(guān)4走字的Flow值和Hash索引,根據(jù)Flow值在預(yù)查 找表表項中的排序位置和Hash索引值,確定該關(guān)鍵字所屬流表表項在外部 緩存Hash桶中的記錄位置,在所確定的記錄位置上記錄該關(guān)鍵字所屬流表 表項。
查找流表時,采用預(yù)設(shè)Hash函數(shù)計算待轉(zhuǎn)發(fā)報文中關(guān)鍵字key-x的Hash 索引,記為Index-x;在預(yù)查找表中查找與Index-x對應(yīng)的、且與key-x匹配 的Flow值;根據(jù)該匹配的Flow值在表項中的排序位置和Index-x確定key-x 所屬流表表項的讀取地址,從外部緩存中讀取流表表項。
然后,對讀取的流表表項判斷是否為命中表項,如果是,則采用讀取的 流表表項執(zhí)行轉(zhuǎn)發(fā)控制操作,如果不是,則對報文進行未命中流表的處理, 例如丟棄或廣播該報文。
其中,由于芯片內(nèi)部緩存容量極為有限,F(xiàn)low值可以采用關(guān)鍵字中的 2~4bit,例如前2 4bit,或后2 ~ 4bit。當(dāng)然,在緩存容量允許的情況下, Flow值的長度可以設(shè)置較長,長度越長,則匹配的準(zhǔn)確性越高。關(guān)鍵字可 以取報文中的MAC地址、IP地址或VLAN ID值等報文特征信息。
采用預(yù)查找表記錄Index對應(yīng)的Flow值時,可以如圖3所示,在預(yù)查 找表中對應(yīng)記錄Index值以及各Flow值。為了進一步節(jié)省存儲空間,較佳 地實施方式為如圖4所示,以Index為記錄基址,在內(nèi)部緩存的預(yù)查找表中
14記錄該Index對應(yīng)的各Flow值。
其中,根據(jù)Flow值在預(yù)查找表表項中的排序位置和Index確定相關(guān)流 表表項在Hash桶中的存儲位置時,可以以Index為基址,以Flow值在預(yù)查 找表表項中的排序位置為偏移地址offset,將Index+offset作為相關(guān)流表表 項在外部緩存中的記錄位置。那么在查找流表時,在按照上述實施例一的流 程確定Index-x和Flow值之后,確定key-x所屬流表表項在相應(yīng)Hash桶中 的偏移位置offset-x,以Index-x與offset-x之和為讀取地址,從外部緩存中 讀取流表表項。這種實施方式比較簡單,采用加法作為變換關(guān)系。在實際中 還可以采用其他的變換關(guān)系確定相關(guān)流表表項的存儲地址。
為了便于理解,針對實施例一舉一個實例。圖5示出了本實施例一中采 用圖4的預(yù)查找表進行流表查找的一實例示意圖。如圖5所示,對報文中可 能出現(xiàn)的各key值進行Hash運算。假設(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,同時按照相同順序,在以Indexl為基址的外部緩存Hash桶中記 錄keyl和key2的流表表項。以此類推,從而建立其如圖5中示出的預(yù)查找 表和Hash桶。圖5所示F1OW0和FlOWl僅代表Flow值的位置,不表示具 體數(shù)值,如果查找到FlOW0,表示偏移量為0,查找到FlOWl ,表示偏移 量為1。 Hash桶的深度為2。
流表查找時,參見圖5,假設(shè)從當(dāng)前報文中提取關(guān)鍵字key2,對key2 進行Hash(x)運算得到Indexl,以Indexl為起始地址在內(nèi)部緩存的預(yù)查找表 中查找與Indexl對應(yīng)的各Flow值,并依次讀耳又并與key2進行匹配,結(jié)果 匹配到第一行的F10W1,此時確定偏移量為1。然后以(Indexl + 1)為地址, 在外部緩存中直接讀取key2所在流表表項。然后,判斷從報文中提取的關(guān) 鍵字key2是否與流表表項中的key2相同;如果相同,則確定命中流表,采 用讀取的流表表項對當(dāng)前報文進行轉(zhuǎn)發(fā)控制;如果確定未命中流表,出現(xiàn)沖突,對沖突報文進行常規(guī)處理,例如丟棄或廣播。
可見,采用本實施例的流表查找方法可以利用預(yù)查找表快速確定所需流 表表項在外部緩存中的位置,然后只需要訪問外部緩存一次,即可得到所需
的流表表項,無需像現(xiàn)有技術(shù)一樣在Hash桶中逐一查找和匹配,從而達(dá)到 快速查找的目的。
實施例二
采用實施例 一 的方案可能產(chǎn)生Hash沖突。假設(shè)存在Hash(key3)=Index 1, 且Indexl對應(yīng)的Hash桶已滿,無法再容納key3的流表表項,則key3為沖 突關(guān)鍵字。 一種解決方式是通過調(diào)整Hash桶的桶高來容納更多的表項,但 是調(diào)整桶高時需要對所有Hash桶實施相同調(diào)整,這樣會降低Hash桶的利用率。
為此,本發(fā)明的實施例二提出一種多級Hash的流表查找方法,不僅解 決了上述可能產(chǎn)生的Hash沖突,還有效地利用Hash桶的剩余空間。該實施 例中,針對采用相同Hash函數(shù)將較多關(guān)鍵字映射到同一 Index值、且較多 關(guān)鍵字的數(shù)量大于Hash桶深的情況,將該較多關(guān)鍵字分為至少兩個部分, 不同部分采用不同級別的預(yù)i殳Hash函數(shù)進行處理,從而得到不同的Index 值,這樣使得該較多關(guān)鍵字可以保存到不同的Hash桶中。同時,還需要對 前述預(yù)查找表進行改進在預(yù)查找表中記錄每個Index對應(yīng)的多個關(guān)鍵字部 分比特(Flow值)時,還需要進一步記錄建立Index與關(guān)鍵字之間對應(yīng)關(guān) 系所采用的Hash函數(shù)的標(biāo)識。
需要注意的是,每一部分的關(guān)鍵字?jǐn)?shù)量應(yīng)該不超過相應(yīng)Hash桶的剩余 空間。為此,在實際建立預(yù)查找表時,可以先采用第一 Hash函數(shù)對所有key 值進行處理并將相應(yīng)流表表項保存到Hash桶,當(dāng)遇到Hash桶溢出時,將沖 突的key值擱置;當(dāng)所有key值被循環(huán)一次后,采用第二 Hash函數(shù)對擱置 的key值進行二次處理并將相應(yīng)流表表項保存到Hash桶中。通過實驗可以 發(fā)現(xiàn),通常將Hash桶深設(shè)置為8到16,并采用兩級Hash已經(jīng)能夠較好地解決Hash沖突。如果第二 Hash函數(shù)處理key值時仍出現(xiàn)Hash桶溢出情況, 則再次將沖突的key值擱置,采用第三Hash函數(shù)進行處理,直到所有key 值對應(yīng)的流表表項均成功保存到Hash桶中。如果多級Hash處理后仍出現(xiàn)沖 突,那么可以將這些key值認(rèn)為是沖突值,不保存相應(yīng)流表表項,當(dāng)攜帶這 些key值的報文來到時,對其進行丟棄或廣播操作。或者,也可以采用后述 實施例三的方案解決。
在實際中可以采用兩級、三級或更多級的Hash查找,級數(shù)增多意味著 沖突進一步減少,但同時會帶來存儲量增加,計算量增加的缺陷。
下面結(jié)合圖6示出了一個實例,對本發(fā)明實施例二的實現(xiàn)方式進一步詳 細(xì)描述。假設(shè)兩級Hash函數(shù)分別為Hash0(x)和Hashl(x)。 Hash桶桶深為2。
在該兩級Hash方案中,首先建立并填充預(yù)查找表和Hash桶。具體來說,
先采用HashO(x)計算各個key值的Index值,如圖6所示,采用預(yù)查找 表順序記錄各Index值對應(yīng)的Flow值,記錄方式為在Index為基址的內(nèi)部緩 存位置上記錄該Index對應(yīng)的Flow值;同時,將這些Flow值標(biāo)記為采用 HashO(x)計算得到,例如圖6中在每個Flow值之前標(biāo)注HASHO;并且在各 Index對應(yīng)的外部緩存Hash桶中保存相應(yīng)流表表項。
在HashO(x)的計算過程中,對于發(fā)生Hash沖突的關(guān)鍵字先暫時擱置, 當(dāng)采用HashO(x)的計算過程完成后,繼續(xù)采用Hashl(x)對沖突部分的key值 進行運算,得到Indexhl,在預(yù)查找表中與Indexhl的值相同的Index表項中 順序增加Indexw對應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用Hashl(x)計 算得到,例如圖6中在每個Flow值之前標(biāo)注HASHl,并且各Indexw對應(yīng) 的在外部緩存Hash桶中增加相應(yīng)流表表項。
參見圖6,假設(shè)HashO(keyl)=HashO(key2)=HashO(key3) = Index 1 , HashO(key4)=HashO(key5Hndex2 ,HashO(key6)=Index3 , Hash0(key7)= Hashl(key3)=Index4。那么,在采用HashO(x)處理時,由于HashO(key3)= Indexl ,但Indexl對應(yīng)的Hash桶已滿,此時擱置key3;當(dāng)HashO(x)的計算 過程完成后,采用Hashl(x)對key3進行處理,由于Hashl(key3)=Index4,因此將key3的流表表項保存到Index4對應(yīng)的Hash桶中。
圖7為本發(fā)明實施例二中采用圖6中的預(yù)查找表實現(xiàn)流表查找的流程
圖。如圖7所示,該流程包括以下步驟
步驟701:從待轉(zhuǎn)發(fā)報文中提取關(guān)鍵字key-x。
步驟702:采用HashO(x)計算key-x的Hash索引,記為Indexh0。
步驟703:在內(nèi)部緩存的預(yù)查找表中查找與HashO(x)和Indexho對應(yīng)的、
且與key-x匹配的Flow值。圖6中的預(yù)查找表以Index為地址記錄信息,因
此本步驟具體為,以Indexho為查找的起始地址,在預(yù)查找表中查找與key-x
匹配的、且標(biāo)記為采用HashO(x)計算得到的Flow值。
本實施例中在預(yù)查找表中設(shè)置結(jié)束字段N-VAILD,當(dāng)讀取到N-VAILD
字段時,表示當(dāng)前查找的Indexho對應(yīng)的表項已經(jīng)查找完畢,沒有查找到匹
配的Flow值,需要進入后續(xù)步驟。本實施例采用N-VAILD作為結(jié)束字段,
在實際中也可以采用其它字段,或者當(dāng)讀取完預(yù)設(shè)bit數(shù)目后,仍沒有找到
匹配值,則確定當(dāng)前Indexho對應(yīng)的表項已經(jīng)查找完畢。
步驟704:判斷是否查找到匹配值,如果是,則執(zhí)行步驟705;否則,
執(zhí)行步驟706。
步驟705:根據(jù)匹配的Flow值在預(yù)查找表表項中的排序位置,確定key-x 的流表表項在相應(yīng)Hash桶中的偏移位置offsethQ。如前所述,F(xiàn)1OW0表示偏 移量為0, F10W1表示偏移量為1。然后,以Indexh() +offsetho為地址,從外 部緩存中的Hash桶中讀取流表表項,^丸行步驟710。
步驟706:采用Hashl(x)計算key-x的Hash索引,記為Indexhl。
步驟707:在內(nèi)部緩存的預(yù)查找表中查找與Hashl(x)和Indexh,對應(yīng)的、 且與key-x匹配的Flow值。圖6中的預(yù)查找表以Index為地址記錄信息,因 此本步驟中,以Indexhl為查找的起始地址,在預(yù)查找表中查找與key-x匹配 的、且標(biāo)記為采用Hashl(x)計算得到的Flow值。
步驟708:判斷是否查找到匹配值,如果是,則執(zhí)行步驟709;否則, 執(zhí)行步驟712。步驟709:根據(jù)匹配的Flow值在預(yù)查找表表項中的排序位置,確定key-x 的流表表項在相應(yīng)Hash桶中的偏移位置offseth,。然后,以Indexh, + offseth, 為地址,從外部緩存中的Hash桶中讀取流表表項,執(zhí)行步驟710。
步驟710:判斷key-x是否命中讀取的流表表項,如果命中,則執(zhí)行步 驟711;否則,執(zhí)行步驟712。
步驟711:確定命中流表,采用讀取的流表表項對待轉(zhuǎn)發(fā)報文進行轉(zhuǎn)發(fā) 控制。結(jié)束本流程。
步驟712:確定未命中流表,對待轉(zhuǎn)發(fā)報文進行未命中流表常規(guī)處理。 結(jié)束本流程。
至此,本流程結(jié)束。
以圖6所示數(shù)值為例,假設(shè)采用圖7的流程對關(guān)鍵字為key3的報文進 行查流表處理。首先計算HashO(key3)=Indexl,以Indexl為起始地址,在內(nèi) 部緩存的預(yù)查找表中查找與key3匹配且標(biāo)記為HASH0的FLOW值。當(dāng)讀 取到N-VAILD字段時,獲知Index 1對應(yīng)的表項已經(jīng)查找完畢,仍沒有查找 到匹配的Flow值。此后,再計算Hashl(key3)=Index4,以Index4為起始地 址,在內(nèi)部緩存的預(yù)查找表中查找與key3匹配且標(biāo)記為HASH1的FLOW 值,查找到匹配值FLOWl,并確定偏移位置為1,此時采用Index4+1為地 址,在外部緩沖中讀取流表表項,從該流表表項中獲取key3,判斷該key3 與報文中提取的key3相同,確定命中流表,進行后續(xù)轉(zhuǎn)發(fā)控制操作。
圖7的流程是以兩級Hash為例,如果采用三級、四級或等多級的Hash, 則在步驟708判定第二級Hash也未查找到匹配Flow值時,進一步采用再下 一級的預(yù)設(shè)Hash函數(shù)(例如Hash2(x)、 Hash3(x)等等)執(zhí)行所述計算key-x 的Hash索引以及后續(xù)操作,直到達(dá)到最后一級預(yù)設(shè)Hash函數(shù)。如果采用最 后一級Hash函數(shù)仍未查找到匹配Flow值,則再進入步驟712或者采用下述 實施例三的處理方案解決。
可見,采用本實施例二的多級Hash查找方法同樣只需要訪問外部緩存 一次,即可得到所需的流表表項,達(dá)到快速查找的目的,而且可以減少沖突,
19充分利用了 Hash桶資源。 實施例三
考慮到上述實施例二中多級Hash之后仍然會有很小概率的沖突事件發(fā) 生,例如HashO(key8)=Index2,且Hash 1 (key8)=Index 1 ,由于Indexl和Index2 對應(yīng)的Hash桶已滿,從而產(chǎn)生了沖突。雖然當(dāng)Hash深度設(shè)為8~ 16時,產(chǎn) 生沖突的概率非常小,但是為了進一步杜絕沖突,本發(fā)明在本實施例三中, 在芯片內(nèi)部緩存中進一步設(shè)置一個小的備用Hash表來解決這種沖突。
圖8為本實施例三中備用Hash表的示意圖。對于多級Hash后仍沖突的 key值,采用不同于HashO(x)和Hashl(x)的備用Hash函數(shù)(記為Hash,(x)) 對這些key值進行Hash運算,得到的Hash索引記為Indexh.;采用備用Hash 表記錄key值的Indexh,與key值所屬流表表項的對應(yīng)關(guān)系。記錄時可以直接 記錄Indexh,以及對應(yīng)的流表,也可以以Indexh,為記錄地址,在備用Hash表 中記錄該Indexh,對應(yīng)的流表表項。
在流表查找時,采用Hash,(x)對key-x進行Hash運算,得到Hash索引, 記為Indexh,-x;該查找操作可以在步驟701以后的任意時刻執(zhí)行,例如步驟 708判定未查找到匹配值時,或與步驟702的找表操作并發(fā)進行。以Indexh,-x 為地址,從備用Hash表中讀取流表表項,采用讀取的流表表項進行后續(xù)判 斷是否命中和轉(zhuǎn)發(fā)控制操作。如果命中,則可以終止查找預(yù)查找表的流程。 如果未命中或不存在Indexh,-x對應(yīng)的表項,則以預(yù)查找表的查找結(jié)果作為流 表查找結(jié)果。在實際中,也可以當(dāng)在預(yù)查找表中未查找到匹配Flow值時, 再從備用Hash表中讀取與Indexh.-x對應(yīng)的流表表項。
該備用Hash表的優(yōu)點是直接放在內(nèi)部緩存,用Hash,(x)得到的值可以 直接查到相應(yīng)的流表表項,完全不影響硬件查表速度。
為了實現(xiàn)上述流表查找方法,本發(fā)明實施例還提供了相應(yīng)的流表查找裝 置。圖9為本發(fā)明實施例中流表查找裝置的結(jié)構(gòu)示意圖。如圖9所示,該裝置包括內(nèi)部緩存單元91、外部緩存單元92、關(guān)系建立單元93和流表查找單 元94。
其中,外部緩存單元92采用芯片外部緩存實現(xiàn),用于以Hash桶形式存 儲流表表項。
內(nèi)部緩存單元91采用芯片內(nèi)部緩存實現(xiàn),用于存儲預(yù)查找表。 關(guān)系建立單元93,用于采用預(yù)設(shè)Hash函數(shù)建立報文中的關(guān)鍵字與Hash 索引之間的對應(yīng)關(guān)系。在預(yù)查找表中,針對每個Hash索引,順序記錄該Hash 索引對應(yīng)的各關(guān)鍵字的部分比特,即Flow值;針對對應(yīng)同一關(guān)鍵字的Flow 值和Hash索引,根據(jù)Flow值在預(yù)查找表表項中的排序位置和Hash索引值, 確定該關(guān)鍵字所屬流表表項在外部緩存Hash桶中的記錄位置,在所確定的 記錄位置上記錄該關(guān)鍵字所屬流表表。
其中,在預(yù)查找表中記錄Hash索引與對應(yīng)的Flow值時,較佳實施方式 為,以Hash索引為記錄基址,在內(nèi)部緩存單元91中記錄該Hash索引對應(yīng) 的各Flow值。
關(guān)系建立單元93在確定根據(jù)Flow值在預(yù)查找表表項中的排序位置和 Hash索引值確定相關(guān)流表表項的記錄位置時,以Hash索引值為基址Index, 以Flow值在預(yù)查找表表項中的排序位置為偏移地址offset,將Index+offset 作為所述流表表項在外部緩存中的記錄位置。
為了實現(xiàn)前述多級緩存,關(guān)系建立單元93進一步用于,當(dāng)采用相同Hash 函數(shù)將多個關(guān)鍵字映射到同一 Hash索引、且這多個關(guān)鍵字的數(shù)量大于Hash 桶的桶深,從而出現(xiàn)Hash沖突時,將這多個關(guān)鍵字分為至少兩個部分,不 同部分采用不同級別的預(yù)設(shè)Hash函數(shù)建立關(guān)鍵字與Hash索引之間的對應(yīng)關(guān) 系。
在這種情況下,該關(guān)系建立單元93還進一步在內(nèi)部緩存單元91內(nèi)的預(yù) 查找表中記錄建立Hash索引與關(guān)鍵字之間的對應(yīng)關(guān)系所采用的預(yù)設(shè)Hash 函數(shù)的標(biāo)識。
當(dāng)多級Hash為二級Hash時,且兩級預(yù)設(shè)Hash函凄t分別為HashO(x)和Hashl(x),則關(guān)系建立單元93首先采用Hash0(x)計算各關(guān)4建字的Hash索引, 記為IndexhQ,采用預(yù)查找表順序記錄各Indexho對應(yīng)的Flow值,且將這些 Flow值標(biāo)記為采用HashO(x)計算得到;并在各Hash索引為基址的Hash桶 中保存相應(yīng)流表表項;
對于采用HashO(x)計算Hash索引出現(xiàn)沖突的關(guān)鍵字,采用Hashl(x)計算 Hash索引,記為Indexhl ,在Indexhl指向的預(yù)查找表表項中順序增加Indexhl對 應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用Hashl(x)計算得到;并在各Indexhl 為基址的Hash桶中增加相應(yīng)流表表項。
流表查找單元94,用于采用預(yù)設(shè)Hash函數(shù)計算待轉(zhuǎn)發(fā)報文中關(guān)鍵字 key-x的Hash索引,記為Index-x;在內(nèi)部緩存單元91存儲的預(yù)查找表中查 找與Index-x對應(yīng)的、且與key-x匹配的Flow值;才艮據(jù)該匹配的Flow值在 預(yù)查找表表項中的排序位置和所述Index-x確定所述key-x所屬流表表項的 讀取地址,從外部緩存單元92存儲的Hash桶中讀取流表表項。
當(dāng)關(guān)系建立單元93以Index+offset為記錄地址時,流表查找單元94根 據(jù)Flow值在預(yù)查找表表項中的排序位置,確定key-x所屬流表表項在相應(yīng) Hash桶中的偏移位置offset-x;以Index-x與offset-x之和為讀取地址,從外 部緩存單元92中讀取流表表項。
當(dāng)采用多級Hash方案時,流表查找單元94具體包括第一級查找模塊941 和沖突解決模塊942。其中,
第一級查找模塊941 ,用于采用第一預(yù)設(shè)Hash函數(shù)計算待轉(zhuǎn)發(fā)報文中關(guān)鍵 字key-x的Hash索引,記為Indexh0-x;在預(yù)查找表中查找與第一預(yù)設(shè)Hash函 數(shù)和Indexho-x對應(yīng)的、且與key-x匹配的Flow值;如果查找到,則根據(jù)該匹配 的Flow值在預(yù)查找表表項中的排序位置,確定key-x所屬流表表項在相應(yīng)Hash 桶中的偏移位置offseth(rx;以Indexh『x與offseth(rx之和為讀取地址,從外部緩 存單元92存儲的Hash桶中讀取流表表項;如果未查找到,則通知沖突解決模 塊942。
沖突解決模塊942,在接收到所述通知后,采用下一級預(yù)設(shè)Hash函數(shù)計算key-x的Hash索引,記為Indexhn-x;在內(nèi)部緩存單元91存儲的預(yù)查找 表中查找與下一級預(yù)設(shè)Hash函數(shù)和Indexhn-x對應(yīng)的、且與key-x匹配的 Flow值,如果查找到,根據(jù)匹配的Flow值在表項中的排序位置,確定key-x 所屬流表表項在相應(yīng)Hash桶中的偏移位置offsethn-x;以Indexhn-x與offsethn-x 之和為讀取地址,從外部緩存單元92中讀取流表表項,如果未查找到,則 采用再下一級的預(yù)設(shè)Hash函數(shù)執(zhí)行所述計算key-x的Hash索引的操作,直 到達(dá)到最后一級預(yù)設(shè)Hash函數(shù)。
較佳地,關(guān)系建立單元93,進一步用于對采用預(yù)設(shè)Hash函數(shù)均出現(xiàn)沖 突的關(guān)鍵字,采用備用Hash函數(shù)進行處理,得到對應(yīng)的Hash索引,記為 Index,;采用備用Hash表記錄關(guān)鍵字的Indexh,與關(guān)鍵字所屬流表表項之間 的對應(yīng)關(guān)系,例如以Indexh,為記錄地址,在備用Hash表中記錄Indexh.對應(yīng) 的流表表項。備用Hash表設(shè)置在內(nèi)部緩存單元91中。
在這種情況下,流表查找單元94進一步包括備用查找模塊943,用于 采用備用Hash函數(shù),對key-x進行Hash運算,得到Hash索引記為Indexh.-x; 從備用Hash表中讀取與Indexh,-x對應(yīng)的流表表項;如果key-x命中讀取的 流表表項,則終止流表查找單元94查找預(yù)查找表的處理,具體可以為通知 第一級查找模塊941和沖突解決模塊942停止其操作。如果key-x未命中或 不存在Indexh,-x對應(yīng)的表項,則以流表查找單元94的查找結(jié)果作為最終流 表查找結(jié)果。
該流表查找裝置只是完成了流表的查找操作,得到流表表項,后續(xù)還需 將查找到的流表表項輸入相關(guān)功能模塊,由相關(guān)功能模塊完成判斷是否命中 流表,以及命中流表后的轉(zhuǎn)發(fā)控制操作和未命中流表后的處理操作。
綜上所述,以上僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的 保護范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改 進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
1、一種流表查找方法,其特征在于,該方法包括A、以報文特征信息為關(guān)鍵字,采用預(yù)設(shè)散列Hash函數(shù)建立關(guān)鍵字與Hash索引之間的對應(yīng)關(guān)系;在設(shè)置于內(nèi)部緩存的預(yù)查找表中,針對每個Hash索引順序記錄該Hash索引對應(yīng)的各關(guān)鍵字的部分比特,所述部分比特稱為流量特征Flow值;針對對應(yīng)同一關(guān)鍵字的Flow值和Hash索引,根據(jù)Flow值在預(yù)查找表表項中的排序位置和Hash索引值,確定該關(guān)鍵字所屬流表表項在外部緩存Hash桶中的記錄位置,在所確定的記錄位置上記錄該關(guān)鍵字所屬流表表項;B、查找流表時,采用所述預(yù)設(shè)Hash函數(shù)計算待處理報文中關(guān)鍵字key-x的Hash索引,記為Index-x;在所述預(yù)查找表中查找與Index-x對應(yīng)的、且與key-x匹配的Flow值;根據(jù)該匹配的Flow值在預(yù)查找表表項中的排序位置和所述Index-x確定所述key-x所屬流表表項的讀取地址,從外部緩存中讀取流表表項。
2、 如權(quán)利要求l所述的方法,其特征在于,所述確定該關(guān)^:字所屬流表表 項在外部緩存Hash桶中的記錄位置為以Hash索引值為基址Index,以Flow 值在預(yù)查找表表項中的排序位置為偏移地址offset,將Index+offset作為所述流 表表項在外部緩存中的記錄位置;所述根據(jù)該匹配的Flow值在預(yù)查找表表項中的排序位置和所述Index-x確 定所述key-x所屬流表表項的讀取地址,從外部緩存中讀取流表表項為根據(jù) 該匹配的Flow值在預(yù)查找表表項中的排序位置,確定key-x所屬流表表項在相 應(yīng)Hash桶中的偏移位置offset-x;以Index-x與offset-x之和為讀取地址,從外 部緩存中讀取流表表項。
3、 如權(quán)利要求2所述的方法,其特征在于,所述步驟A進一步包括當(dāng) 采用相同Hash函數(shù)將多個關(guān)鍵字映射到同一 Hash索引、且所述多個關(guān)鍵字的 數(shù)量大于Hash桶的桶深時,將所述多個關(guān)鍵字分為至少兩個部分,不同部分采 用不同級別的預(yù)設(shè)Hash函數(shù)建立關(guān)鍵字與Hash索引之間的對應(yīng)關(guān)系;所述預(yù)查找表進一步記錄建立Hash索引與關(guān)鍵字之間的對應(yīng)關(guān)系所采用 的預(yù)設(shè)Hash函數(shù)的標(biāo)識。
4、 如權(quán)利要求3所述的方法,其特征在于,用于建立所述對應(yīng)關(guān)系的預(yù)設(shè) Hash函數(shù)為兩級預(yù)設(shè)Hash函數(shù),分別記為Hash0(x)和Hashl(x);所述步驟A包括采用HashO(x)計算各關(guān)鍵字的Hash索引,記為Indexh0,采用預(yù)查找表順 序記錄各lndexh。對應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用HashO(x)計算得 到;并在各Hash索引為基址的Hash桶中保存相應(yīng)流表表項;對于采用HashO(x)計算Hash索引出現(xiàn)沖突的關(guān)鍵字,采用Hashl(x)計算 Hash索引,記為Indexhl,在Indexhl指向的預(yù)查找表表項中順序增加與Indexhl 對應(yīng)的Flow值,且將這些Flow值標(biāo)記為采用Hashl(x)計算得到;并在各Indexhl 為基址的Hash桶中增加相應(yīng)流表表項。
5、 如權(quán)利要求3所述的方法,其特征在于,所述步驟B包括采用第一預(yù)設(shè)Hash函數(shù)計算key-x的Hash索引,記為Indexh(rx;在所述 預(yù)查找表中查找與第一預(yù)設(shè)Hash函數(shù)和Indexho-x對應(yīng)的、且與key-x匹配的 Flow值;如果查找到,貝']根據(jù)該匹配的Flow值在預(yù)查找表表項中的排序位置,確定 key-x所屬流表表項在相應(yīng)Hash桶中的偏移位置offseth(rx;以Indexh(rx與 offseth(rx之和為讀取地址,從外部緩存中讀取流表表項;如果未查找到,則采用下一級預(yù)設(shè)Hash函數(shù)計算key-x的Hash索引,記 為Indexhn-x;在所述預(yù)查找表中查找與所述下一級預(yù)設(shè)Hash函數(shù)和Indexhn-x 對應(yīng)的、且與key-x匹配的Flow值,如果查找到,根據(jù)匹配的Flow值在預(yù)查 找表表項中的排序位置,確定key-x所屬流表表項在相應(yīng)Hash桶中的偏移位置 offsethn-x;以Indexhn-x與offsethn-x之和為讀取地址,從外部緩存中讀取流表表 項,如果未查找到,則采用再下一級的預(yù)設(shè)Hash函數(shù)執(zhí)行所述計算key-x的 Hash索引的操作,直到達(dá)到最后一級預(yù)設(shè)Hash函數(shù)。
6、 如權(quán)利要求1至5任意一項所述的方法,其特征在于,該方法進一步包括對于采用所述預(yù)設(shè)Hash函數(shù)計算Hash索引出現(xiàn)沖突的關(guān)鍵字,采用備用 Hash函數(shù)進行處理,得到的Hash索引記為Indexh,;采用備用Hash表記錄關(guān)鍵 字的Indexh,與關(guān)鍵字所屬流表表項之間的對應(yīng)關(guān)系;所述步驟B進一步包括采用所述備用Hash函數(shù),對key-x進行Hash運 算,得到的Hash索引記為Indexh,-x,從所述備用Hash表中讀取與Indexh,-x對 應(yīng)的流表表項;如果key-x命中讀取的流表表項,則終止查找預(yù)查找表的流程。
7、 如權(quán)利要求1至5任意一項所述的方法,其特征在于,采用預(yù)查找表記 錄每個Hash索51對應(yīng)的各Flow值為以Hash索引為記錄基址,在內(nèi)部緩存 的預(yù)查找表中依次記錄該Hash索引對應(yīng)的各Flow值。
8、 一種流表查找裝置,其特征在于,該裝置包括內(nèi)部緩存單元、外部緩 存單元、關(guān)系建立單元和流表查找單元;所述外部緩存單元,用于以Hash桶形式存儲流表表項; 所述內(nèi)部緩存單元,用于存儲預(yù)查找表;所述關(guān)系建立單元,用于以報文特征信息為關(guān)鍵字,釆用預(yù)設(shè)Hash函數(shù)建 立關(guān)鍵字與Hash索引之間的對應(yīng)關(guān)系;在預(yù)查找表中,針對每個Hash索引順 序記錄該Hash索引對應(yīng)的各關(guān)鍵字的部分比特,所述部分比特稱為流量特征 Flow值;針對對應(yīng)同一關(guān)鍵字的Flow值和Hash索引,根據(jù)Flow值在預(yù)查找 表表項中的排序位置和Hash索引值,確定該關(guān)鍵字所屬流表表項在外部緩存 Hash桶中的記錄位置,在所確定的記錄位置上記錄該關(guān)鍵字所屬流表表;所述流表查找單元,用于采用所述預(yù)設(shè)Hash函數(shù)計算待處理報文中關(guān)鍵字 key-x的Hash索引,記為Index-x;在所述預(yù)查找表中查找與Index-x對應(yīng)的、 且與key-x匹配的Flow值;根據(jù)該匹配的Flow值在預(yù)查找表表項中的排序位 置和所述Index-x確定所述key-x所屬流表表項的讀取地址,從所述外部緩存單 元中讀耳又流表表項。
9、 如權(quán)利要求8所述的裝置,其特征在于,所述關(guān)系建立單元進一步用于, 以Hash索引值為基址Index,以Flow值在預(yù)查找表表項中的排序位置為偏移 地址offset,將Index+offset作為所述流表表項在外部緩存中的記錄位置;所述流表查找單元進一步用于,根據(jù)Flow值在預(yù)查找表表項中的排序位 置,確定key-x所屬流表表項在相應(yīng)Hash桶中的偏移位置offset-x;以Index-x 與offset-x之和為讀取地址,從外部緩存單元中讀取流表表項。
10、 如權(quán)利要求9所述的裝置,其特征在于,所述關(guān)系建立單元進一步用 于,當(dāng)采用相同Hash函數(shù)將多個關(guān)鍵字映射到同一 Hash索引、且所述多個關(guān) 鍵字的數(shù)量大于Hash桶的桶深時,將所述多個關(guān)鍵字分為至少兩個部分,不同 部分采用不同級別的預(yù)設(shè)Hash函數(shù)建立關(guān)鍵字與Hash索引之間的對應(yīng)關(guān)系;該關(guān)系建立單元還進一步在預(yù)查找表中記錄建立Hash索引與關(guān)鍵字之間 的對應(yīng)關(guān)系所采用的預(yù)設(shè)Hash函數(shù)的標(biāo)識。
11、 如權(quán)利要求IO所述的裝置,其特征在于,所述流表查找單元包括第一 級查找單元和沖突解決單元;第一級查找單元,用于采用第一預(yù)設(shè)Hash函數(shù)計算待處理報文中關(guān)鍵字 key-x的Hash索引,記為Indexh(rx;在所述預(yù)查找表中查找與第一預(yù)設(shè)Hash 函數(shù)和Indexho對應(yīng)的、且與key-x匹配的Flow值;如果查找到,則根據(jù)該匹 配的Flow值在預(yù)查找表表項中的排序位置,確定key-x所屬流表表項在相應(yīng) Hash桶中的偏移位置offsetho-x ;以Indexh(rx與offseth(rx之和為讀取地址,從 所述外部緩存單元讀取流表表項;如果未查找到,則通知所述沖突解決單元;所述沖突解決單元,在接收到所述通知后,采用下一級預(yù)設(shè)Hash函數(shù)計算 key-x的Hash索引,記為Indexhn-x;在所述預(yù)查找表中查找與所述下一級預(yù)設(shè) Hash函數(shù)和Indexhn-x對應(yīng)的、且與key-x匹配的Flow值,如果查找到,根據(jù) 匹配的Flow值在表項中的排序位置,確定key-x所屬流表表項在相應(yīng)Hash桶 中的偏移位置offsethn-x;以Indexhn-x與offsethn-x之和為讀取地址,從所述外部 緩存單元中讀取流表表項,如果未查找到,則采用再下一級的預(yù)設(shè)Hash函數(shù)執(zhí) 行所述計算key-x的Hash索引的操作,直到達(dá)到最后一級預(yù)設(shè)Hash函數(shù)。
12、 如權(quán)利要求8至11任意一項所述的裝置,其特征在于,所述內(nèi)部緩存 單元進一步存儲備用Hash表;所述關(guān)系建立單元,進一步用于對采用所述預(yù)設(shè)Hash函數(shù)計算Hash索引出現(xiàn)沖突的關(guān)鍵字,采用備用Hash函數(shù)進行處理,得到對應(yīng)的Hash索引,記 為Indexh,;采用備用Hash表記錄關(guān)鍵字的Indexh,與關(guān)鍵字的所屬流表表項之 間的對應(yīng)關(guān)系;所述流表查找單元進一步包括備用查找模塊,用于采用所述備用Hash函 數(shù),對key-x進行Hash運算,得到Hash索引記為Indexh,-x;從所述備用Hash 表中讀取與Indexh,-x對應(yīng)的流表表項;如果key-x命中讀取的流表表項,則終 止流表查找單元查找預(yù)查找表的處理。
13、如權(quán)利要求8至ll任意一項所述的裝置,其特征在于,所述關(guān)系建立 單元在針對每個Hash索引順序記錄該Hash索引對應(yīng)的各Flow值時,以Hash 索引為記錄基址,在所述內(nèi)部緩存單元中依次記錄該Hash索引對應(yīng)的各Flow 值。
全文摘要
本發(fā)明公開了一種流表查找方法和裝置,所述方法在芯片內(nèi)部緩存中設(shè)置預(yù)查找表,采用該預(yù)查找表記錄關(guān)鍵字及其Index的對應(yīng)關(guān)系,記錄時只記錄關(guān)鍵字的部分字段稱為Flow值。關(guān)鍵字的Flow值在預(yù)查找表的記錄位置與關(guān)鍵字對應(yīng)的流表表項在Hash桶中的記錄位置相應(yīng)。在為報文查找所需流表表項時,可以根據(jù)對報文關(guān)鍵字進行Hash運算得到的Index以及與報文關(guān)鍵字匹配的Flow值在預(yù)查找表表項中位置,確定所需流表表項在外部緩存中的記錄位置,然后只需要訪問外部緩存一次,即可得到所需的流表表項,從而達(dá)到快速查找的目的。
文檔編號H04L12/56GK101540723SQ200910082268
公開日2009年9月23日 申請日期2009年4月20日 優(yōu)先權(quán)日2009年4月20日
發(fā)明者彬 王 申請人:杭州華三通信技術(shù)有限公司