多IP地址库源的集成
摘要
IP地址库作为一种基础的网络服务,已经有了很多的商业版本和免费版本。不同的IP地址库在粒度、准确度、覆盖度等方面各有千秋,但由于IP地址库的提供方不同、IP地址自身的动态性、具体业务需求的不同,导致很难断定某一个IP地址库是最佳的。如果有最佳的IP库存在,那就不会存在如此之多的IP地址库版本。IP地址库作为淘宝的一项基础设施,我们希望能将现有的一些IP地址库的内容整合起来,各取所长,形成我们自己的IP地址库。
IP地址库的工作主要包括生成、校验、升级三方面的工作。本文主要讲述如何从多个不同的IP地址库生成综合IP地址库。
不同的IP地址库如何集成
不同的IP地址库在包含的IP段、IP段对应的地域、ISP、经纬度等信息、记录格式等方面差别比较大,我们该如何来集成它们呢?
既然需要集成,首先当然需要找出各IP地址库之间哪些是相同的,哪些是不同的?但如何比较出各IP地址库的不同呢?比较出不同后我们又该怎么做呢?下面介绍一下我们的做法。我们的做法也只是一家之言,欢迎大家批评指正。
IP地址库的层次结构与生成整体流程
我们简化问题的处理,我们为IP地址库设计了分层的结构,如下图所示:
明了了IP地址库的层次结构后,我们很容易想到利用下面的流程来实现IP地址库的综合:
Step 1) 获取各独立的第三方IP地址来源,生成第三方原始IP地址库
Step 2) 对第三方原始IP地址库进行规范化、校验、约束检查等操作,生成规范化的第三方IP地址库
Step 3) 将多个规范化第三方IP地址库对比,并记录对比后的结果
Step 4) 根据比对结果,结合各IP地址库(及各属性段)的置信度,生成最终的iP地址库
Step 5) 利用接口工具,动态或静态生成需要的接口数据
多个源IP地址库如何对比
这里有两个关键点:
(1)多个源IP地址库是可以对比的,这点就是通过上一节对第三方源IP地址库进行规范化来实现的。规范化后,不同源IP库的记录的属性都统一了,有了比较的基础
(2)如何做到对比的次数与源IP地址库的个数无关?
当我们有两个源IP库时,我们可以比较容易对比,但当源IP库是三个或者多个的时候,两两比较显然是行不通的了。
我们换一种思路,IP地址的数量级是2^32,划分成IP段则数目比这小得多,目前应该是10万到100万级别的,我们将对比的主体换成IP段,看每个IP段到底有多少种不同的记录信息,这样就避免了比对过程中出现的两两对比的问题。
具体说来,对于所有的源IP地址记录,我们找出所有的IP段的端点,利用这些端点对IP地址区间进行最小粒度的切割,对切割后的每个端点和端点之间的IP区间进行对比。下面的示意图说明了切割的方法:
至此,我们已经得到多个源IP地址库对比结果了,接下来是如何处理这些diff结果了
对比结果的综合
有了对比后的diff,我们自然需要对diff的结果进行验证,确认diff中哪些项更可信一些,这里就有很多种方法了
(1)通过traceroute查看目标IP附近几跳的IP属于哪个区域。这种方法有两个难点:a 实践中traceroute结果会有大量的***,很多30跳以内得不到结果,所以很多情况下很难找到最近的几跳IP b 最近几跳的IP我们又如何断定其区域呢?这又陷入了鸡生蛋、蛋生鸡的问题了
(2)通过目标IP所在c段或者更大的段来判断其区域,这一点同样会碰到上面的所在c段所属区域的判定问题
(3)IP地址所属区域问题是GeoLocation问题的一种,有很多的讨论和方法,目前这一块没有深入调查
(4)根据各源IP地址库自身的置信度计算diff结果的置信度,选取置信度最高的作为最终结果。这里又涉及到各源IP地址库的置信度设置问题,一种是人工根据经验设定;另外一种是通过可信的校验手段来计算得出。我们目前采用的是人工设定的方法,后期考虑通过检验得出源IP地址库及各属性段的置信度。