二層交換機原型設計(jì)與實現(xiàn)(六)
發布時(shí)間:2021-05-31
上(shàng)一篇文(wén)章已經了(le)解到(dào)如何學習MAC和(hé)根據MAC查表得到(dào)輸出結果。輸出結果有兩種可能(néng),一種是确定的輸出端口号,指示分組從(cóng)确定的端口号輸出;另一種是查不到(dào)匹配表項,需要廣播(泛洪)輸出。交換機除了(le)正常端口号輸出和(hé)廣播輸出外(wài),還有一種方式就是多播輸出。要求同一個分組從(cóng)指定的多個端口分别輸出。
分組輸出是單播還是多播是根據其MAC地址的标識來(lái)區(qū)分的。
1)單播
單播的分組如何識别,有什(shén)麽特征區(qū)分呢(ne)?從(cóng)MAC地址的設計(jì)上(shàng)做了(le)嚴格的區(qū)分。MAC地址一共6個字節,其第1個字節的最低(dī)位bit值如果爲0,則表示其是一個單播MAC地址。單播地址是分配給每一個單獨網卡使用(yòng)的物理(lǐ)标識地址,所以一個單播地址是肯定對(duì)應到(dào)一台單獨的主機。單獨的主機肯定是連接在交換機的一個特定的端口上(shàng)面,故單播地址分組轉發,也(yě)就是一個單獨确定的端口号,其端口标記用(yòng)一個數字表示即可。
2)多播
與單播相對(duì),其标識定義也(yě)就是MAC地址的第1個字節的最低(dī)位bit是1,則表示一個多播地址。特别的,如果MAC地址的所有bit位都是1,則表示一個廣播地址。多播與單播的差異除了(le)MAC地址的标識不同外(wài),另外(wài)最大(dà)的區(qū)别就是,一個多播地址代表的是一組主機,可以是包含1台或是多台主機。那多播地址的分組轉發,如何确定給哪些(xiē)主機發送,從(cóng)哪些(xiē)端口轉發呢(ne)?在MAC轉發表中是用(yòng)多行記錄來(lái)表示,還是在端口那一列用(yòng)多個端口号數字來(lái)表示呢(ne)?下(xià)面介紹一種新的端口表示方法。
廣播是一個多播的特例,是一個要求所有節點都必須加入的特殊組。多播在有些(xiē)時(shí)候也(yě)叫組播,這(zhè)其實是網絡層的叫法,與其相應的網絡層傳播方式還有任播。網絡層的組播有專門(mén)的組播協議(yì)實現(xiàn)方法,網絡層的組播IP地址與MAC層的MAC地址有着一一對(duì)應的關系,具體協議(yì)和(hé)轉換可網上(shàng)搜索學習,轉換算(suàn)法在後面文(wén)章代碼中會(huì)有提到(dào)。
多播既然是表示一組主機的集合,那這(zhè)個集合如何學習而來(lái),轉發的時(shí)候又根據什(shén)麽樣的端口信息進行輸出呢(ne)?
1)多播學習
首先,通過組播協議(yì)學習,我們知(zhī)道(dào),主機發布入組消息,其實并不是爲了(le)通知(zhī)交換機,而是通知(zhī)網關。對(duì)交換機而言,如果想支持更好(hǎo)的組播轉發是需要監聽Internet組管理(lǐ)(IGMP)協議(yì)的,也(yě)就是要處理(lǐ)二層以上(shàng)的内容。如果隻想簡單粗暴的确證組播功能(néng),則可以把所有的組播消息當作(zuò)廣播來(lái)處理(lǐ)即可。隻是這(zhè)種粗暴的方式會(huì)給網絡流量、管理(lǐ)和(hé)用(yòng)戶體驗來(lái)說帶來(lái)諸多蔽端。
通常支持組播管理(lǐ)的交換機可以用(yòng)兩種不同的方式來(lái)實現(xiàn),第一種是帶一個輕量級的處理(lǐ)器,可以支持對(duì)二層以上(shàng)更多協議(yì)進行處理(lǐ),則交換機可以實現(xiàn)更多複雜(zá)的功能(néng)。另外(wài)一種是根據場景要求,讓硬件支持特定的管理(lǐ)協議(yì)。硬件對(duì)組播的支持不需要靈活性,比如隻支持IGMPV3協議(yì),則可以直接根據該協議(yì)内容僅需關心的幾個字段直接提取數據便可完成協議(yì)處理(lǐ),不像軟件那樣做逐層的解析和(hé)判斷。IGMP具體需要用(yòng)到(dào)的字段有Record Type,用(yòng)來(lái)指示是入組還是退組。Multicast Address用(yòng)來(lái)表示IP組播的地址,根據該地址可以映射其對(duì)應的多播MAC地址。
多播通過上(shàng)述簡單的字段提取後可以學習多播MAC的加入或退出,其最終結果是對(duì)應到(dào)一個多播MAC和(hé)其組端口号的映射關系上(shàng),如果某個端口上(shàng)接收到(dào)了(le)IGMP的入組信息,則将該協議(yì)中入組的組播IP轉換後的多播MAC與其輸入端口保存到(dào)MAC轉發表中,說明(míng),一旦有目的MAC地址爲多播MAC的數據收到(dào),則需要轉發到(dào)該端口上(shàng)。相反,如果收到(dào)IGMP的退組信息,則要将該多播MAC與其端口号信息删除。
2)多播轉發
多播MAC與端口信息可以通過上(shàng)面的方法學習到(dào)或删除了(le),那如果在一個交換機上(shàng),一個多播MAC有多個端口都有主機加入,則該多播MAC有多個端口号與其組成轉發表,那我們應該如何來(lái)構建組播MAC的轉發表呢(ne)?
先試想一下(xià),如果将其像單播MAC映射表項一樣,在MAC轉發表中添加多行記錄,一個多播MAC有多少個端口入了(le)組,就添加多少條記錄,是否可行。答(dá)案當然是可以,但(dàn)進一步分析查表過程,如果一個MAC有多條表項可以匹配,則每一次查表都要把全表遍曆,不然肯定無法得到(dào)一個多播MAC所有的端口号信息。這(zhè)對(duì)查表性能(néng)來(lái)說肯定影響巨大(dà),其影響大(dà)小(xiǎo)跟表項大(dà)小(xiǎo)成正比。那我們考慮建立單獨的多播表是否可以呢(ne)?多播地址多了(le)後該表條數也(yě)會(huì)變大(dà),查表性能(néng)也(yě)會(huì)存在問題。
既然從(cóng)表項行的角度無法解決問題,那我們可以從(cóng)列的角度來(lái)考慮,原來(lái)一個MAC地址對(duì)應一個端口,用(yòng)一個列表示,那多個端口可以用(yòng)多個列表示即可。用(yòng)軟件的思路可能(néng)還會(huì)考慮到(dào)用(yòng)鏈表來(lái)表示端口組信息,這(zhè)些(xiē)當然可以,但(dàn)從(cóng)資源和(hé)性能(néng)上(shàng)考慮都還不夠,特别是卸載到(dào)硬件實現(xiàn)。
下(xià)面,我們講一種硬件的常用(yòng)思維,用(yòng)bitmap方式表示端口号。Bitmap顧名思義就是用(yòng)每一個bit位表示一個對(duì)應的端口,從(cóng)低(dī)位開(kāi)始,數字1(bit表示:01)表示0号端口;數字2(bit表示:10)表示1号端口;數字3(bit表示:11)表示0和(hé)1兩個端口。交換機端口一般不超過64個,那用(yòng)64位數據類型即可全部表示所有端口信息。
1)多播學習
多播學習我們在軟件将采用(yòng)協議(yì)逐層解析的方式獲取我們關心的數據。爲了(le)軟件代碼實現(xiàn)簡單,多播學習的表項單獨存儲在一個多播MAC轉發表中,某個端口的主機加入了(le)一個組,我們則在多播MAC轉發表中添加該組的多播地址與對(duì)應端口的bitmap表示值。當有其他(tā)端口加入了(le)相同的組,則在原有端口字段上(shàng)更新其對(duì)應端口的bit位的值即可。
2)端口Bitmap表示
根據端口号的bitmap表示,上(shàng)述多播MAC地址學習後隻需要一條表項表示即可,在查表過程中,再也(yě)不用(yòng)遍曆全表查找。那我們是否可以将多播表和(hé)單播表放(fàng)一塊呢(ne)?軟件是可以的,硬件是不會(huì)的。對(duì)硬件來(lái)說,其資源無比珍貴,每1bit都是錢(qián)。單播的端口号隻能(néng)是一個确定值,對(duì)最大(dà)64個端口來(lái)說,其最多隻用(yòng)6bit即可表示,其他(tā)bit都是多餘,故在硬件交換邏輯中,單播表與多播表是分開(kāi)的,其端口号的表示大(dà)小(xiǎo)也(yě)根據其硬件端口數量來(lái)确定bit位的寬度。單播不采用(yòng)bitmap方式表示,除了(le)存儲資源浪費還有一個主要原因就是邏輯與計(jì)算(suàn)資源的浪費。采用(yòng)bitmap必須逐bit是比較是否爲1,是1則該端口輸出,輸出最壞情況是遍曆所有bit位。單播本來(lái)就是一個确定端口輸出,使用(yòng)bitmap的方式隻是造成處理(lǐ)邏輯的複雜(zá)化與計(jì)算(suàn)時(shí)間的空(kōng)耗,故單播輸出端口使用(yòng)常規方式表示。
下(xià)一篇文(wén)章具體講一下(xià)多播表定義、實現(xiàn)與相關代碼修改。
歡迎您和(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ǐ)。