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

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

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

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

     修改MAC學(xué)习与查找功能(néng),将原来的查找空MAC表项改為(wèi)查找可(kě)老化表项,如果表项是空,则其时间字段為(wèi)零,也会是需要被老化的表项。

/*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;/*记录第一个可(kě)老化表项位置*/
      /*记录第一个找到為(wèi)空白表项位置*/
}

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

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