為解決高速以太網(wǎng)鏈路接口中軟件方式實(shí)現(xiàn)的MAC層地址表機(jī)制在處理效率上受到制約的問題,提出了一種基于FPGA (現(xiàn)場(chǎng)可編程門陣列)硬件電路方式實(shí)現(xiàn)以太網(wǎng)交換機(jī)中MAC地址表的查找,學(xué)習(xí)和老化。該方法采用hashing算法建立地址表項(xiàng)索引值與MAC地址之間的對(duì)應(yīng)關(guān)系,完成滿足平均時(shí)間復(fù)雜度為O (1)的地址查找。由于實(shí)際交換機(jī)中地址表容量有限,地址學(xué)習(xí)只能是MAC地址的子集,通過優(yōu)化hashing函數(shù)降低地址沖突發(fā)生的概率以及設(shè)計(jì)一種地址老化機(jī)制提高地址表查找能力。仿真結(jié)果表明,地址表機(jī)制采用硬件電路方式實(shí)現(xiàn)比軟件方式處理效率更高。
引 言
在計(jì)算機(jī)網(wǎng)絡(luò)中,數(shù)據(jù)鏈路層完成節(jié)點(diǎn)到節(jié)點(diǎn)的通信,二層以太網(wǎng)交換機(jī)屬于數(shù)據(jù)鏈路層設(shè)備[1]。MAC (介質(zhì)訪問控制)地址是在網(wǎng)絡(luò)通信用來識(shí)別主機(jī)的標(biāo)識(shí)。交換機(jī)的緩存中有一個(gè)MAC地址表,需要轉(zhuǎn)發(fā)數(shù)據(jù)時(shí),交換機(jī)會(huì)在地址表查詢是否有與目的MAC地址對(duì)應(yīng)的表項(xiàng),如果有,交換機(jī)立即將數(shù)據(jù)報(bào)文往該表項(xiàng)中的轉(zhuǎn)發(fā)端口發(fā)送;如果沒有,交換機(jī)則會(huì)將數(shù)據(jù)報(bào)文以廣播的形式發(fā)送到除了接收端口外的所有端口,盡最大能力保證目的主機(jī)接收到數(shù)據(jù)報(bào)文。因此,交換機(jī)地址表的構(gòu)建和維護(hù)決定了數(shù)據(jù)轉(zhuǎn)發(fā)的方向和效率。
MAC層地址表存儲(chǔ)查找多基于hash表。Hashing是一種用于以常熟平均時(shí)間插入、刪除和查找的技術(shù),hash表通過把關(guān)鍵碼值映射到表中一個(gè)位置來訪問記錄。這個(gè)映射函數(shù)叫做hashing函數(shù),存放記錄的數(shù)組叫做hash表。交換機(jī)地址表存儲(chǔ)的是全部MAC地址的一個(gè)子集因此必然會(huì)發(fā)生地址沖突,文獻(xiàn)[2-3]對(duì)比了幾種解決沖突的方法。
MAC地址表的容量是有限的,因此交換機(jī)采用老化機(jī)制來維護(hù)MAC地址表,以保證最大限度地利用地址表項(xiàng)資源。交換機(jī)在構(gòu)建某條表項(xiàng)時(shí),會(huì)相應(yīng)地開啟該表項(xiàng)的老化定時(shí)器[4],如果在老化時(shí)間內(nèi),交換機(jī)始終沒有收到該表項(xiàng)中的MAC地址的報(bào)文,交換機(jī)就會(huì)將該表項(xiàng)刪除,失效的表項(xiàng)不會(huì)繼續(xù)占用MAC地址表資源。這樣,即使網(wǎng)絡(luò)中的設(shè)備更換或者移除,交換機(jī)的MAC地址表始終能保持網(wǎng)絡(luò)中最新的拓?fù)浣Y(jié)構(gòu)記錄。合適的老化時(shí)間可以提高MAC地址表項(xiàng)資源的利用率,但過長(zhǎng)或過短的老化時(shí)間,反而影響交換機(jī)的性能。如果老化時(shí)間過長(zhǎng),交換機(jī)中保存的MAC地址表項(xiàng)的數(shù)量過多會(huì)將地址表資源消耗完,網(wǎng)絡(luò)中的拓?fù)渥兓蜔o法及時(shí)更新;如果老化時(shí)間過短,則有效的MAC地址表項(xiàng)會(huì)被交換機(jī)過早刪除,從而降低交換機(jī)的轉(zhuǎn)發(fā)效率。
傳統(tǒng)的MAC地址表處理機(jī)制主要采用軟件的方式實(shí)現(xiàn)[5]。隨著以太網(wǎng)鏈路接口的速率從1Gb/s發(fā)展到10Gb/s,基于軟件的算法在速度上受到串行計(jì)算機(jī)系統(tǒng)的制約。新一代現(xiàn)場(chǎng)可編程門陣列(FPGA)的出現(xiàn)以后,算法通過硬電路描述,所有的延遲只來源于門電路,而一般門電路的延遲都在ns級(jí)別。減少了系統(tǒng)運(yùn)行所需的時(shí)鐘周期數(shù),實(shí)現(xiàn)了真正的高速率。
1 地址表處理機(jī)制
本數(shù)字電路設(shè)計(jì)中,采用單一時(shí)鐘域的同步時(shí)序設(shè)計(jì),所有的觸發(fā)器都是在同一個(gè)時(shí)鐘節(jié)拍下進(jìn)行翻轉(zhuǎn)。這樣就簡(jiǎn)化了整個(gè)設(shè)計(jì),后端綜合、布局布線的時(shí)序約束容易實(shí)現(xiàn)。
地址表占用的空間由片內(nèi)存儲(chǔ)器RAM 提供,片內(nèi)存儲(chǔ)器是基于FPGA的系統(tǒng)可使用的最簡(jiǎn)單的存儲(chǔ)器,存儲(chǔ)、讀取是在FPGA內(nèi)部完成,電路板上無需外部連線,具有最高吞吐量和最低反應(yīng)延時(shí)的,適用于緩存和查找表。地址表表項(xiàng)中至少記錄mac物理地址,端口號(hào)。每個(gè)mac地址表項(xiàng)的數(shù)據(jù)結(jié)構(gòu)見表1。
?
定義如下:
Valid:表項(xiàng)有效指示,1代表有效表項(xiàng),0代表空閑表項(xiàng)。
Age:老化比特,地址表更新時(shí)查詢的位段,1代表年輕,0代表老化。
Mac address:48bit物理地址。
Port_id:物理地址對(duì)應(yīng)的端口號(hào)。
地址表項(xiàng)寫入表中的位置即地址學(xué)習(xí)由源地址(MAC地址)經(jīng)過hashing算法求得的索引值決定。地址表項(xiàng)的讀取即地址表查詢由目的地址(物理地址)經(jīng)過hashing算法求得的索引值決定。Hashing算法本身消耗一部分時(shí)序,物理地址的學(xué)習(xí)和查詢就需要等待這部分時(shí)序,為了使得地址表處理起來更加清晰、明確,整個(gè)設(shè)計(jì)分為3個(gè)模塊(如圖1所示):地址表的輸入調(diào)整、地址表處理機(jī)制、地址表的輸出調(diào)整。
?
模塊劃分后,本級(jí)模塊向下一級(jí)模塊一次性交付需要處理的所有并行數(shù)據(jù)。
1.1 地址表輸入調(diào)整(fifo_in)
Fifo_in模塊完成兩種操作,對(duì)輸入的MAC地址求解hashing索引值(xx_mac_index);間隔4s產(chǎn)生地址表更新信號(hào)(upd_en),更新信號(hào)為高電平有效,持續(xù)時(shí)間由地址表的深度決定,遍歷地址表,一個(gè)時(shí)鐘周期處理一個(gè)表項(xiàng)。
Hashing算法:為了快速的存取地址表項(xiàng),采用hashing算法[6]建立地址表項(xiàng)索引值與實(shí)際MAC地址之間的對(duì)應(yīng)關(guān)系(每個(gè)MAC地址只能對(duì)應(yīng)一個(gè)索引值,但是每個(gè)索引值有可能對(duì)應(yīng)多個(gè)MAC地址,即發(fā)生了地址沖突)。
使用復(fù)雜的hashing算法,會(huì)延長(zhǎng)計(jì)算索引的時(shí)間,降低地址表的查找速度,增加交換機(jī)的包轉(zhuǎn)發(fā)時(shí)延。
在交換控制芯片設(shè)計(jì)中本項(xiàng)目算法使用CRC-CCITTD多項(xiàng)式 為hashing函數(shù),48位MAC地址由CRC[7-8]校驗(yàn)方法后的結(jié)果通過hashing函數(shù)求得16位余數(shù),取結(jié)果16位余數(shù)中11個(gè)比特用于2KB地址表項(xiàng)索引值。Hashing函數(shù)計(jì)算的狀態(tài)機(jī)如圖2所示。
?
交換機(jī)MAC層容納的地址表大小是有限的,理論上實(shí)際的物理地址有2的48次方個(gè),地址表只能記錄其中一個(gè)很小的子集,因此hashing函數(shù)不可避免地將不同的MAC地址映射到相同的地址表項(xiàng)索引值。如果以太網(wǎng)中地址表項(xiàng)索引值與MAC地址存在多對(duì)一的情況,就是發(fā)生了“地址沖突”。地址沖突的存在也說明總有部分MAC地址丟失,不能被交換機(jī)學(xué)習(xí)到。地址沖突的解決方法在1.2中予以實(shí)現(xiàn)。
?
地址表組織結(jié)構(gòu)如圖3。圖3左邊列出的是地址表RAM 中每個(gè)hashing桶內(nèi)表項(xiàng)0在RAM 中的地址。在開始地址存儲(chǔ)和查找時(shí),通過CRC校驗(yàn)得到的索引值指向的hashing桶內(nèi)表項(xiàng)0與表項(xiàng)1被讀出,通過對(duì)MAC地址域進(jìn)行比較確定匹配的表項(xiàng),得到轉(zhuǎn)發(fā)端口的信息。
1.2 地址表處理機(jī)制的實(shí)現(xiàn)方法(AddrList_Proc)
1.2.1 地址學(xué)習(xí)和查找的實(shí)現(xiàn)
以太網(wǎng)幀結(jié)構(gòu)中的源地址(sa_mac)用于地址學(xué)習(xí)。目的地址(da_mac)用于地址查找。
對(duì)于較大吞吐量的交換芯片,能做到平均時(shí)間復(fù)雜度滿足線性的學(xué)習(xí)和查找。學(xué)習(xí)和查找采用hashing算法,發(fā)生碰撞采用hashing算法,碰撞后采用相鄰空間開放定址法(open addressing hashing)[9-10]。
學(xué)習(xí)的過程如下:
(1)根據(jù)hashing索引值sa_index,檢索MAC 地址表。
(2)表項(xiàng)中Valid字段若為1代表該表項(xiàng)已占用,轉(zhuǎn)(3),否則表項(xiàng)空閑,轉(zhuǎn)(7)。
(3)表項(xiàng)內(nèi)容中的MAC地址與sa_mac進(jìn)行比較,若相同I_Find置1,轉(zhuǎn)(7),否則轉(zhuǎn)(4),此時(shí)發(fā)生地址沖突。
(4)sa_index+1表項(xiàng)中Valid字段若為1代表此處表項(xiàng)已占用,轉(zhuǎn)(5),否則表項(xiàng)空閑轉(zhuǎn)(7)。
(5)表項(xiàng)內(nèi)容中的MAC地址與sa_mac進(jìn)行比較,若相同I_Find置1,轉(zhuǎn)(7),否則轉(zhuǎn)(6),此時(shí)發(fā)生地址沖突。
(6)此時(shí)有超過兩個(gè)不同的MAC地址映射同一索引值,并且先到的寫入sa_index和sa_index+1處。后面到達(dá)的MAC地址覆蓋掉sa_index處表項(xiàng),完成一次學(xué)習(xí)。
(7)寫入該位置,Valid置1,Age置1,完成一次學(xué)習(xí)。
查找的過程如下:
(1)判斷是不是廣播包,若是轉(zhuǎn)(10),否則轉(zhuǎn)(2)。
(2)根據(jù)hashing索引值da_index,檢索MAC 地址表。
(3)da_index和da_index+1的Valid字段組成二元組<valid0,valid1>,<0,0>轉(zhuǎn)(4)、<0,1>轉(zhuǎn)(5)、<1,0>轉(zhuǎn)(6)、<1,1>轉(zhuǎn)(7)。
(4)da_mac不在地址表中,轉(zhuǎn)(9)。
(5)da_index+1表項(xiàng)內(nèi)容中MAC地址與da_mac比較,若兩者相同,轉(zhuǎn)(8),否則轉(zhuǎn)(9)。
(6)da_index表項(xiàng)內(nèi)容中MAC地址與da_mac比較,若兩者相同,轉(zhuǎn)(8),否則轉(zhuǎn)(9)。
(7)da_mac在地址表中轉(zhuǎn)(8),否則轉(zhuǎn)(9)。
(8)讀取表項(xiàng)內(nèi)容中的端口號(hào),與da_mac組成一組數(shù)據(jù)發(fā)給到fifo_out,完成一次查找。
(9)廣播該MAC地址,發(fā)送da_mac和需要廣播標(biāo)志位給fifo_out,完成一次查找。
(10)I_Find標(biāo)志位為1代表地址表中有廣播請(qǐng)求的MAC地址,不需要繼續(xù)廣播下去。I_Find標(biāo)志位為0代表需要繼續(xù)廣播下去,轉(zhuǎn)(11)。
(11)發(fā)送sa_mac和需要廣播標(biāo)志位給fifo_out,完成一次查找。
1.2.2 地址老化的實(shí)現(xiàn)
交換機(jī)通過端口發(fā)送和接收幀的源地址(源MAC地址、端口號(hào))將存儲(chǔ)到地址表中。老化時(shí)間是一個(gè)影響交換機(jī)學(xué)習(xí)進(jìn)程的參數(shù)。為地址表中每條地址項(xiàng)添加一個(gè)計(jì)數(shù)器用于表示該地址項(xiàng)的更新時(shí)間,通過查詢計(jì)數(shù)器位是否為零判斷一個(gè)地址是否已經(jīng)老化。在更新過程中,所有的輸出引腳處于“懸掛”。
老化過程如下:
(1)檢測(cè)到更新信號(hào)upd_en為高電平時(shí),開始遍歷整個(gè)地址表。
(2)表項(xiàng)中Age字段為1,代表上一次遍歷周期到此遍歷周期內(nèi)該表項(xiàng)對(duì)應(yīng)的MAC 地址被重新寫入過,轉(zhuǎn)(3),否則(4)。
(3)表項(xiàng)中的Valid字段保持1,Age字段置0。
(4)表項(xiàng)中的Valid字段置0 (刪除已老化的)。
(5)等待upd_en為低電平時(shí)停止遍歷,完成一次地址老化。
3 地址表的輸出調(diào)整(fifo_out)
Fifo_out模塊根據(jù)前一級(jí)提供的各種標(biāo)志信號(hào),實(shí)現(xiàn)對(duì)輸出的控制。輸入的數(shù)據(jù)信號(hào)有源地址,目的地址,查找到的表項(xiàng),輸入的標(biāo)志信號(hào)有nd_br_packet (需要廣播標(biāo)志),Is_br_packet(是廣播包標(biāo)志)。
Is_br_packet=1,nd_br_packet=0代表“是廣播包,不需要廣播”,對(duì)應(yīng)地址表處理機(jī)制中的事件—接收到廣播包中的MAC地址存在地址表中。沒有輸出。
Is_br_packet=1,nd_br_packet=1代表“是廣播包,需要廣播”,對(duì)應(yīng)地址表處理機(jī)制中的事件—繼續(xù)廣播下去。sa_mac經(jīng)過封裝由dout0~dout3輸出。
Is_br_packet=0,nd_br_packet=0代表“不是廣播包,不需要廣播”,對(duì)應(yīng)地址表處理機(jī)制中的事件—單播包中目的地址存在地址表中。表項(xiàng)經(jīng)過封裝,對(duì)應(yīng)端口輸出。
Is_br_packet=0,nd_br_packet=1代表“不是廣播包,需要廣播”,對(duì)應(yīng)地址表處理機(jī)制中的事件—目的地址不存在地址表中。da_mac經(jīng)過封裝由dout0~dout3輸出。
2 不同hashing函數(shù)的沖突率
Hashing算法的主要原理就是把大范圍映射到小范圍,沖突率和hashing函數(shù)的選取有密切的關(guān)系,圖4中選取了4種不hashing函數(shù)下發(fā)生地址沖突的概率。情況一采用的Hashing函數(shù)為MAC地址和自身倒序做異或運(yùn)算所得的結(jié)果經(jīng)過CRC計(jì)算后取最后11位索引值;情況二采用的Hashing函數(shù)為MAC地址和自身倒序做異或運(yùn)算所得的結(jié)果經(jīng)過CRC計(jì)算后取前11位索引值;情況三采用的Hashing函數(shù)為MAC地址平方后取中間11位為索引值,情況四采用的Hashing函數(shù)為將MAC地址分割成位數(shù)相同的3部分,疊加這三部分的和取后11位為索引值。
仿真過程描述如下:
48位二進(jìn)制數(shù)表示的范圍劃分為三子段,每個(gè)子段隨機(jī)生成3000個(gè)數(shù)。一共有9000個(gè)隨機(jī)MAC地址,依次按照4種情況提供的hashing函數(shù)計(jì)算結(jié)果,索引值一樣沖突加一,分別在不同的地址表容量下求沖突率。
不同hashing函數(shù)沖突率如圖4所示。
?
仿真結(jié)果表明地址表項(xiàng)容量和MAC地址數(shù)量接近時(shí)基本不發(fā)生沖突,在地址表較小情況下對(duì)于本次實(shí)驗(yàn)給出的信源情況三的hashing函數(shù)有較小的沖突率。所以在選取hashing函數(shù)時(shí)要結(jié)合該節(jié)點(diǎn)實(shí)際收發(fā)MAC地址的概率模型,這樣才能有效的降低地址沖突發(fā)生。
3 設(shè)計(jì)與驗(yàn)證
仿真過程中,時(shí)鐘周期100ns,MAC地址取48bit中的后16bit,地址表深度為64,hashing算法采用CRC8取結(jié)果的后6bit。這樣處理的理由有兩點(diǎn):第一48bit與16bit原理相同,16bit占用的資源少;第二MAC地址前24bit是由設(shè)備廠商分配的序列號(hào),對(duì)于一部分MAC地址只有后16bit不同。
sa_mac既是輸入也是輸出,fifo_in內(nèi)的寄存器保存一次輸入信號(hào),待hashing算法后和索引值同步輸出,如圖5所示。
?
圖6的仿真結(jié)果中可以看到,1200ns學(xué)習(xí)到MAC地址(16′h7A0C),1500ns接收到對(duì)該MAC地址的廣播包,停止繼續(xù)廣播下去。
?
圖7的仿真結(jié)果中可以看到2100ns查詢的目的地址(16’hC0A7)存在于地址表中,它是2000ns寫入地址表中的。
?
圖8中所示2600ns開始地址更新,消耗64個(gè)時(shí)鐘周期,遍歷所有的表項(xiàng)。9000ns后的輸入和地址表更新前得輸入相同,可以看出有相同的輸出。
?
圖9所示不同的標(biāo)志信號(hào)控制不同的輸出,可以看到1700ns和1800ns都是向端口2轉(zhuǎn)發(fā)數(shù)據(jù)。1400ns向4個(gè)端口廣播。
?
4 結(jié)束語
對(duì)于以太網(wǎng)交換機(jī)來說,主要工作是根據(jù)收到數(shù)據(jù)幀中的目的MAC地址,對(duì)MAC地址表進(jìn)行查找,把數(shù)據(jù)幀轉(zhuǎn)發(fā)到相應(yīng)的端口。MAC地址表的查表效率直接影響交換機(jī)的性能。Hashing算法可以實(shí)現(xiàn)高效率的存儲(chǔ)和查找,但存在地址沖突,選擇合適的hashing函數(shù)是解決問題的有效途徑之一。比如可以統(tǒng)計(jì)交換機(jī)各端口hashing索引值的概率分布,找出發(fā)生沖突較高的區(qū)域,對(duì)這些區(qū)域按照概率進(jìn)行排序,hashing函數(shù)針對(duì)沖突域中概率大的幾個(gè)MAC地址來構(gòu)造。
評(píng)論
查看更多