專利名稱::在fdb表中添加下一跳mac地址的方法及fdb設(shè)備的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及在橋轉(zhuǎn)發(fā)數(shù)據(jù)庫(kù)(ForwardingDatabase,簡(jiǎn)稱FDB)表中添加下一跳MAC地址的方法及FDB設(shè)備,屬于數(shù)據(jù)通信
技術(shù)領(lǐng)域:
。
背景技術(shù):
:三層交換機(jī)的功能,可簡(jiǎn)單分為二層轉(zhuǎn)發(fā)和三層轉(zhuǎn)發(fā)。二層轉(zhuǎn)發(fā)依據(jù)媒體接入控制(MediaAccessControl,簡(jiǎn)稱MAC)地址查表決定報(bào)文轉(zhuǎn)發(fā)出口及其它控制信息,三層轉(zhuǎn)發(fā)根據(jù)IP地址查表得出轉(zhuǎn)發(fā)出口及其它控制信息。三層交換機(jī)中的FDB表主要用于二層報(bào)文轉(zhuǎn)發(fā)決策,如表l,其表項(xiàng)主要有MAC地址,虛擬局域網(wǎng)(VirtualLocalAreaNetwork,簡(jiǎn)稱VLAN)ID和輸出端口號(hào)等字段,其中MAC地址和VLANID組成二層轉(zhuǎn)發(fā)MAC地址表的索引,索引計(jì)算采用散列算法。散列算法就是把任意長(zhǎng)度的輸入,變換成固定長(zhǎng)度的輸出的算法稱為散列算法,該輸出就是散列值,在二層轉(zhuǎn)發(fā)MAC地址表中,散列值與FDB表項(xiàng)的編號(hào)直接對(duì)應(yīng),輸入MAC地址和VLANID,二層轉(zhuǎn)發(fā)MAC地址表的容量一般只有幾K到幾百K,而MAC地址是48bit,VLANID是12bit,二者相加共60bit,只要2Qbit的排列組合就達(dá)到1024K條表項(xiàng),而交換機(jī)在特定的局域網(wǎng)內(nèi)的用戶的MAC地址個(gè)數(shù)可預(yù)見,因此釆用小容量的二層轉(zhuǎn)發(fā)MAC地址表就可以滿足應(yīng)用,而采用散列算法能夠有效的解決全球MAC地址條目遠(yuǎn)大于一般的二層轉(zhuǎn)發(fā)MAC地址表的矛盾。二層轉(zhuǎn)發(fā)MAC地址添加和查找,都是通過輸入MAC地址和VLANID得到散列值,也就是FDB表項(xiàng)的編號(hào),依據(jù)FDB表項(xiàng)的編號(hào)就可以完成寫入和讀取表項(xiàng)。表1二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)的主要內(nèi)容MAC地址VLANID豐lr出端口號(hào)散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會(huì)散列成相同的輸出,因此會(huì)造成地址沖突。如全球48bit的MAC地址,映射到16K的二層轉(zhuǎn)發(fā)MAC地址表中,就會(huì)造成大量不同地址對(duì)應(yīng)同一個(gè)二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)的沖突現(xiàn)象。二層轉(zhuǎn)發(fā)表中,一般使用一個(gè)散列值對(duì)應(yīng)幾個(gè)表項(xiàng)的方式,以處理散列值沖突,三層交換機(jī)中路由表,如表2,其表項(xiàng)主要包括前綴,下一跳輸出端口號(hào)和下一跳MAC地址等信息。前綴為路由表項(xiàng)的索引,用于確定IP報(bào)文對(duì)應(yīng)于哪條路由表項(xiàng);下一跳輸出端口號(hào),用于確定對(duì)應(yīng)匹配的IP輸出端口;下一跳MAC地址,用于修改輸出IP報(bào)文的目的MAC地址(MACDA)字段。MAC地址的長(zhǎng)度為6字節(jié),出于節(jié)省存儲(chǔ)空間的考慮,將路由表中的MAC地址存放到FDB表中,而在路由表項(xiàng)中存儲(chǔ)FDB表項(xiàng)的編號(hào)(FDBID),如表3所示。如某型號(hào)三層交換機(jī)支持4096臺(tái)主機(jī)接入,那么每條路由表項(xiàng)只需要12bit的存儲(chǔ)空間用于存儲(chǔ)FDB表項(xiàng)的編號(hào),和存儲(chǔ)完整的48bit的MAC地址相比,每條路由表項(xiàng)減少了36bit存儲(chǔ)空間。表2路由表項(xiàng)的主要內(nèi)容<table>tableseeoriginaldocumentpage5</column></row><table>表3下一跳MAC地址存儲(chǔ)到FDB存儲(chǔ)空間時(shí)路由表項(xiàng)的主要內(nèi)容<table>tableseeoriginaldocumentpage5</column></row><table>上述將下一跳MAC地址存儲(chǔ)到FDB存儲(chǔ)空間的方法,減小了路由表的大但是占用了FDB的空間,常見的FDB存儲(chǔ)空間管理方法有2種(一)固定分區(qū)法,將FDB存儲(chǔ)空間固定地劃分為2個(gè)區(qū)段,如硬件提供的FDB有16條表項(xiàng),將12K用于二層轉(zhuǎn)發(fā)MAC地址存儲(chǔ),4K用于路由表的下一跳MAC地址存儲(chǔ)。固定劃分法的缺點(diǎn)是a、路由表項(xiàng)不太多,而二層轉(zhuǎn)發(fā)MAC地址很多的情況下,不能夠?qū)㈤e置的下一跳MAC地址存儲(chǔ)空間加以利用。反之,當(dāng)路由表項(xiàng)很多而二層轉(zhuǎn)發(fā)MAC地址不太多的情況下,也不能將閑置的二層轉(zhuǎn)發(fā)MAC地址存儲(chǔ)空間加以利用,因此整個(gè)FDB表的資源利用率較低。b、分區(qū)后,如果散列值還是覆蓋整個(gè)FDB,那么會(huì)造成散列值落到下一跳MAC地址區(qū)域部分變成無效的散列值,導(dǎo)致對(duì)應(yīng)的地址不能被學(xué)習(xí)。如表4所示,F(xiàn)DB存儲(chǔ)空間的前12K表項(xiàng)用于做二層轉(zhuǎn)發(fā)表(FDB1-12288),后4K用于作下一跳MAC地址表(FDB12289-16384),在散列算法沒有改變的情況下,必然會(huì)出現(xiàn)某個(gè)MAC地址和VLANID作為散列輸入,計(jì)算得到的散列值大于12288,由于上述固定劃分,就會(huì)導(dǎo)致二層轉(zhuǎn)發(fā)自動(dòng)學(xué)習(xí)的MAC地址不能添加到后4k的區(qū)域內(nèi),因此發(fā)生二層轉(zhuǎn)發(fā)MAC地址學(xué)習(xí)失敗。表4固定分區(qū)法中FDB存儲(chǔ)空間使用表<table>tableseeoriginaldocumentpage6</column></row><table>(二)與二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)共享FDB表項(xiàng),將路由表項(xiàng)直接指向已經(jīng)存在的二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)(一條FDB表項(xiàng),承擔(dān)2個(gè)用途),若沒有相應(yīng)空閑表項(xiàng),則再通過添加二層轉(zhuǎn)發(fā)MAC地址的方式,即先計(jì)算散列值,再添加到散列值對(duì)應(yīng)的幾個(gè)表項(xiàng)中的其中一個(gè)空閑的表項(xiàng),創(chuàng)建一條表項(xiàng)并關(guān)聯(lián)到路由表項(xiàng),所不同的是為了避免被二層轉(zhuǎn)發(fā)引擎誤認(rèn)為是二層轉(zhuǎn)發(fā)MAC地址,該表項(xiàng)關(guān)聯(lián)到專用的VLANID。如添加的路由表項(xiàng)的下一跳地址是00DOF8010203,并且交換機(jī)也學(xué)習(xí)到并且存儲(chǔ)這條表項(xiàng)到MAC地址表中,表項(xiàng)的ID是2356,那么就可以直接被路由表引用,將ID2356保存到路由表項(xiàng)中。該方案不僅是動(dòng)態(tài)分配算法,而且表項(xiàng)高度共享。但是,帶來的問題是算法復(fù)雜,在被共享的二層轉(zhuǎn)發(fā)MAC地址發(fā)生老化(每個(gè)動(dòng)態(tài)學(xué)習(xí)到的二層轉(zhuǎn)發(fā)MAC地址都有一個(gè)生存期,以秒為單位,時(shí)間到了該表項(xiàng)會(huì)失效,這就是二層轉(zhuǎn)發(fā)MAC地址老化)和被刪除的情況下,相應(yīng)的路由也需要得到正確的更新維護(hù)。而且采用添加二層轉(zhuǎn)發(fā)MAC地址的方式,會(huì)出現(xiàn)散列沖突的情況,這就出現(xiàn)在還有空閑資源的情況下,出現(xiàn)添加表項(xiàng)失敗的情況,也不能達(dá)到資源的最高利用率。例如散列單元的深度是4,而出現(xiàn)了5個(gè)地址分別計(jì)算得到的散列值都相同,那么第5個(gè)地址就不能被添加成功,雖然這時(shí)其它的散列單元還有空閑表項(xiàng),這也是散列算法的局限性決定的。
發(fā)明內(nèi)容本發(fā)明的目的是針對(duì)上述現(xiàn)有技術(shù)的不足,提出了一種在FDB表中添加下一跳MAC地址的方法及FDB設(shè)備,以實(shí)現(xiàn)下一跳MAC地址較均勻的添加到FDB表。為實(shí)現(xiàn)上述目的,本發(fā)明的一些實(shí)施例提供了一種在FDB表中添加下一跳MAC地址的方法,其中包括發(fā)送下一跳MAC地址的添加請(qǐng)求消息,所述添加請(qǐng)求消息中攜帶有下一跳MAC地址的初始索引值;根據(jù)所述初始索引值確定一散列單元中的一FDB表項(xiàng)為初始FDB表項(xiàng);檢測(cè)所述FDB表項(xiàng)是否為空閑,若所述FDB表項(xiàng)空閑,則將所述下一跳MAC地址添加到該FDB表項(xiàng);若所述FDB表項(xiàng)非空閑,確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng),重復(fù)此步驟,直至檢測(cè)到空閑的FDB表項(xiàng),將所述下一跳MAC地址添加到該FDB表項(xiàng)。為實(shí)現(xiàn)上述目的,本發(fā)明的另一些實(shí)施例提供了一種FDB設(shè)備,其中包括FDB表項(xiàng)指向單元、FDB表項(xiàng)狀態(tài)4全測(cè)單元以及下一跳MAC地址添加單元;FDB表項(xiàng)指向單元,用于接收下一跳MAC地址的添加請(qǐng)求消息,以及確定索引值對(duì)應(yīng)的FDB表項(xiàng);FDB表項(xiàng)狀態(tài)檢測(cè)單元,與所述FDB表項(xiàng)指向單元及下一跳MAC地址添加單元連接,用于判斷所述FDB表項(xiàng)是否為空閑,若所述FDB表項(xiàng)空閑,則通知下一跳MAC地址添加單元將所述下一if兆MAC地址添加到該FDB表項(xiàng);若所述FDB表項(xiàng)非空閑,則通知FDB表項(xiàng)指向單元,確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng)。上述技術(shù)方案具有以下優(yōu)點(diǎn)(1)通過引入索引值,在添加下一跳MAC地址的過程中,是從整體的FDB表中尋找空閑表項(xiàng),而非現(xiàn)有的固態(tài)分區(qū)法中僅從用于路由表的下一跳MAC地址存儲(chǔ)的區(qū)間中尋找空閑表項(xiàng),因此提高了FDB表的資源利用率;(2)通過引入散列單元,使得下一跳MAC地址在較均勻地分布在FDB表中的同時(shí),由于每一散列單元中對(duì)應(yīng)有數(shù)個(gè)FDB表項(xiàng),下一跳MAC地址在占用其中一個(gè)或數(shù)個(gè)FDB表項(xiàng)時(shí),仍能夠在保證學(xué)習(xí)或添加二層轉(zhuǎn)發(fā)MAC地址時(shí),散列沖突不發(fā)生超限的情況下,二層轉(zhuǎn)發(fā)MAC地址被成功的學(xué)習(xí)或添加,從而減少了對(duì)二層轉(zhuǎn)發(fā)地址的學(xué)習(xí)和添加的影響;(3)下一跳MAC地址在添加的過程中,由于不與用于二層轉(zhuǎn)發(fā)的二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)共用,使得二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)與下一跳MAC地址表項(xiàng)在邏輯上分別歸屬于獨(dú)立的兩張表,從而便于二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)及下一跳MAC地址表項(xiàng)的分別維護(hù);(4)由于采用索引的方法從整體的FDB表中檢測(cè)空閑表項(xiàng),而非采用MAC地址和VLANID計(jì)算散列值的方法,因此避免了下一跳MAC地址添加過程中出現(xiàn)散列沖突的可能性以及由此而導(dǎo)致的添加失敗的可能性。圖1為本發(fā)明在FDB表中添加下一跳MAC地址的方法實(shí)施例一的流程圖。圖2為本發(fā)明在FDB表中添加下一跳MAC地址的方法實(shí)施例二的流程圖。圖3為本發(fā)明在FDB表中添加下一跳MAC地址的具體實(shí)例一的流程圖;圖4為本發(fā)明在FDB表中添加下一跳MAC地址的具體實(shí)例二的流程圖;圖5為本發(fā)明在FDB表中添加下一跳MAC地址的具體實(shí)例三的流程圖;圖6為本發(fā)明在FDB表中添加下一跳MAC地址的具體實(shí)例四的流程圖;圖7為本發(fā)明一種FDB設(shè)備的實(shí)施例一的結(jié)構(gòu)示意圖;圖8為本發(fā)明一種FDB設(shè)備的實(shí)施例二的結(jié)構(gòu)示意圖。具體實(shí)施例方式散列算法把任意長(zhǎng)度的輸入,變換成固定長(zhǎng)度的輸出的算法為散列算法,該輸出就是散列值。散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會(huì)散列成相同的輸出,因此會(huì)造成地址沖突,為了解決散列沖突的問題,一舶:-使用一個(gè)散列值對(duì)應(yīng)于幾個(gè)表項(xiàng)的方式,有限地處理散列沖突。散列深度一條散列值所對(duì)應(yīng)的表項(xiàng)數(shù)目。散列單元同屬于一個(gè)散列值的表項(xiàng)歸屬于同一個(gè)散列單元。具體到本發(fā)明的實(shí)施例,設(shè)三層交換機(jī)的FDB的存儲(chǔ)空間為16K,散列深度為h=4。該FDB包括FDB表項(xiàng)的數(shù)目為16K(即161024=16384)項(xiàng),散列單元的數(shù)目為16k/4(即4*1024)項(xiàng)。下面通過附圖和實(shí)施例,對(duì)本發(fā)明的技術(shù)方案做進(jìn)一步的詳細(xì)描述。三層交換機(jī)中為了減少路由表的存儲(chǔ)空間時(shí)可以采用以下方案,具體為將路由表中的下一跳MAC地址存放到FDB表中,然后將路由表項(xiàng)中的下一跳MAC地址換為FDB表項(xiàng)的編號(hào)。由于FDB表項(xiàng)還需用來存儲(chǔ)二層轉(zhuǎn)發(fā)相關(guān)信息,即二層轉(zhuǎn)發(fā)MAC地址表項(xiàng),因此需考慮資源利用問題以及二層轉(zhuǎn)發(fā)MAC地址的學(xué)習(xí)或添加等問題。為了解決上述問題,本發(fā)明的提出了一種在FDB表中添加下一跳MAC地址的方法。圖1為在FDB表中添加下一跳MAC地址的方法的實(shí)施例一的流程圖,包括步驟11、發(fā)送下一跳MAC地址的添加請(qǐng)求消息,所述添加請(qǐng)求消息中攜帶有下一跳MAC地址的初始索引值。步驟12、根據(jù)所述初始索^1值確定一散列單元中的一FDB表項(xiàng)為初始FDB表項(xiàng);步驟13、4全測(cè)所述FDB表項(xiàng)是否為空閑,若所述FDB表項(xiàng)空閑,則執(zhí)行步驟4;若所述FDB表項(xiàng)非空閑,執(zhí)行步驟5。步驟14、將所述下一跳MAC地址添加到該FDB表項(xiàng);步驟15、確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng),重復(fù)步驟3。直至檢測(cè)到空閑的FDB表項(xiàng),將所述下一跳MAC地址添加到該FDB表項(xiàng)。上述實(shí)施例,判斷索引值指向的FDB表項(xiàng)的狀態(tài)是否為空閑,決定是將下一跳MAC地址添加到該FDB表項(xiàng),還是繼續(xù)判斷另一散列單元中的FDB表項(xiàng)的狀態(tài),該方法能夠?qū)崿F(xiàn)下一跳MAC地址較均勻地分布在FDB表中不同的散列單元中,通過引入索引值,在添加下一跳MAC地址的過程中,是從整體的FDB表中尋找空閑表項(xiàng),而非僅從用于路由表的下一跳MAC地址存儲(chǔ)的區(qū)間中尋找空閑表項(xiàng),因此提高了FDB表的資源利用率;通過引入散列單元,使得下一跳MAC地址在較均勻地分布在FDB表中的同時(shí),由于每一散列單元中對(duì)應(yīng)有數(shù)個(gè)FDB表項(xiàng),下一跳MAC地址在占用其中一個(gè)或數(shù)個(gè)FDB表項(xiàng)時(shí),仍能夠在保證學(xué)習(xí)或添加二層轉(zhuǎn)發(fā)MAC地址時(shí),散列沖突不發(fā)生超限的情況下,二層轉(zhuǎn)發(fā)MAC地址;陂成功的學(xué)習(xí)或添加,從而減少了對(duì)二層轉(zhuǎn)發(fā)地址的學(xué)習(xí)和添加的影響;下一跳MAC地址在添加的過程中,由于不與用于二層轉(zhuǎn)發(fā)的二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)共用,使得二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)與下一跳MAC地址表項(xiàng)在邏輯上分別歸屬于獨(dú)立的兩張表,從而便于二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)及下一跳MAC地址表項(xiàng)的分別維護(hù),如每個(gè)動(dòng)態(tài)學(xué)習(xí)到二層轉(zhuǎn)發(fā)MAC地址有一個(gè)生存期,針對(duì)二層轉(zhuǎn)發(fā)地址表項(xiàng)可以根據(jù)老化時(shí)間進(jìn)行維護(hù)等;另外,由于采用索引的方法從整體的FDB表中;f企測(cè)空閑表項(xiàng),而非采用MAC地址和VLANID計(jì)算散列值的方法,因此避免了下一跳MAC地址添加過程中出現(xiàn)散列沖突的可能性以及由此而導(dǎo)致的添加失敗的可能性。FDB表中FDB表項(xiàng)有空閑和非空閑兩種狀態(tài)。當(dāng)FDB表項(xiàng)為空閑時(shí),可以直接將下一跳MAC地址添加到該FDB表項(xiàng)中;當(dāng)FDB表項(xiàng)非空閑時(shí),該FDB表項(xiàng)或已經(jīng)添加了下一跳MAC地址,或被二層轉(zhuǎn)發(fā)MAC地址所占用。二層轉(zhuǎn)發(fā)MAC地址可以為交換機(jī)自動(dòng)學(xué)習(xí)到的動(dòng)態(tài)地址,也可以為系統(tǒng)管理員手工設(shè)定或是通過集群管理協(xié)議進(jìn)行配置的靜態(tài)地址。為了減少或避免下一跳MAC地址添加失敗的結(jié)果出現(xiàn),可以將暫時(shí)沒有接收數(shù)據(jù)傳輸?shù)膭?dòng)態(tài)地址表項(xiàng)刪除,為下一跳MAC地址騰出空間,這樣就可以將下一跳添加到該FDB表項(xiàng)。圖2為在FDB表中添加下一跳MAC地址的方法的實(shí)施例二的流程圖,實(shí)施例二與實(shí)施例一的區(qū)別在于,若所述FDB表項(xiàng)非空閑,還包括判斷所述FDB表項(xiàng)是否為動(dòng)態(tài)地址表項(xiàng)的步驟。具體為步驟21、發(fā)送下一跳MAC地址的添加請(qǐng)求消息,所述添加請(qǐng)求消息中攜帶有下一跳MAC地址的初始索引值。步驟22、根據(jù)所述初始索^1值確定一散列單元中的一FDB表項(xiàng)為初始FDB表項(xiàng);步驟23、檢測(cè)所述FDB表項(xiàng)是否為空閑,若所述FDB表項(xiàng)空閑,則執(zhí)行步驟4;若所述FDB表項(xiàng)非空閑,執(zhí)行步驟30。步驟24、將所述下一跳MAC地址添加到該FDB表項(xiàng);步驟231、判斷所述FDB表項(xiàng)是否為動(dòng)態(tài)地址表項(xiàng),若是,執(zhí)行步驟W;否則,執(zhí)行步驟5。步驟232、刪除所述動(dòng)態(tài)地址表項(xiàng)中的MAC地址,轉(zhuǎn)到步驟4。步驟25、確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng),重復(fù)步驟3。在一條下一跳MAC地址添加成功后,為了減少添加下一條下一跳MAC地址的過程中,F(xiàn)DB表項(xiàng)的查找次數(shù),可以按預(yù)設(shè)方法對(duì)當(dāng)前索引值進(jìn)行處理,保存處理后的索引值,所述處理后的索引值用于作為下一條下一跳MAC地址的初始索引值。本發(fā)明的實(shí)施例根據(jù)FDB表項(xiàng)的對(duì)應(yīng)的索引值及散列深度預(yù)先確定下一條下一跳MAC地址的初始索引值。為了保證下一條下一跳MAC地址被相對(duì)均勻地分配到FDB表中,可釆用"索引值=當(dāng)前索引值+散列深度"的方法計(jì)算索引值,若計(jì)算的索引值小于FDB表項(xiàng)的數(shù)目,則保存該索引值,該索引值用于作為下一條下一跳MAC地址的初始索引值;若計(jì)算的索引值大于或等于FDB表項(xiàng)的數(shù)目,則按照"(索引值+l)mod散列深度"的方法計(jì)算索引值,保存該索引值,該索引值用于作為下一條下一跳MAC地址的初始索引值。以下以存儲(chǔ)空間為16K,散列深度為4的FDB為例說明下一跳MAC地址的添加流程。若是第一次向FDB中添加下一跳MAC地址,默認(rèn)該下一跳MAC地址的初始索引值為0。設(shè)index表示索引值,h表示散列深度。索引值index=0對(duì)應(yīng)于第一條FDB表項(xiàng)FDB(0),索引值index=x(0<x<=16*1024-l且為整數(shù)),對(duì)應(yīng)于第x+1條FDB表項(xiàng)FDB(x)。如圖3,具體包括步驟al、發(fā)送下一跳MAC地址的添加請(qǐng)求消息,所述添加請(qǐng)求消息中攜帶有下一跳MAC地址的初始索引值,所述初始索引值為上一條下一跳MAC地址添加時(shí)保存的索引值。設(shè)Index(0)為待添加的下一跳MAC地址的初始索引值,Index(0)=上次保存的index。步驟a2、根據(jù)所述初始索^1值確定一散列單元中的一FDB表項(xiàng)為初始FDB表項(xiàng)。根據(jù)index(0)確定一散列單元中的一FDB表項(xiàng)為初始FDB表項(xiàng)。步驟a3、判斷index對(duì)應(yīng)的FDB表項(xiàng)是否為空閑,若該FDB表項(xiàng)空閑,則執(zhí)行步驟a4;若該FDB表項(xiàng)非空閑,執(zhí)行步驟a5。步驟a4、將所述下一跳MAC地址添加到該FDB表項(xiàng)。為了保證下一條下一跳MAC地址被相對(duì)均勻地分配到FDB表中,可采用下列方法對(duì)當(dāng)前索引值進(jìn)行處理。設(shè)index(F)表示計(jì)算后的索引值,index(B)表示當(dāng)前的索引值;首先按index(F)=index(B)+h的方法計(jì)算索引值,若計(jì)算出的index(F)小于FDB表項(xiàng)的數(shù)目,即index(F)〈16*1024,則保存該計(jì)算結(jié)果,將該計(jì)算結(jié)果用于作為下一條下一跳MAC地址的初始索引值;若計(jì)算出的index大于或等于FDB表項(xiàng)的數(shù)目,即index(F)〉=16*1024,則將該計(jì)算結(jié)果按"(index(F)+1)modh"的方法進(jìn)行處理,保存該處理結(jié)果,該處理結(jié)果用于作為下一條下一跳MAC地址的初始索引值。步驟a5、確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng),重復(fù)步驟3。具體包括步驟a51、按預(yù)設(shè)方法重新設(shè)置所述下一跳MAC地址的索引值;步驟a52、確定重新設(shè)置后的索引值對(duì)應(yīng)的另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng)。本發(fā)明的實(shí)施例根據(jù)當(dāng)前索引值及散列深度重新設(shè)置下一跳MAC地址的索引值。為了保證所有的FDB表項(xiàng)均可以被遍歷到,可采用下列方法重新設(shè)置下一跳MAC地址的索引值。設(shè)index(F)表示計(jì)算后的索引值,index(B)表示當(dāng)前的索引值;首先按index(F)=index(B)+h的方法計(jì)算索引值,若計(jì)算出的index(F)小于FDB表項(xiàng)的數(shù)目,即index(F)〈16*1024,則該計(jì)算結(jié)果即為下一跳MAC地址的重新設(shè)置的索引值;若計(jì)算出的index大于或等于FDB表項(xiàng)的數(shù)目,即index(F)>=16*1024,則將該計(jì)算結(jié)果按"(index(F)+1)modh"的方法進(jìn)行處理,該處理結(jié)果即為下一跳MAC地址的重新設(shè)置的索引值。下一跳MAC地址在添加的過程中,有可能在遍歷完所有的FDB表項(xiàng)后,仍不存在滿足條件可用來添加該下一跳MAC地址的FDB表項(xiàng),對(duì)于同一條下一跳MAC地址的添加過程,可以通過比較該下一跳MAC地址的初始索引值,以及重新設(shè)置的索引值是否相等來進(jìn)行判斷是否在已遍歷完的情況下仍沒有發(fā)現(xiàn)滿足條件的FDB表項(xiàng)。如第一次向FDB中添加下一跳MAC地址,默認(rèn)該下一跳MAC地址的初始索引值為0。按"index(F)=index(B)+4"的方法第一次遍歷到FDB底部時(shí)指向FDB的第16381項(xiàng),即FDB16380,仍未發(fā)現(xiàn)滿足條件的FDB表項(xiàng)(滿足條件的FDB表項(xiàng)在本發(fā)明的實(shí)施例中可以為空閑表項(xiàng),或動(dòng)態(tài)地址表項(xiàng)),然后再通過"index(F)-index(B)+4"計(jì)算后發(fā)現(xiàn)index(F)〉=16*1024,采用"(index(F)+1)mod4"的方法進(jìn)行再次處理,處理結(jié)果index=l,然后從index=l指向的FDB2繼續(xù)FDB表的第二次遍歷,直到第四次遍歷到FDB的底部FDB16383,仍未發(fā)現(xiàn)滿足條件的FDB表項(xiàng),然后再通過"index(F)-index(B)+4"計(jì)算后發(fā)現(xiàn)index(F)〉=16*1024,采用"(index(F)+1)mod4"的方法進(jìn)行再次處理,處理結(jié)果index=0。當(dāng)4全測(cè)到重新設(shè)置后的索引值與初始索引值相等時(shí),即可判斷已完全遍歷完FDB的所有FDB表項(xiàng),仍沒有發(fā)現(xiàn)滿足條件的FDB表項(xiàng)。圖5為本發(fā)明在FDB表中添加下一跳MAC地址的具體實(shí)例三的流程圖。該實(shí)例與實(shí)例一的區(qū)別在于,在步驟a51與a52之間還包括步驟a511、判斷整個(gè)FDB表是否已遍歷完,若是,則執(zhí)行步驟a512;否則,執(zhí)行步驟a52。步驟a512、返回添加失敗消息。圖6為本發(fā)明在FDB表中添加下一跳MAC地址的具體實(shí)例四的流程圖。該實(shí)例與實(shí)例二的區(qū)別在于,在步驟a51與a52之間還包括步驟b511、判斷整個(gè)FDB表是否已遍歷完,若是,則執(zhí)行步驟a512;否則,執(zhí)行步驟b52。步驟b512、返回添加失敗消息。實(shí)例四中,擴(kuò)大了FDB表項(xiàng)中滿足下一跳MAC地址添加條件的范圍,將動(dòng)態(tài)地址占用的動(dòng)態(tài)地址FDB表項(xiàng)也認(rèn)為符合下一跳MAC地址添加條件的表項(xiàng),即動(dòng)態(tài)地址占用的FDB空間也認(rèn)為是可用的空間,在使用該動(dòng)態(tài)地址表項(xiàng)之前,首先需要向交換機(jī)的其他模塊發(fā)出地址刪除或老化的通告,告知交換機(jī)的相應(yīng)模塊對(duì)該動(dòng)態(tài)地址表項(xiàng)進(jìn)行刪除操作,以騰出空間添加該下一跳MAC地址。上述實(shí)施例中,為了保證FDB表項(xiàng)中的下一跳MAC地址不^C當(dāng)作有效的二層轉(zhuǎn)發(fā)MAC地址,導(dǎo)致錯(cuò)誤的報(bào)文橋轉(zhuǎn)發(fā)行為發(fā)生,可以通過對(duì)下一跳MAC地址所在的FDB表項(xiàng)的VLANID字段進(jìn)行特殊設(shè)置來實(shí)現(xiàn),將VLANID字段設(shè)置為禁止MAC地址學(xué)習(xí),如添加特殊的數(shù)字、符號(hào)以使區(qū)別于二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)中的VLANID,通過該設(shè)置使得下一跳MAC地址所在的FDB表項(xiàng)的VLANID不會(huì)被作為用戶的VLANID,從而避免了錯(cuò)誤的報(bào)文橋轉(zhuǎn)發(fā)行為發(fā)生。存儲(chǔ)空間為16K的FDB,散列深度為4,則FDB有4K個(gè)散列單元,這時(shí)如有4K條不同路由下一跳MAC地址,根據(jù)上述實(shí)施例中所述的在FDB表中添加下一跳MAC地址的方法,理想情況下這4K不同的下一跳MAC地址均勻地分布在整個(gè)FDB表中,即在每個(gè)散列單元內(nèi)存放1條不同的下一跳MAC地址,如表4所示。表4本發(fā)明中FDB存儲(chǔ)空間使用表<table>tableseeoriginaldocumentpage15</column></row><table>本發(fā)明還提出了一種FDB設(shè)備。圖7為本發(fā)明一種FDB設(shè)備的實(shí)施例一的結(jié)構(gòu)示意圖,包括依次連接的依次連接的FDB表項(xiàng)指向單元100、FDB表項(xiàng)狀態(tài);險(xiǎn)測(cè)單元200以及下一跳MAC地址添加單元300;其中FDB表項(xiàng)指向單元IOO,用于接收下一跳MAC地址的添加請(qǐng)求消息,以及確定索引值對(duì)應(yīng)的FDB表項(xiàng);FDB表項(xiàng)狀態(tài)檢測(cè)單元200,與FDB表項(xiàng)指向單元100及下一跳MAC地址添加單元300連接,用于判斷所述FDB表項(xiàng)是否為空閑,若所述FDB表項(xiàng)空閑,則通知下一跳MAC地址添加單元300將所述下一跳MAC地址添加到該FDB表項(xiàng);若所述FDB表項(xiàng)非空閑,則通知FDB表項(xiàng)指向單元100,確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng)。圖8為本發(fā)明一種FDB設(shè)備的實(shí)施例二的結(jié)構(gòu)示意圖。該實(shí)施例除了具有上一實(shí)施例的結(jié)構(gòu)特征外,還包括動(dòng)態(tài)地址表項(xiàng)檢測(cè)單元400,與FDB表項(xiàng)狀態(tài)檢測(cè)單元200連接,當(dāng)FDB表項(xiàng)狀態(tài)檢測(cè)單元檢測(cè)出FDB表項(xiàng)非空閑后,判斷所述FDB表項(xiàng)是否為動(dòng)態(tài)地址表項(xiàng),若是,則發(fā)出刪除所述動(dòng)態(tài)地址表項(xiàng)中的MAC地址的通知,并調(diào)用下一跳MAC地址添加單元300,將所述下一跳MAC地址添加到該FDB表項(xiàng);否則,通知FDB表項(xiàng)指向單元100,確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng)。為了保證FDB表項(xiàng)中的下一跳MAC地址不被當(dāng)作有效的二層轉(zhuǎn)發(fā)MAC地址,導(dǎo)致錯(cuò)誤的報(bào)文橋轉(zhuǎn)發(fā)行為發(fā)生,可以通過對(duì)下一跳MAC地址所在的FDB表項(xiàng)的VLANID字段進(jìn)行特殊設(shè)置來實(shí)現(xiàn),將VLANID字段設(shè)置為禁止MAC地址學(xué)習(xí),通過該設(shè)置,使得下一跳MAC地址所在的FDB表項(xiàng)的VLANID不會(huì)被作為用戶的VLANID,從而避免了錯(cuò)誤的報(bào)文橋轉(zhuǎn)發(fā)行為發(fā)生。在FDB設(shè)備的一較佳實(shí)施例中,還包括VLANID設(shè)置單元,用于將下一跳MAC地址所在的FDB表項(xiàng)的VLANID字段設(shè)置為禁止MAC地址學(xué)習(xí)。該VLANID設(shè)置單元在FDB設(shè)備中,可以單獨(dú)設(shè)置;也可以與下一跳MAC地址添加單元連接,當(dāng)下一跳MAC地址添加單元將下一跳MAC地址添加到FDB表項(xiàng)中的同時(shí),可調(diào)用VLANID設(shè)置單元,對(duì)相應(yīng)的FDB表項(xiàng)中的VLANID字段進(jìn)行設(shè)置。本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述方法實(shí)施例的全部或部分步驟可以通過程序指令相關(guān)的硬件來完成,前述的程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),執(zhí)行包括上述方法實(shí)施例的步驟;而前述的存儲(chǔ)介質(zhì)包括R0M、R扁、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。綜上所述,本發(fā)明各實(shí)施例的在FDB表中添加下一跳MAC地址的方法、FDB設(shè)備具有以下有益效果(1)通過引入索引值,在添加下一跳MAC地址的過程中,是/人整體的FDB表中尋找空閑表項(xiàng),而非現(xiàn)有的固態(tài)分區(qū)法中僅從用于路由表的下一跳MAC地址存儲(chǔ)的區(qū)間中尋找空閑表項(xiàng),因此提高了FDB表的資源利用率。(2)通過引入散列單元,使得下一跳MAC地址在較均勻地分布在FDB表中的同時(shí),由于每一散列單元中對(duì)應(yīng)有數(shù)個(gè)FDB表項(xiàng),下一跳MAC地址在占用其中一個(gè)或數(shù)個(gè)FDB表項(xiàng)時(shí),仍能夠在保證學(xué)習(xí)或添加二層轉(zhuǎn)發(fā)MAC地址時(shí),散列沖突不發(fā)生超限的情況下,二層轉(zhuǎn)發(fā)MAC地址被成功的學(xué)習(xí)或添加,從而減少了對(duì)二層轉(zhuǎn)發(fā)地址的學(xué)習(xí)和添加的影響。如16K的FDB,散列深度為4,則FDB有4K個(gè)散列單元,這時(shí)如有8K條不同路由下一跳MAC地址,根據(jù)本方案,應(yīng)該在每個(gè)散列單元內(nèi)存放2條不同的下一跳MAC地址,這樣二層轉(zhuǎn)發(fā)MAC地址學(xué)習(xí)或添加時(shí)在散列沖突不超過2次的情況下,就能夠保證二層轉(zhuǎn)發(fā)MAC地址被成功的學(xué)習(xí)或添加。(3)下一跳MAC地址在添加的過程中,由于不與用于二層轉(zhuǎn)發(fā)的二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)共用,使得二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)與下一跳MAC地址表項(xiàng)在邏輯上分別歸屬于獨(dú)立的兩張表,從而便于二層轉(zhuǎn)發(fā)MAC地址表項(xiàng)及下一跳MAC地址表項(xiàng)的分別維護(hù)。(4)由于采用索引的方法從整體的FDB表中檢測(cè)空閑表項(xiàng),而非采用MAC地址和VLANID計(jì)算散列值的方法,因此避免了下一跳MAC地址添加過程中出現(xiàn)散列沖突的可能性以及由此而導(dǎo)致的添加失敗的可能性。(5)通過檢測(cè)FDB中的動(dòng)態(tài)地址表項(xiàng),并向交換機(jī)的其他模塊發(fā)送地址刪除或老化通告的方法,刪除動(dòng)態(tài)地址表項(xiàng),從而擴(kuò)大了FDB表項(xiàng)中滿足下一跳MAC地址添加條件的范圍。(6)通過對(duì)下一跳MAC地址所在的FDB表項(xiàng)的VLANID字4殳進(jìn)行特殊i殳置,以保證FDB表項(xiàng)中的下一跳MAC地址不被當(dāng)作有效的二層轉(zhuǎn)發(fā)MAC地址,從而避免了錯(cuò)誤的報(bào)文橋轉(zhuǎn)發(fā)行為發(fā)生。最后應(yīng)說明的是以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的精神和范圍。權(quán)利要求1、一種在FDB表中添加下一跳MAC地址的方法,其特征在于,包括步驟1、發(fā)送下一跳MAC地址的添加請(qǐng)求消息,所述添加請(qǐng)求消息中攜帶有下一跳MAC地址的初始索引值;步驟2、根據(jù)所述初始索引值確定一散列單元中的一FDB表項(xiàng)為初始FDB表項(xiàng);步驟3、檢測(cè)所述FDB表項(xiàng)是否為空閑,若所述FDB表項(xiàng)空閑,則將所述下一跳MAC地址添加到該FDB表項(xiàng);若所述FDB表項(xiàng)非空閑,確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng),重復(fù)步驟3,直至檢測(cè)到空閑的FDB表項(xiàng),將所述下一跳MAC地址添加到該FDB表項(xiàng)。2、根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟3中若所述FDB表項(xiàng)非空閑,判斷所述FDB表項(xiàng)是否為動(dòng)態(tài)地址表項(xiàng),若是,刪除所述動(dòng)態(tài)地址表項(xiàng)中的MAC地址,將所述下一跳MAC地址添加到該FDB表項(xiàng);否則,確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng)。3、根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述步驟3中將所述下一跳MAC地址添加到該FDB表項(xiàng)的同時(shí),還包括按預(yù)設(shè)方法對(duì)當(dāng)前索引值進(jìn)行處理,保存處理后的索引值,所述處理后的索引值用于作為下一條下一跳MAC地址的初始索引值。4、根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述步驟3中確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng)具體包括按預(yù)設(shè)方法重新設(shè)置所述下一跳MAC地址的索引值,確定重新設(shè)置后的索引值對(duì)應(yīng)的另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng)。5、根據(jù)權(quán)利要求4所述的方法,其特征在于,還包括判斷重新設(shè)置后的索引值與初始索引值是否相等,若相同,返回該下一跳MAC地址添加失敗的消息。6、根據(jù)權(quán)利要求l所述的方法,其特征在于,還包括將下一跳MAC地址所在的FDB表項(xiàng)的VLANID字段設(shè)置為禁止MAC地址學(xué)習(xí)。7、一種FDB設(shè)備,其特征在于,包括依次連接的FDB表項(xiàng)指向單元、FDB表項(xiàng)狀態(tài)檢測(cè)單元以及下一跳MAC地址添加單元;FDB表項(xiàng)指向單元,用于接收下一跳亂C地址的添加請(qǐng)求消息,以及確定索引值對(duì)應(yīng)的FDB表項(xiàng);FDB表項(xiàng)狀態(tài)檢測(cè)單元,與所述FDB表項(xiàng)指向單元及下一跳MAC地址添加單元連接,用于判斷所述FDB表項(xiàng)是否為空閑,若所述FDB表項(xiàng)空閑,則通知下一跳MAC地址添加單元將所述下一跳MAC地址添加到該FDB表項(xiàng);若所述FDB表項(xiàng)非空閑,則通知FDB表項(xiàng)指向單元,確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng)。8、根據(jù)權(quán)利要求7所述的設(shè)備,其特征在于,還包括動(dòng)態(tài)地址表項(xiàng)檢測(cè)單元,與FDB表項(xiàng)狀態(tài)檢測(cè)單元連接,當(dāng)FDB表項(xiàng)狀態(tài)檢測(cè)單元檢測(cè)出FDB表項(xiàng)非空閑后,判斷所述FDB表項(xiàng)是否為動(dòng)態(tài)地址表項(xiàng),若是,則發(fā)出刪除所述動(dòng)態(tài)地址表項(xiàng)中的MAC地址的通知,并調(diào)用下一跳MAC地址添加單元,將所述下一跳MAC地址添加到該FDB表項(xiàng);否則,通知FDB表項(xiàng)指向單元,確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng)。9、根據(jù)權(quán)利要求7或8所述的設(shè)備,其特征在于,還包括VLANID字段設(shè)置單元,用于將下一跳MAC地址所在的FDB表項(xiàng)的VLANID字段設(shè)置為禁止MAC地址學(xué)習(xí)。全文摘要本發(fā)明一種在FDB表中添加下一跳MAC地址的方法的實(shí)施例,包括步驟1.發(fā)送下一跳MAC地址的添加請(qǐng)求消息;步驟2.根據(jù)所述初始索引值確定一散列單元中的一FDB表項(xiàng)為初始FDB表項(xiàng);步驟3.檢測(cè)所述FDB表項(xiàng)是否為空閑,若所述FDB表項(xiàng)空閑,則將所述下一跳MAC地址添加到該FDB表項(xiàng);若所述FDB表項(xiàng)非空閑,確定另一散列單元中的一FDB表項(xiàng)為下一條FDB表項(xiàng),重復(fù)此步驟,直至檢測(cè)到空閑的FDB表項(xiàng),將所述下一跳MAC地址添加到該FDB表項(xiàng)。本發(fā)明一種FDB設(shè)備的實(shí)施例,包括依次連接的FDB表項(xiàng)指向單元、FDB表項(xiàng)狀態(tài)檢測(cè)單元以及下一跳MAC地址添加單元。本發(fā)明的實(shí)施例中,下一跳MAC地址較均勻的添加到FDB表,提高了FDB表的資源利用率,減少了對(duì)二層轉(zhuǎn)發(fā)地址的學(xué)習(xí)和添加的影響。文檔編號(hào)G06F17/30GK101110771SQ20071012012公開日2008年1月23日申請(qǐng)日期2007年8月9日優(yōu)先權(quán)日2007年8月9日發(fā)明者高興福申請(qǐng)人:福建星網(wǎng)銳捷網(wǎng)絡(luò)有限公司