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

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

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

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

     修改MAC學習與查找功能,将原來(lái)的(de)查找空MAC表項改爲(wéi / wèi)查找可老化表項,如果表項是(shì)空,則其時(shí)間字段爲(wéi / wèi)零,也(yě)會是(shì)需要(yào / yāo)被老化的(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;/*記錄第一個(gè)可老化表項位置*/
      /*記錄第一個(gè)找到(dào)爲(wéi / wèi)空白表項位置*/
}

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

關注FAST開源社區
FAST一一開源、開放、高速、高效、可編程、可定義!軟硬件協同并行處理。