IP 数据库在互联网时代起着举足轻重的作用,例如电商网站的风控系统、通讯软件的登录系统,通常都会将用户的登录 IP 作为一个重要指标进行甄别,因此 IP 数据库的精确性就显得格外重要。
目前网络上提供离线数据库下载的有 qqwry 纯真、IPIP.net、MaxMind 三家。其中 IPIP.net 宣称是基于各电信运营商以及网络服务的 BGP/ASN 数据而分析处理而得来,目前也有众多的知名企业在使用。
2018 年 6 月,IPIP.net 宣布进军 IPv6。在 2019 年 1 月左右,老高在官方放出了全新的 ipdb 格式,能够同时兼容 IPv4/IPv6 地址的查询,另外也大幅提升查询速度。本文就重点来分析一下 ipdb 的文件格式。
基本结构
ipdb 文件在结构上分为三层:文件头、节点区、记录区。
文件头
ipdb 的文件头就是一个简单的 JSON,前 4 个字节表示了 JSON 字符串的长度。
JSON 中提供了数据库的构建时间、节点的数量、多语言的偏移量、支持的字段等等。
节点区
ipdb 的索引方式采用字典树 (trie) 的方式,首先将 IP 地址转换为二进制形式,然后从根节点开始,遇到二进制位为 0 的时候跳到左子树上,遇到 1 则跳到右子树上。
节点区由若干组节点组成,每组节点长度为 8-byte,其中前 4-byte 表示该节点的左儿子序号,后 4-byte 则是右儿子的节点序号。
举个栗子,我们先把 3.0.0.0
转换成二进制。假设 IPv4 根节点序号为 96,那么根据第 1 个二进制位 0,下一跳应该跳转到 96 节点的左儿子 97 上。以此类推,当跳到序号大于节点总数的时候 (还记得文件头中的信息吗),就意味着找到最终的数据了。
文章评论