IP 归属地查询是怎么实现的?聊聊 GeoIP 数据库
为什么查一个 IP 能定位到城市?GeoIP 数据库的来源、精度、更新机制,以及为什么你的定位有时差一个省。
在 IPchase 查询一个 IP,几毫秒就返回"中国 福建 宁德 联通"。很多朋友好奇:这数据哪来的?准不准?为什么有时会偏到隔壁省?
核心逻辑:一张"IP 段地图"
IP 地址不是一台台设备登记的,而是按段分配的。IANA(互联网号码分配机构)把地址块分给各大区域注册机构(APNIC 负责亚太),注册机构再分给运营商和企业。
每次分配记录都包含:"这段 IP 分给了谁、登记在哪个城市"。把这些分配数据 + 路由广播数据 + 实测数据汇总起来,就形成了 GeoIP 数据库。
数据库的本质是一个前缀树:查询 1.2.4.8 时沿着二进制前缀往下走,命中某个节点,节点上写着"这个段属于福建宁德"。
主流数据源
- MaxMind GeoLite2:事实标准,社区版免费,城市级精度,每周更新。IPchase 用的就是它,服务器本地部署
- IP2Location / DB-IP:商业数据库,各家有自家的数据修正
- 纯真 IP 库:国内老牌库,对中国大陆数据补充较好
精度:城市级是上限,不是保证
要建立一个预期:GeoIP 的城市级精度大约 70%–90%,再往上没有了。
原因是 IP 归属登记的是运营商注册地址,不是用户物理位置:
- 运营商给一个县城分配的 IP 段,可能登记在地级市分公司
- 手机流量走省级网关,全省用户查出来都是省会
- CDN 的 anycast IP(如
8.8.8.8)全球几十个节点共用,只能说"任播"
所以"查出来是宁德,实际我在福州"这类偏差属于数据机制的天然误差,任何 GeoIP 服务都存在,不存在"绝对准"的库。
更新机制:为什么每周都要更新
运营商不断调整地址段。MaxMind 每周二发布新版 GeoLite2,内容会包含:
- 新分配的地址段
- 归属信息修正
- ASN(自治系统)变更
数据库不更新的后果:新 IP 段查出来一片空白,或者归属还是上家。
IPchase 的做法是服务器本地部署 + 每天自动检查更新——查询时不依赖任何外部 API,响应快、无次数限制,数据库有新版本就自动拉取。
除了归属地,还能查到什么
一次 IP 查询能附带的信息比想象中多:
| 字段 | 来源 | 用途 |
|---|---|---|
| 国家/省/市 | GeoIP City 库 | 展示归属 |
| 经纬度 | City 库(城市中心点) | 地图标注 |
| 时区 | City 库 | 显示当地时钟 |
| ASN / 运营商 | GeoIP ASN 库 | 判断是机房还是家宽 |
| IP 类型 | 数据中心/家宽标记 | 代理识别的关键 |
其中 ASN 特别值得说:AS4134 是电信骨干、AS15169 是 Google——看到 ASN 就知道这个 IP 属于谁的网络。它是代理识别的核心依据之一。
小结
- IP 归属地 = 分配登记数据 + 路由数据的汇总,城市级精度 70–90%
- 查询实现是本地数据库的前缀匹配,毫秒级
- 数据每周都在变,选服务时要看更新机制
- ASN 是 IP 背后的"门派",比城市归属更有信息量
试试:IP 查询工具,输入任意 IP 看看它的完整档案。
检测你的网络环境:回到首页做一次完整检测,或试试 指纹检测。