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