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

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