Appearance
IPv4和IPv6查IP归属地有啥区别?为什么有些IP查不到
有次我用某个IP查询工具查自己的手机IP,结果显示"查询失败"。我以为网络出了问题,折腾半天才发现,问题出在地址是IPv6,而那个工具根本不支持。
这其实是很多免费查询接口的通病:只做了IPv4,IPv6要么查不了,要么数据稀烂。今天就把这俩的区别讲清楚。
先分清这俩是啥
IPv4 就是我们熟悉的 58.30.0.0 这种,四组数字,一共43亿个,全球早就分光了。IPv6 是新一代地址,长这样:
240e:3a1:abcd:ef01::1234数量大到根本用不完。这几年国内运营商给宽带和手机用户推IPv6推得很猛,现在用手机流量的用户,一大半都是IPv6。你如果只支持IPv4查询,等于放弃了一大半用户。
查IPv6比查IPv4难在哪
难在数据。IPv4用了三十年,各家的地址库积累得比较全。IPv6普及晚、段也多,很多查询服务根本没花精力去维护IPv6的映射表,结果就是:
- 有些接口直接报错,不支持;
- 有些接口能返回,但数据是老的,位置不准;
- 有些把IPv6硬套IPv4的逻辑,返回一堆空字段。
这也是为什么我后来坚持用支持IPv6的接口。IP9 这点做得不错,IPv4、IPv6都支持,手机流量用户查出来还能到省市级。
一个实用的经验:手机用户用IPv6更准
前面那篇文章我提过一次,这里再展开说。蜂窝网络的IPv4出口IP,往往集中在省市级核心节点,人在小县城,显示却在省会。
而IPv6因为地址分配贴近实际接入点,同一部手机用IPv6查,往往比IPv4准。我自己实测过几部手机,IPv6查出来的位置和实际所在地基本对得上,IPv4则经常"偏高一级"。
所以给用户做位置判断时,一个简单的策略就是:如果能拿到IPv6,优先查IPv6。
怎么判断一个IP是v4还是v6
代码里很简单,判断字符串里有没有冒号就行:
python
def is_ipv6(ip: str) -> bool:
return ":" in ip或者用Python自带的:
python
import ipaddress
try:
ipaddress.IPv6Address(ip)
is_v6 = True
except ipaddress.AddressValueError:
is_v6 = False写在最后
如果你只做PC端小功能,IPv4可能够用;但只要涉及手机端、涉及统计用户地域分布,IPv6支持就是刚需,不是加分项。
下次遇到"IP查不到",先别怀疑自己的网络,先看看地址是不是带冒号的IPv6,再换个支持IPv6的接口试试。
IP9 接口地址(支持IPv4和IPv6):https://ip9.com.cn/get