通过IP获取地址的原理

IP地址本身是不具备定位功能的,IP地址只是用来决定一台网络主机在网络里的相对位置,这个位置是相对而言,可以通过IP路由到目的主机,并不会关心目的主机的物理位置在哪里。所以理论上是不可能定位到IP地址的物理位置的。所以只能另辟蹊径了。简单介绍两种

1、 那就是通过自治系统(AS)。简单的理解,IP是全球统一的,具有全球唯一性,为了保证唯一性肯定要统一做分配,全球每个需要IP的人都去这个统一分配系统申请,那也不行,这个统一系统肯定忙得要死。所以将这个分配的权力下放,将一批IP分配给某一个组织,这个组织再进行进一步分配给下一级组织……。谁拿走了这批IP地址需要进行登记的,等级的时候随便做个组织地址的登记,咦,暴露了物理地址。所以就可以通过这个登记的信息去获取这批IP地址的大概位置。比如某组织申请了IP地址为1.4.127.0-1.4.127.255,通过查询登记信息,发现这个组织在广东,那么如果一个IP在这个批IP地址里面那么就能知道这个IP归属地的广东。

2、通过不断收集定位信息。虽然IP本身不具备定位功能,但是使用IP的主机具备定位功能,比如某APP获取定位信息的同时获取IP信息,然后一起上传到服务器保存起来,这样就可以建立IP地址的物理位置信息库了。

第一种,登记信息不会开放给大家用的,属于隐私数据了。第二种更加,手机本身就是涉及到用户隐私问题,况且收集困难,用的人少信息就不全。网上还是有很多往网站可以查IP地址的归属地的,百度出来一大堆。因为IP的物理位置相对来说变动不大,所以也有些直接提供所有IP和物理地址映射关系的所有数据。

实现IP归属地显示

调别人的接口

靠谱点,权威点的使用个地图厂商的接口
百度地图接口
高德地图接口

还有很多免费的
这里
这里
这里

用本地的数据

用别人的接口当然爽,发起请求解析请求搞定,不过也有不好的。收钱,限制调用次数,而且调次接口发起一次IO还很慢。那当然是本地好,主要是快,而且不依赖别人的接口。
例如star很多的项目ip2region

https://gitee.com/lionsoul/ip2region
https://github.com/lionsoul2014/ip2region

1、首先需要获取数据源,去找别人整理好的IP和物理地址对应关系数据或者通过脚本从某个网站爬出来。比如获取到数据如下

2、获取请求的IP地址。
根据IP协议可知,数据包都会携带源地址和目的地址的,所以只要是IP请求肯定能知道源IP地址的,如果隐藏比较好,做了各种代理那就只能取到代理机的IP了。HTTP协议也会在请求头里设置IP地址,所以可以直接通过http请求头进行获取IP地址,Java实现如下。

