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

關注FAST開源社區
FAST一(yī)一(yī)開源、開放、高(gāo)速、高(gāo)效、可(kě)編程、可(kě)定義!軟硬件協同并行(xíng)處理(lǐ)。