基于ip2region的ipv4&ipv6索引库生成方案

本文介绍了如何在ip2region基础上实现ipv6支持,详细解析了ip2region.db的结构,包括SUPER BLOCK、HEADER INDEX、DATA和INDEX。通过binary和b-tree搜索方法,实现了ipv4和ipv6的快速查询。还提出了针对ipv6的转换和比较策略,并对生成库文件和使用进行了说明。
摘要由CSDN通过智能技术生成

背景

接触过ip库查询的人,可能都听说过ip2region这个开源的方案,其通过查询一些外部数据源形成自己的ip段信息,再通过生成索引库,从而提供ip信息的查账,可惜的是作者一直未提供Ipv6的查询方案,在ipv6越加重要的现在,着实有些可惜。所以今天来说下在Ip2region的基础上实现支持ipv6的实现方案。

ip2region的原理

ip2region分三个部分:

  • 源数据转变成ip2region db 文件的过程
  • ip2region 的结构
  • 搜索方法

此处跳过db文件生成的过程,只讲讲结构和搜索方案

ip2region.db 结构

生成的ip2region.db文件包含以下四个部分:

1, SUPER BLOCK
2, HEADER INDEX
3, DATA
4, INDEX

ip2region结构

生成 ip2region.db 的时候,首先会在首部预留 8 bytes 的SUPER BLOCK 和 8k 的 HEADER INDEX。

再根据ip.merge.txt,依据每一条记录的起始ip, 结束ip和数据,生成一个index block, 前四个字节存储起始ip, 中间四个字节存储结束ip, 后四个字节存储已经计算出的数据地址,并暂存到INDEX区。

当 INDEX 索引区和 DATA 数据区确定下来之后,再把 INDEX 的起始位置存储到 SUPER BLOCK 的前四个字节,结束位置存储到 SUPER BLOCK 的后四个字节。

再把 INDEX 分成大小为 4K 的索引分区,把每个分区起始位置的索引的起始ip和该索引的位置存入一个 header index block, 组成 HEADER INDEX 区域, 最后写入ip2region.db。

具体功能:

  • INDEX

索引区域,索引元素为 index block (12 字节), 分成三个部分,起始ip, 结束ip, 数据信息, 每一条 index block 对应 ip.merge.txt 中的一条记录。

数据信息: 前三个字节保存数据地址(DATA中),后一个字节保存数据长度。

每个index block 表示一个ip段的索引。当指定ip 在某个 index block 的起始ip和结束ip中间,即表示命中索引。

再通过 index block 中的数据地址和数据长度,就能从ip2region.db读取对应的地址。

  • SUPER BLOCK

用来保存 INDEX 的起始地址和结束地址,first index ptr 指向INDEX起始位置的index block, last index ptr 指向最后一个index block的地址。这样查询的时候直接读取superblock 8个字节,就能快速获取 INDEX 索引区域的地址。

  • HEADER INDEX

HEADER INDEX 区是对 INDEX 区的二级索引, INDEX总长度除以 4K 就是 HEADER INDEX 的实际索引数。

该区域长度为8k, 由 8 bytes 的 header index block 组成。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值