0731-84728105
15116127200
二層交換機(jī)原型設計與實現(八)
發布時間:2021-06-21
     在二層交換機(jī)環境下(xià),當通(tōng)信雙方持續交互數據時,會(huì)不斷命中雙方主機(jī)的MAC轉發表項,使其處于一(yī)個(gè)熱狀态。當某一(yī)主機(jī)長(cháng)時間不與外界聯系時,該主機(jī)的MAC轉發表項就(jiù)會(huì)長(cháng)時間不被使用,其為(wèi)冷狀态。MAC地址老化意思就(jiù)是MAC轉發表項長(cháng)時間不用到(dào),觸發老化機(jī)制将其從(cóng)表項中清除。表項到(dào)底要到(dào)多(duō)冷的狀态,具體是多(duō)長(cháng)時間不用到(dào)才被老化,這個(gè)時間叫做老化時間。
     MAC地址為(wèi)什麽要老化?要做老化的主要原因是MAC轉發表項不夠用,換更大容量則比較費(fèi)錢(qián)。産品在有限的資源下(xià)總是想幹點更大的事(shì)情。出發點是好的,現實也是允許的。交換機(jī)允許做老化是跟他的應用場景、網絡通(tōng)信模型相(xiàng)關的。流量交互越密集、節點分布越離散對MAC轉發表的容量要求越大,反之容量可以較小(xiǎo)。老化就(jiù)是在容量和時間的兩個(gè)維度上(shàng)做出的一(yī)種優化策略,核心是一(yī)種對成本的優化考慮。将理論的容量大小(xiǎo)縮減,調整老化的時間長(cháng)短,使其達到(dào)一(yī)個(gè)均衡穩定狀态。這一(yī)狀态是指網絡的通(tōng)信服務質量是可被接受的。一(yī)味的調小(xiǎo)轉發表容量和縮短老化時間,會(huì)讓網絡通(tōng)信産生(shēng)不可容忍的服務質量。故在不同的應用場景下(xià),交換機(jī)的MAC轉發表容量不同、老化時間也不盡相(xiàng)等。
     MAC地址老化是以時間為(wèi)參考進行處理的,故在MAC轉發表字段中需要新設置時間戳字段,用以記錄MAC轉發表項的最新使用時間。MAC轉發表項的定義修改如下(xià):

struct row_port_mac
{
      u8 port;
      u8 pad;/*内存對齊*/
      u8 mac[MAC_LEN];
      struct timeval tv;/*記錄MAC最新更新時間*/
}

     1)老化方法
     每次MAC查表命中都要進行MAC表項的時間更新,MAC轉發表的老化要根據表項的更新時間來判斷,與當前檢查時間相(xiàng)比較,如果超過了預先設定的閥值則将該表項老化。老化在交換機(jī)中的具體實現是怎樣的?以下(xià)講述兩種方法。一(yī)種是傳統較好理解的老化線程方法;另一(yī)種是本平台實現場景下(xià)的最大化資源優化方法——X方法。
     老化線程的方法是指,通(tōng)過啓動額外的專門(mén)線程,負責掃描整個(gè)MAC轉發表,逐項比較表項時間是否達到(dào)老化要求,從(cóng)而做出正确的老化行為(wèi)。該方法的實現方法即是線程循環、遍曆表項、比較時間、清除表項、休眠、進入下(xià)次循環。該方法實現簡單,也比較适合硬件(jiàn)實現。
     X方法是指不采用額外線程輪詢遍曆的方式實現老化,那不遍曆,不判斷如何才能(néng)老化呢(ne)?這就(jiù)是前面定語描述的,在本平台實現場景下(xià)的實現基礎上(shàng)完成老化功能(néng)。我們可以回顧一(yī)下(xià),前面的二層交換功能(néng)中的MAC地址學習過程。将新MAC地址學習與查找匹配優化到(dào)了一(yī)起實現,這一(yī)實現過程中其實就(jiù)存在遍曆與判斷的邏輯,那我們隻要将此功能(néng)稍加調整,便可實現老化功能(néng)。核心實現方法如下(xià):
       a. 在MAC學習查找過程中,匹配到(dào)表項則更新時間;
       b. 未匹配時,負責查找一(yī)個(gè)未使用空間時的判斷改為(wèi)尋找一(yī)個(gè)使用時間超過閥值的判斷。
     1)老化代碼實現
     老化判斷函數,老化時間用戶可自(zì)己定義大小(xiǎo)。

