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

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

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

#define AGING_TIME 30 /*老(lǎo)化超時(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學習與查找功能(néng),将原來(lái)的查找空(kōng)MAC表項改爲查找可老(lǎo)化表項,如果表項是空(kōng),則其時(shí)間字段爲零,也(yě)會(huì)是需要被老(lǎo)化的表項。

/*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;/*記錄第一個可老(lǎo)化表項位置*/
      /*記錄第一個找到(dào)爲空(kōng)白(bái)表項位置*/
}

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

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