二层交换机原型设计与实现(六)

一、概述

上一篇文章已经了解到如何学习MAC和根据MAC查表得到输出结果。输出结果有两种可能,一种是确定的输出端口号,指示分组从确定的端口号输出;另一种是查不到匹配表项,需要广播(泛洪)输出。交换机除了正常端口号输出和广播输出外,还有一种方式就是多播输出。要求同一个分组从指定的多个端口分别输出。

二、分组输出

分组输出是单播还是多播是根据其MAC地址的标识来区分的。

1)单播

单播的分组如何识别,有什么特征区分呢?从MAC地址的设计上做了严格的区分。MAC地址一共6个字节,其第1个字节的最低位bit值如果为0,则表示其是一个单播MAC地址。单播地址是分配给每一个单独网卡使用的物理标识地址,所以一个单播地址是肯定对应到一台单独的主机。单独的主机肯定是连接在交换机的一个特定的端口上面,故单播地址分组转发,也就是一个单独确定的端口号,其端口标记用一个数字表示即可。

2)多播

与单播相对,其标识定义也就是MAC地址的第1个字节的最低位bit是1,则表示一个多播地址。特别的,如果MAC地址的所有bit位都是1,则表示一个广播地址。多播与单播的差异除了MAC地址的标识不同外,另外最大的区别就是,一个多播地址代表的是一组主机,可以是包含1台或是多台主机。那多播地址的分组转发,如何确定给哪些主机发送,从哪些端口转发呢?在MAC转发表中是用多行记录来表示,还是在端口那一列用多个端口号数字来表示呢?下面介绍一种新的端口表示方法。

三、多播学习与转发

广播是一个多播的特例,是一个要求所有节点都必须加入的特殊组。多播在有些时候也叫组播,这其实是网络层的叫法,与其相应的网络层传播方式还有任播。网络层的组播有专门的组播协议实现方法,网络层的组播IP地址与MAC层的MAC地址有着一一对应的关系,具体协议和转换可网上搜索学习,转换算法在后面文章代码中会有提到。

多播既然是表示一组主机的集合,那这个集合如何学习而来,转发的时候又根据什么样的端口信息进行输出呢?

1)多播学习

首先,通过组播协议学习,我们知道,主机发布入组消息,其实并不是为了通知交换机,而是通知网关。对交换机而言,如果想支持更好的组播转发是需要监听Internet组管理(IGMP)协议的,也就是要处理二层以上的内容。如果只想简单粗暴的确证组播功能,则可以把所有的组播消息当作广播来处理即可。只是这种粗暴的方式会给网络流量、管理和用户体验来说带来诸多蔽端。

通常支持组播管理的交换机可以用两种不同的方式来实现,第一种是带一个轻量级的处理器,可以支持对二层以上更多协议进行处理,则交换机可以实现更多复杂的功能。另外一种是根据场景要求,让硬件支持特定的管理协议。硬件对组播的支持不需要灵活性,比如只支持IGMPV3协议,则可以直接根据该协议内容仅需关心的几个字段直接提取数据便可完成协议处理,不像软件那样做逐层的解析和判断。IGMP具体需要用到的字段有Record Type,用来指示是入组还是退组。Multicast Address用来表示IP组播的地址,根据该地址可以映射其对应的多播MAC地址。

多播通过上述简单的字段提取后可以学习多播MAC的加入或退出,其最终结果是对应到一个多播MAC和其组端口号的映射关系上,如果某个端口上接收到了IGMP的入组信息,则将该协议中入组的组播IP转换后的多播MAC与其输入端口保存到MAC转发表中,说明,一旦有目的MAC地址为多播MAC的数据收到,则需要转发到该端口上。相反,如果收到IGMP的退组信息,则要将该多播MAC与其端口号信息删除。

2)多播转发

多播MAC与端口信息可以通过上面的方法学习到或删除了,那如果在一个交换机上,一个多播MAC有多个端口都有主机加入,则该多播MAC有多个端口号与其组成转发表,那我们应该如何来构建组播MAC的转发表呢?

先试想一下,如果将其像单播MAC映射表项一样,在MAC转发表中添加多行记录,一个多播MAC有多少个端口入了组,就添加多少条记录,是否可行。答案当然是可以,但进一步分析查表过程,如果一个MAC有多条表项可以匹配,则每一次查表都要把全表遍历,不然肯定无法得到一个多播MAC所有的端口号信息。这对查表性能来说肯定影响巨大,其影响大小跟表项大小成正比。那我们考虑建立单独的多播表是否可以呢?多播地址多了后该表条数也会变大,查表性能也会存在问题。

既然从表项行的角度无法解决问题,那我们可以从列的角度来考虑,原来一个MAC地址对应一个端口,用一个列表示,那多个端口可以用多个列表示即可。用软件的思路可能还会考虑到用链表来表示端口组信息,这些当然可以,但从资源和性能上考虑都还不够,特别是卸载到硬件实现。

下面,我们讲一种硬件的常用思维,用bitmap方式表示端口号。Bitmap顾名思义就是用每一个bit位表示一个对应的端口,从低位开始,数字1(bit表示:01)表示0号端口;数字2(bit表示:10)表示1号端口;数字3(bit表示:11)表示0和1两个端口。交换机端口一般不超过64个,那用64位数据类型即可全部表示所有端口信息。

四、总结与下一步

1)多播学习

多播学习我们在软件将采用协议逐层解析的方式获取我们关心的数据。为了软件代码实现简单,多播学习的表项单独存储在一个多播MAC转发表中,某个端口的主机加入了一个组,我们则在多播MAC转发表中添加该组的多播地址与对应端口的bitmap表示值。当有其他端口加入了相同的组,则在原有端口字段上更新其对应端口的bit位的值即可。

2)端口Bitmap表示

根据端口号的bitmap表示,上述多播MAC地址学习后只需要一条表项表示即可,在查表过程中,再也不用遍历全表查找。那我们是否可以将多播表和单播表放一块呢?软件是可以的,硬件是不会的。对硬件来说,其资源无比珍贵,每1bit都是钱。单播的端口号只能是一个确定值,对最大64个端口来说,其最多只用6bit即可表示,其他bit都是多余,故在硬件交换逻辑中,单播表与多播表是分开的,其端口号的表示大小也根据其硬件端口数量来确定bit位的宽度。单播不采用bitmap方式表示,除了存储资源浪费还有一个主要原因就是逻辑与计算资源的浪费。采用bitmap必须逐bit是比较是否为1,是1则该端口输出,输出最坏情况是遍历所有bit位。单播本来就是一个确定端口输出,使用bitmap的方式只是造成处理逻辑的复杂化与计算时间的空耗,故单播输出端口使用常规方式表示。

下一篇文章具体讲一下多播表定义、实现与相关代码修改。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值