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

關(guān)注FAST開源社區(qū)
FAST一一開源、開放、高速、高效、可編程、可定義!軟硬件協(xié)同并行處理。