最佳检查IP是否在子网

时间:2016-07-07 16:44:50

标签: node.js algorithm

我想检查IP地址是否属于子网。当我必须检查具有从/ 3到/ 31,几百万次/秒的子网的300.000个CIDR块时,痛苦就来了。

https://github.com/indutny/node-ip为例:

对于300.000块中的每一块,我都可以ip.cidrSubnet('ip/subnet')并检查我要查找的IP是否在倒数第一个地址范围内,但这非常昂贵。

如何最佳地检查IP地址是否属于这些块之一,而不是每次都通过所有块进行循环?

1 个答案:

答案 0 :(得分:1)

将信息存储在针对范围检查进行了优化的二叉树中。

一种简单的方法是将每个CIDR块转换为一对事件,一个是进入块时,一个是退出块时。然后按IP地址对事件列表进行排序。运行它并创建一个排序的IP地址数组以及您所在的块数。对于300,000个CIDR块,将有600,000个事件,您的搜索将是19-20个查找。

现在,您可以对该文件进行二进制搜索,以查找当前IP地址之前的最后一次转换,并返回true / false,具体取决于是在一个还是多个块中而不是在无块中。

如果不是搜索文件,而是搜索某种专用索引,查找速度会更快。 (搜索中的查找次数相同或稍高,但您可以更好地利用CPU缓存。)我个人已经将BerkeleyDB的BTree数据结构用于其他语言的这种事情,并且非常高兴。