#define AGING_TIME 30 /*老化超時時間長(cháng)度,單位秒(miǎo)*/
int aging_match(int idx,struct timeval *now)
{
       return obx_mac_tbl->row[idx].tv.tv_sec + AGING_TIME < now->tv_sec;
}

     修改MAC學習與查找功能(néng),将原來的查找空MAC表項改為(wèi)查找可老化表項,如果表項是空,則其時間字段為(wèi)零,也會(huì)是需要被老化的表項。

/*else if(j == -1 && !ether_addr_equal((u8 *)&zero_mac,obx_mac_tbl->row[i].mac))*/
else if(j == -1 && aging_match(i,&now))
{
      j = i;/*記錄第一(yī)個(gè)可老化表項位置*/
      /*記錄第一(yī)個(gè)找到(dào)為(wèi)空白(bái)表項位置*/
}

     上(shàng)述老化有何優勢?不需要額外的線程資源,不需要更多(duō)的輪詢遍曆所有MAC表項。通(tōng)過轉發過程中觸發式的完成老化功能(néng)。有數據交換了,進入到(dào)該MAC學習流程,若匹配上(shàng)了,則更新時間返回;若沒有匹配上(shàng)MAC地址,則最壞情況是全表遍曆并找到(dào)一(yī)個(gè)老化表項。
     我們并不是要突出該方法的好處,真實的硬件(jiàn)也不會(huì)這麽實現。但在一(yī)個(gè)抽象的環境中,方案應該具備普适性,而在面向一(yī)個(gè)具體的場景時,方法可具特異性,這樣就(jiù)可以使解決方案更符合場景需求,達到(dào)最優解狀态。
     1)端口斷開(kāi)對老化影響
     MAC表老化除了表項不夠用外還(hái)有一(yī)種情況就(jiù)是端口發生(shēng)變化,如從(cóng)UP狀态變成DOWN狀态,發生(shēng)的原因有多(duō)種。但最壞的情況是原來連接到(dào)端口的網絡可能(néng)會(huì)發生(shēng)變化,如用戶将網絡連接端口進行了更換。由此帶來的問題的,基于原來的端口轉發表項全部會(huì)失效或帶來錯(cuò)誤,會(huì)嚴重影響網絡的通(tōng)信。雖然切換端口會(huì)影響網絡,但如果不做端口老化,則會(huì)延長(cháng)影響時間。故在交換機(jī)的端口發生(shēng)DOWN的事(shì)件(jiàn)後,必須将該端口轉發輸出的所有MAC表項内容清除,全部老化掉。
     2)MAC轉發表硬件(jiàn)卸載
     二層交換機(jī)的基本設計基本上(shàng)隻講到(dào)這為(wèi)止,但這畢竟隻是一(yī)個(gè)軟件(jiàn)的二層交換,其性能(néng)無法達到(dào)我們真實場景測試驗證的要求。FAST架構是一(yī)個(gè)平台無關的軟硬件(jiàn)協同處理架構,在FAST架構下(xià),我們可以非常容易的将MAC轉發表卸載到(dào)硬件(jiàn)實現。由軟件(jiàn)實現MAC地址的學習,然後将其配置到(dào)硬件(jiàn)流表,後續該MAC地址的分組便可直接在硬件(jiàn)完成交換功能(néng),從(cóng)而可以達到(dào)線速轉發能(néng)力。下(xià)一(yī)篇文件(jiàn)我們将講述如何在FAST架構下(xià)将二層交換的MAC轉發表卸載到(dào)硬件(jiàn)。
      歡迎您和學生(shēng)們加入FAST開(kāi)源項目群溝通(tōng)與探讨,一(yī)起體驗不一(yī)樣的系統設計過程。請先加微信号15116127200後邀請入群。

關注FAST開(kāi)源社區
FAST一(yī)一(yī)開(kāi)源、開(kāi)放(fàng)、高(gāo)速、高(gāo)效、可編程、可定義!軟硬件(jiàn)協同并行處理。