上一篇文(wén)章已经了解到如何學(xué)习MAC和根据MAC查表得到输出结果。输出结果有(yǒu)两种可(kě)能(néng),一种是确定的输出端口号,指示分(fēn)组从确定的端口号输出;另一种是查不到匹配表项,需要广播(泛洪)输出。交换机除了正常端口号输出和广播输出外,还有(yǒu)一种方式就是多(duō)播输出。要求同一个分(fēn)组从指定的多(duō)个端口分(fēn)别输出。
分(fēn)组输出是单播还是多(duō)播是根据其MAC地址的标识来區(qū)分(fēn)的。
1)单播
单播的分(fēn)组如何识别,有(yǒu)什么特征區(qū)分(fēn)呢(ne)?从MAC地址的设计上做了严格的區(qū)分(fēn)。MAC地址一共6个字节,其第1个字节的最低位bit值如果為(wèi)0,则表示其是一个单播MAC地址。单播地址是分(fēn)配给每一个单独网卡使用(yòng)的物(wù)理(lǐ)标识地址,所以一个单播地址是肯定对应到一台单独的主机。单独的主机肯定是连接在交换机的一个特定的端口上面,故单播地址分(fēn)组转发,也就是一个单独确定的端口号,其端口标记用(yòng)一个数字表示即可(kě)。
2)多(duō)播
与单播相对,其标识定义也就是MAC地址的第1个字节的最低位bit是1,则表示一个多(duō)播地址。特别的,如果MAC地址的所有(yǒu)bit位都是1,则表示一个广播地址。多(duō)播与单播的差异除了MAC地址的标识不同外,另外最大的區(qū)别就是,一个多(duō)播地址代表的是一组主机,可(kě)以是包含1台或是多(duō)台主机。那多(duō)播地址的分(fēn)组转发,如何确定给哪些主机发送,从哪些端口转发呢(ne)?在MAC转发表中是用(yòng)多(duō)行记录来表示,还是在端口那一列用(yòng)多(duō)个端口号数字来表示呢(ne)?下面介绍一种新(xīn)的端口表示方法。
广播是一个多(duō)播的特例,是一个要求所有(yǒu)节点都必须加入的特殊组。多(duō)播在有(yǒu)些时候也叫组播,这其实是网络层的叫法,与其相应的网络层传播方式还有(yǒu)任播。网络层的组播有(yǒu)专门的组播协议实现方法,网络层的组播IP地址与MAC层的MAC地址有(yǒu)着一一对应的关系,具體(tǐ)协议和转换可(kě)网上搜索學(xué)习,转换算法在后面文(wén)章代码中会有(yǒu)提到。
多(duō)播既然是表示一组主机的集合,那这个集合如何學(xué)习而来,转发的时候又(yòu)根据什么样的端口信息进行输出呢(ne)?
1)多(duō)播學(xué)习
首先,通过组播协议學(xué)习,我们知道,主机发布入组消息,其实并不是為(wèi)了通知交换机,而是通知网关。对交换机而言,如果想支持更好的组播转发是需要监听Internet组管理(lǐ)(IGMP)协议的,也就是要处理(lǐ)二层以上的内容。如果只想简单粗暴的确证组播功能(néng),则可(kě)以把所有(yǒu)的组播消息当作广播来处理(lǐ)即可(kě)。只是这种粗暴的方式会给网络流量、管理(lǐ)和用(yòng)户體(tǐ)验来说带来诸多(duō)蔽端。
通常支持组播管理(lǐ)的交换机可(kě)以用(yòng)两种不同的方式来实现,第一种是带一个轻量级的处理(lǐ)器,可(kě)以支持对二层以上更多(duō)协议进行处理(lǐ),则交换机可(kě)以实现更多(duō)复杂的功能(néng)。另外一种是根据场景要求,让硬件支持特定的管理(lǐ)协议。硬件对组播的支持不需要灵活性,比如只支持IGMPV3协议,则可(kě)以直接根据该协议内容仅需关心的几个字段直接提取数据便可(kě)完成协议处理(lǐ),不像软件那样做逐层的解析和判断。IGMP具體(tǐ)需要用(yòng)到的字段有(yǒu)Record Type,用(yòng)来指示是入组还是退组。Multicast Address用(yòng)来表示IP组播的地址,根据该地址可(kě)以映射其对应的多(duō)播MAC地址。
多(duō)播通过上述简单的字段提取后可(kě)以學(xué)习多(duō)播MAC的加入或退出,其最终结果是对应到一个多(duō)播MAC和其组端口号的映射关系上,如果某个端口上接收到了IGMP的入组信息,则将该协议中入组的组播IP转换后的多(duō)播MAC与其输入端口保存到MAC转发表中,说明,一旦有(yǒu)目的MAC地址為(wèi)多(duō)播MAC的数据收到,则需要转发到该端口上。相反,如果收到IGMP的退组信息,则要将该多(duō)播MAC与其端口号信息删除。
2)多(duō)播转发
多(duō)播MAC与端口信息可(kě)以通过上面的方法學(xué)习到或删除了,那如果在一个交换机上,一个多(duō)播MAC有(yǒu)多(duō)个端口都有(yǒu)主机加入,则该多(duō)播MAC有(yǒu)多(duō)个端口号与其组成转发表,那我们应该如何来构建组播MAC的转发表呢(ne)?
先试想一下,如果将其像单播MAC映射表项一样,在MAC转发表中添加多(duō)行记录,一个多(duō)播MAC有(yǒu)多(duō)少个端口入了组,就添加多(duō)少条记录,是否可(kě)行。答(dá)案当然是可(kě)以,但进一步分(fēn)析查表过程,如果一个MAC有(yǒu)多(duō)条表项可(kě)以匹配,则每一次查表都要把全表遍历,不然肯定无法得到一个多(duō)播MAC所有(yǒu)的端口号信息。这对查表性能(néng)来说肯定影响巨大,其影响大小(xiǎo)跟表项大小(xiǎo)成正比。那我们考虑建立单独的多(duō)播表是否可(kě)以呢(ne)?多(duō)播地址多(duō)了后该表条数也会变大,查表性能(néng)也会存在问题。
既然从表项行的角度无法解决问题,那我们可(kě)以从列的角度来考虑,原来一个MAC地址对应一个端口,用(yòng)一个列表示,那多(duō)个端口可(kě)以用(yòng)多(duō)个列表示即可(kě)。用(yòng)软件的思路可(kě)能(néng)还会考虑到用(yòng)链表来表示端口组信息,这些当然可(kě)以,但从资源和性能(néng)上考虑都还不够,特别是卸载到硬件实现。
下面,我们讲一种硬件的常用(yòng)思维,用(yòng)bitmap方式表示端口号。Bitmap顾名思义就是用(yòng)每一个bit位表示一个对应的端口,从低位开始,数字1(bit表示:01)表示0号端口;数字2(bit表示:10)表示1号端口;数字3(bit表示:11)表示0和1两个端口。交换机端口一般不超过64个,那用(yòng)64位数据类型即可(kě)全部表示所有(yǒu)端口信息。
1)多(duō)播學(xué)习
多(duō)播學(xué)习我们在软件将采用(yòng)协议逐层解析的方式获取我们关心的数据。為(wèi)了软件代码实现简单,多(duō)播學(xué)习的表项单独存储在一个多(duō)播MAC转发表中,某个端口的主机加入了一个组,我们则在多(duō)播MAC转发表中添加该组的多(duō)播地址与对应端口的bitmap表示值。当有(yǒu)其他(tā)端口加入了相同的组,则在原有(yǒu)端口字段上更新(xīn)其对应端口的bit位的值即可(kě)。
2)端口Bitmap表示
根据端口号的bitmap表示,上述多(duō)播MAC地址學(xué)习后只需要一条表项表示即可(kě),在查表过程中,再也不用(yòng)遍历全表查找。那我们是否可(kě)以将多(duō)播表和单播表放一块呢(ne)?软件是可(kě)以的,硬件是不会的。对硬件来说,其资源无比珍贵,每1bit都是钱。单播的端口号只能(néng)是一个确定值,对最大64个端口来说,其最多(duō)只用(yòng)6bit即可(kě)表示,其他(tā)bit都是多(duō)余,故在硬件交换逻辑中,单播表与多(duō)播表是分(fēn)开的,其端口号的表示大小(xiǎo)也根据其硬件端口数量来确定bit位的宽度。单播不采用(yòng)bitmap方式表示,除了存储资源浪费还有(yǒu)一个主要原因就是逻辑与计算资源的浪费。采用(yòng)bitmap必须逐bit是比较是否為(wèi)1,是1则该端口输出,输出最坏情况是遍历所有(yǒu)bit位。单播本来就是一个确定端口输出,使用(yòng)bitmap的方式只是造成处理(lǐ)逻辑的复杂化与计算时间的空耗,故单播输出端口使用(yòng)常规方式表示。
下一篇文(wén)章具體(tǐ)讲一下多(duō)播表定义、实现与相关代码修改。
欢迎您和學(xué)生们加入FAST开源项目群沟通与探讨,一起體(tǐ)验不一样的系统设计过程。请先加微信号15116127200后邀请入群。

关注FAST开源社區(qū)
FAST一一开源、开放、高速、高效、可(kě)编程、可(kě)定义!软硬件协同并行处理(lǐ)。