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

struct row_port_mac
{
      u8 port;
      u8 pad;/*內(nèi)存對齊*/
      u8 mac[MAC_LEN];
      struct timeval tv;/*記錄MAC最新更新時間*/
}

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

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

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

/*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ī)個可(kě)老化表項位置*/
      /*記錄第一(yī)個找到為(wèi)空白表項位置*/
}

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

關注FAST開源社區
FAST一(yī)一(yī)開源、開放、高(gāo)速、高(gāo)效、可(kě)編程、可(kě)定義!軟硬件協同并行(xíng)處理(lǐ)。