public static String getIpAddr(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for"); if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {// 多次反向代理后会有多个ip值,第一个ip才是真实ipif (ip.indexOf(",") != -1) {ip = ip.split(",")[0];}}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_CLIENT_IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_X_FORWARDED_FOR");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("X-Real-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}

3、拿到IP后直接去步骤1中获取的数据寻找对应的IP物理地址即可。

本地数据查询优化

1、空间优化
我们获取到IP格式是这样的(127.0.0.1),实际上IP地址长度为32二进制,直接字符串保存那也太浪费空间了,而且不好比较所以先将IP地址换成byte数组,就不用自己造轮子了,JDK已经有了,而且IPv4和IPv6都支持。

 byte[] ipByte = java.net.InetAddress.getByName("127.0.0.1").getAddress();

2、时间优化
遍历肯定不是最优解,避免遍历的最佳手段就是通过排序后使用二分法进行查询。
在进行空间优化后格式化数据到一个文件里,格式如下

前两位byte为数据头,记录版本号、数据的编码方式、所以字节数、数据长度范围、索引的长度等信息。之后就是索引的地方,所以根据主键进行有序排列的,并且保存索引数据的位置。这样当查询时直接通过二分法直接查询到索引的位置后拿到数据的位置,之后取出数据即可。
代码在github和gitee,CV即用。

https://gitee.com/eedui/location.git
https://github.com/eedui/location.git

号码归属地查询

号码归属地查询也是类似的方法,号码也是有类似的规律,前7位为号段,比如1300000这个号段山东省济南市的,所以拿到一个号码通过号段即可查询到归属地。甚至可以查到是哪个运营商,但是因为可以允许携号转网了,所以运营商更新快估计不准了。用上文数据结构可快速查询。
代码在github和gitee,CV即用。

https://gitee.com/eedui/location.git
https://github.com/eedui/location.git

实现IP地址归属地显示功能、号码归属地查询相关推荐

  1. github的ip地址经常变,可以在这里查询

    github的ip地址经常变,可以在这里查询 C:\Windows\System32\drivers\etc\hosts

  2. 网易有道 IP地址、邮编区号及城市查询、手机号码归属地和身份证 查询接口API

    http://blog.csdn.net/go_to_learn/article/details/8296412 具体有多少个接口,不得而知,目前网上搜索的就知道四个: 查询IP地址: http:// ...

  3. 路由器和电脑IP地址、端口号、网卡mac查询方式

    1.windows电脑ip查询命令:cmd打开电脑终端,输入ipconfig C:\Users\CI>ipconfig 2.Linux系统查询IP:ifconfig 3.路由器内网IP地址查询: ...

  4. java webservice ip_通过Web Service实现IP地址查询功能的示例

    实例01 实现一个简单的Web服务访问 本实例将实现IP地址查询接口服务,根据用户传入的IP地址返回IP所在的省.市.地区,实例中将会用到IP地址库用于查询信息,由于数据较多,所以读者可在光盘资源文件 ...

  5. 通过Web Service实现IP地址查询功能

    实例01  实现一个简单的Web服务访问 本实例将实现IP地址查询接口服务,根据用户传入的IP地址返回IP所在的省.市.地区,实例中将会用到IP地址库用于查询信息,由于数据较多,所以读者可在光盘资源文 ...

  6. 获取IP地址信息的API合集

    今天给大家分享一些获取IP地址信息的API合集 一.ip.cn查询网获取当前客户端IP 二.ip查询网获取当前客户端IP 三.百度获取IP地址信息 四.本站获取当前客户端IP信息 五.其他平台获取IP ...

  7. 关于IP地址、网络号、主机号、子网掩码之间的关系

    IP地址类似于我们的身份证号码 国家为了唯一确定我们每个人的身份,会为我们每个人分配一个唯一确定身份的号码,同理: 为了确切地标识Internet(互联网)中的每一台主机和路由器,TCP/IP建立了一 ...

  8. IP协议 (通俗易懂),IP协议的主要功能及实现原理,IP地址分类,IP数据包分片,IP数据报格式。

    「作者主页」:士别三日wyx 「作者简介」:CSDN top100.阿里云博客专家.华为云享专家.网络安全领域优质创作者 「专栏简介」:此文章已录入专栏<计算机网络零基础快速入门> 本章重 ...

  9. 【网络是怎么连接的】—— 1.2 向 DNS 服务器查询 Web 服务器的 IP 地址

    目录 1.2 向 DNS 服务器查询 Web 服务器的 IP 地址 1.2.1 IP地址基础知识 1.2.2 域名和 IP 地址并用的理由 1.2.3 Socket 库提供查询 IP 地址的功能 1. ...

  10. 网络规划.1.扩展.IP地址规划

    第一章 IPv4 Internet中有数百万台以上的主机和路由器,IP 地址可以确切地标识它们.- 一台主机至少拥有一-个IP地址.任何两台主机的IP地址不能相同,但是允许一台主机拥有多个IP地址.如 ...

最新文章

  1. 从FPN到Mask R-CNN,一文告诉你Facebook的计算机视觉有多强
  2. numpy使用[]语法索引二维numpy数组中指定范围数据行的数值内容(accessing rows in numpy array with specific range)
  3. 计算机审计应用功能,《计算机审计》模拟试题及答案
  4. Android下PopupWindow隐藏及显示(showAtLocation/showAsDropDown)
  5. linux find 忽略大小写查找文件
  6. Cannot find class for bean with name解决
  7. 八皇后问题 (递归 搜索)
  8. JS一起学03:js组成、下拉+text、字符串拼接、分号问题、数据类型、变量类型、作用域和闭包、命名、运算符、流程判断、调试、iNow、onchang
  9. 利用python进行识别相似图片(二)
  10. 如何查看oracle trace 文件
  11. 蒋金楠:200行代码7个对象《ASP.NET Core框架揭密》苏州.NET俱乐部课程分享
  12. PCL—关键点检测(rangeImage)低层次点云处理
  13. STM32F103C8T6单片机IAP升级
  14. linux 网络协议栈参数设置,linux 调整tcp/ip协议栈内核参数支持高负载的web
  15. C++复合类型-引用变量
  16. linux查cer证书信息,openssl 查看证书
  17. 如何免ROOT,实现安卓设备远程控制?
  18. php 上传 照片流,在 iPhone 上使用“我的照片流”的方法!
  19. Raft协议中文翻译(1)
  20. 苹果手机2019年什么时候出新款_[创立24周年]因强大而简单.智者,驭时而进 唯一的对手是上一个自己。要有舍才有得! - 手机数码电玩维修...

热门文章

  1. 创 业 项 目 计 划 书 样 本
  2. OneNote for windows10 微软商店下载UWP版本应用打不开
  3. js Unicode编码
  4. uni-app 自适应各种机型状态栏
  5. 《计算机组成原理阅读笔记》
  6. 三角网导线平差实例_导线平差实例(一):简易平差
  7. 远程连接端口修改,使用注册表修改
  8. 微型计算机原理第三版期末试题,《微机原理A (闭卷)》期末试题含答案.doc
  9. 开源超级终端工具——WindTerm
  10. 关关采集器如何配置代理ip【图文教程】