本发明属于网络通信领域,尤其涉及一种非定时器实现的nud状态机的方法。
背景技术:
1、nud即为neighbor unreachable detection,邻居不可达检测,用来检测邻居可达性,ipv4的arp和ipv6的nd协议的实现中都用到了nud状态机(见附图1),nud状态机一般都是由定时器实现的状态切换,每个邻居项都有一个定时器,因此如果邻居项比较多时,需要创建大量的定时器,而且业务线程每次循环时都要对定时器进行维护处理,因此处理器需要预留一部分性能用于定时器处理,影响了业务本身的性能。
技术实现思路
1、鉴于以上现有技术的不足,发明的目的在于提供一种非定时器实现的nud状态机的方法,针对定时器的一些弊端,用一种不使用定时器的方法来实现nud状态机,以规避使用定时器的性能弊端,把性能尽可能多的留给业务本身。
2、本发明的第一方面,提出了一种非定时器实现的nud状态机的方法,包括如下步骤:
3、s1,针对每个nud状态创建一个lru链表;
4、s2,开始业务线程循环,判断是否收到报文;
5、s3,创建邻居项或者邻居项在进入新的状态时,把该邻居项从原先的lru链表摘链并加入到对应状态lru链表的尾部,记录下当前的时间戳t。
6、进一步地,所述s1中在程序初始化阶段创建并初始化lru链表,每个lru链表管理对应状态下的邻居节点。
7、进一步地,所述s2中当收到报文时,执行步骤s3来切换报文对应的邻居项状态并操作lru链表;
8、当没有接收到报文时,所述业务线程循环遍历每个lru链表,判断邻居项是否超时。
9、进一步地,当所述邻居项超时时,执行步骤s3;当所述邻居项未超时时,返回步骤s2。
10、进一步地,所述邻居项超时或者报文触发等需要切换到新的状态时,把该邻居项加入到对应的lru链表尾部。
11、进一步地,所述s3中的时间戳t作为当前状态的计时基准,用于计算状态的超时时长。
12、进一步地,所述邻居项在第一次创建时进入nud_none状态,获取此时的时间戳t1并保存在邻居项节点里,当下次处理该节点时,用当前的时间戳t和进入nud_none状态时的时间戳t1之差来计算nud_none状态的超时时长,并返回步骤s2。
13、进一步地,所述lru链表的遍历放在业务线程空闲时立即或间隔几轮进行。
14、进一步地,所述业务线程繁忙时只负责处理接收报文对应邻居项的nud状态,即报文触发式管理nud状态。
15、进一步地,所述业务线程的繁忙程度通过统计有报文的轮询次数和总的轮询次数的比例来判断。
16、本发明有益效果如下:
17、1.无需维护大量的定时器,节省定时器开销;
18、2.每个nud状态对应一个lru链表,由于相同状态的邻居项超时时长一样,遍历lru链表时遇到未超时的邻居项,该lru链表后面的邻居项就不用再遍历了,这样就提高了遍历效率;
19、3.可以通过配置在定时准确性和性能之间平衡;
20、4.lru链表实现了定时器功能,可以通过配置业务线程每轮遍历lru达到和定时器同样精准的效果。
1.一种非定时器实现的nud状态机的方法,其特征在于,包括如下步骤:
2.根据权利要求1所述的一种非定时器实现的nud状态机的方法,其特征在于,所述s1中在程序初始化阶段创建并初始化lru链表,每个lru链表管理对应状态下的邻居节点。
3.根据权利要求1所述的一种非定时器实现的nud状态机的方法,其特征在于,所述s2中当收到报文时,执行步骤s3来切换报文对应的邻居项状态并操作lru链表;
4.根据权利要求3所述的一种非定时器实现的nud状态机的方法,其特征在于,当所述邻居项超时时,执行步骤s3;
5.根据权利要求4所述的一种非定时器实现的nud状态机的方法,其特征在于,所述邻居项超时或者报文触发需要切换到新的状态时,把该邻居项加入到对应的lru链表尾部。
6.根据权利要求1所述的一种非定时器实现的nud状态机的方法,其特征在于,所述s3中的时间戳t作为当前状态的计时基准,用于计算状态的超时时长。
7.根据权利要求6所述的一种非定时器实现的nud状态机的方法,其特征在于,所述邻居项在第一次创建时进入nud_none状态,获取此时的时间戳t1并保存在邻居项节点里,当下次处理该节点时,用当前的时间戳t和进入nud_none状态时的时间戳t1之差来计算nud_none状态的超时时长,并返回步骤s2。
8.根据权利要求3所述的一种非定时器实现的nud状态机的方法,其特征在于,所述lru链表的遍历放在业务线程空闲时立即或间隔几轮进行。
9.根据权利要求8所述的一种非定时器实现的nud状态机的方法,其特征在于,所述业务线程繁忙时只负责处理接收报文对应邻居项的nud状态,即报文触发式管理nud状态。
10.根据权利要求9所述的一种非定时器实现的nud状态机的方法,其特征在于,所述业务线程的繁忙程度通过统计有报文的轮询次数和总的轮询次数的比例来判断。