0731-84728105
15116127200
二层交换机原型设计与实现(八)
发布时间:2021-06-21
     在二层交换机环境下,当通信双方持续交互数据时,会不断命中双方主机的MAC转发表项,使其处于一个热状态。当某一主机长时间不与外界联系时,该主机的MAC转发表项就会长时间不被使用,其为冷状态。MAC地址老化意思就是MAC转发表项长时间不用到,触发老化机制将其从表项中清除。表项到底要到多冷的状态,具体是多长时间不用到才被老化,这个时间叫做老化时间。
     MAC地址为什么要老化?要做老化的主要原因是MAC转发表项不够用,换更大容量则比较费钱。产品在有限的资源下总是想干点更大的事情。出发点是好的,现实也是允许的。交换机允许做老化是跟他的应用场景、网络通信模型相关的。流量交互越密集、节点分布越离散对MAC转发表的容量要求越大,反之容量可以较小。老化就是在容量和时间的两个维度上做出的一种优化策略,核心是一种对成本的优化考虑。将理论的容量大小缩减,调整老化的时间长短,使其达到一个均衡稳定状态。这一状态是指网络的通信服务质量是可被接受的。一味的调小转发表容量和缩短老化时间,会让网络通信产生不可容忍的服务质量。故在不同的应用场景下,交换机的MAC转发表容量不同、老化时间也不尽相等。
     MAC地址老化是以时间为参考进行处理的,故在MAC转发表字段中需要新设置时间戳字段,用以记录MAC转发表项的最新使用时间。MAC转发表项的定义修改如下:

struct row_port_mac
{
      u8 port;
      u8 pad;/*内存对齐*/
      u8 mac[MAC_LEN];
      struct timeval tv;/*记录MAC最新更新时间*/
}

     1)老化方法
     每次MAC查表命中都要进行MAC表项的时间更新,MAC转发表的老化要根据表项的更新时间来判断,与当前检查时间相比较,如果超过了预先设定的阀值则将该表项老化。老化在交换机中的具体实现是怎样的?以下讲述两种方法。一种是传统较好理解的老化线程方法;另一种是本平台实现场景下的最大化资源优化方法——X方法。
     老化线程的方法是指,通过启动额外的专门线程,负责扫描整个MAC转发表,逐项比较表项时间是否达到老化要求,从而做出正确的老化行为。该方法的实现方法即是线程循环、遍历表项、比较时间、清除表项、休眠、进入下次循环。该方法实现简单,也比较适合硬件实现。
     X方法是指不采用额外线程轮询遍历的方式实现老化,那不遍历,不判断如何才能老化呢?这就是前面定语描述的,在本平台实现场景下的实现基础上完成老化功能。我们可以回顾一下,前面的二层交换功能中的MAC地址学习过程。将新MAC地址学习与查找匹配优化到了一起实现,这一实现过程中其实就存在遍历与判断的逻辑,那我们只要将此功能稍加调整,便可实现老化功能。核心实现方法如下:
       a. 在MAC学习查找过程中,匹配到表项则更新时间;
       b. 未匹配时,负责查找一个未使用空间时的判断改为寻找一个使用时间超过阀值的判断。
     1)老化代码实现
     老化判断函数,老化时间用户可自己定义大小。

#define AGING_TIME 30 /*老化超时时间长度,单位秒*/
int aging_match(int idx,struct timeval *now)
{
       return obx_mac_tbl->row[idx].tv.tv_sec + AGING_TIME < now->tv_sec;
}

     修改MAC学习与查找功能,将原来的查找空MAC表项改为查找可老化表项,如果表项是空,则其时间字段为零,也会是需要被老化的表项。

/*else if(j == -1 && !ether_addr_equal((u8 *)&zero_mac,obx_mac_tbl->row[i].mac))*/
else if(j == -1 && aging_match(i,&now))
{
      j = i;/*记录第一个可老化表项位置*/
      /*记录第一个找到为空白表项位置*/
}

     上述老化有何优势?不需要额外的线程资源,不需要更多的轮询遍历所有MAC表项。通过转发过程中触发式的完成老化功能。有数据交换了,进入到该MAC学习流程,若匹配上了,则更新时间返回;若没有匹配上MAC地址,则最坏情况是全表遍历并找到一个老化表项。
     我们并不是要突出该方法的好处,真实的硬件也不会这么实现。但在一个抽象的环境中,方案应该具备普适性,而在面向一个具体的场景时,方法可具特异性,这样就可以使解决方案更符合场景需求,达到最优解状态。
     1)端口断开对老化影响
     MAC表老化除了表项不够用外还有一种情况就是端口发生变化,如从UP状态变成DOWN状态,发生的原因有多种。但最坏的情况是原来连接到端口的网络可能会发生变化,如用户将网络连接端口进行了更换。由此带来的问题的,基于原来的端口转发表项全部会失效或带来错误,会严重影响网络的通信。虽然切换端口会影响网络,但如果不做端口老化,则会延长影响时间。故在交换机的端口发生DOWN的事件后,必须将该端口转发输出的所有MAC表项内容清除,全部老化掉。
     2)MAC转发表硬件卸载
     二层交换机的基本设计基本上只讲到这为止,但这毕竟只是一个软件的二层交换,其性能无法达到我们真实场景测试验证的要求。FAST架构是一个平台无关的软硬件协同处理架构,在FAST架构下,我们可以非常容易的将MAC转发表卸载到硬件实现。由软件实现MAC地址的学习,然后将其配置到硬件流表,后续该MAC地址的分组便可直接在硬件完成交换功能,从而可以达到线速转发能力。下一篇文件我们将讲述如何在FAST架构下将二层交换的MAC转发表卸载到硬件。
      欢迎您和学生们加入FAST开源项目群沟通与探讨,一起体验不一样的系统设计过程。请先加微信号15116127200后邀请入群。

关注FAST开源社区
FAST一一开源、开放、高速、高效、可编程、可定义!软硬件协同并行处理。