数据分析该知道的IP地址知识
第一次接触到IP,还是在十多年前使用统计系统时,当时的统计系统中有个指标是IP地址。即记录每天有多少不同的IP访问您的网站,在后来是自己搭建统计系统时涉及到对IP地址省份、城市、区域的解析。最近在推进风控项目时又有遇到,所以抽时间把相关的知识点做下简单的整理。
什么是IP地址?
IP地址(英语:IP Address,全称Internet Protocol Address)。当设备连接网络,设备将被分配一个IP地址,用作标识。通过IP地址,设备间可以互相通讯,如果没有IP地址,我们将无法知道哪个设备是发送方,无法知道哪个是接收方。IP地址有两个主要功能:标识设备或网络 和 寻址(英语:location addressing)。常见的IP地址分为 IPv4 与 IPv6 两大类,IP地址由一串数字组成。IPv4 由十进制数字组成,并以点分隔,如:172.16.254.1;IPv6 由十六进制数字组成,以冒号分割,如:2001:db8:0:1234:0:567:8:1。这里主要讲解的是IPv4。
IP地址表示方法:
- 点分十进制(最常用的表示方法):11.3.31
- 二进制记法:10000000 00001011 00000011 00011111
- 十六进制记法:0X810B0BEF
在对IP进行数据存储的时候,我们经常会将IP地址的int型数值。
import ipaddress print(int(ipaddress.IPv4Address('36.154.120.82'))) print(str(ipaddress.IPv4Address(614103122)))
IP地址分类
每一类地址都由两个固定长度的字段组成:
- 一个字段是网络号 net-id,它标志主机(或路由器)所连接到的网络
- 一个字段则是主机号 host-id,它标志该主机(或路由器)
由于近年来已经广泛使用无分类 IP 地址进行路由选择,A 类、B 类和 C 类地址的区分已成为历史[RFC 1812]。所以这里不用过于记忆,只需了解 IP 分类的最初标准。
子网掩码
子网掩码必须结合IP地址一起使用,子网掩码的作用是将某个IP地址划分成网络地址和主机地址两部分。并且子网掩码设置不是任意的,如果设置过大(范围扩大),有可能因为错误的判断使数据不能正确到达目的主机,导致网络传输错误;如果网掩码设置得过小,会增加缺省网关的负担,造成网络效率下降。
因此,如果网络的规模不超过254台主机,采用“255.255.255.0”作为子网掩码就可以了,现在多数的局域网都不会超过这个数字,所以这是最常用的IP地址子网掩码。
当一个网段的掩码为255.255.255.0的时候,通常IP地址的最后一位不可以是255或0。因为0是网段的网络地址,而255是网段的广播地址,不能分配给主机。那什么情况下可以是255或0,假设一个网段为155.23.0.0,它的掩码是255.255.254.0,那它的主机可用地址范围是155.23.0.1到155.23.1.254,即155.23.1.0和155.23.0.255这两个地址是可用的。
子网掩码决定了可用的主机数量有多少,以及ip是否在同一个网段,举两个例子:
- 以网段168.0.0为例:当子网掩码为255.255.255.0时,可用IP为192.168.0.1-192.168.0.254(255为广播地址),子网掩码为255.255.0.0时,可用IP为192.168.0.0-192.168.255.254。
- 以168.10.1和192.168.100.1为例:当子网掩码为255.255.255.0时,他们不在一个网段,子网掩码为255.255.0.0时,他们在同一个网段。所以多个IP地址是否在同一个网段以及该网段有多少个可用的IP地址,由子网掩码决定。
无分类编址CIDR
一个IP地址包含两部分:标识网络的前缀和紧接着的在这个网络内的主机地址。在之前的分类网络中,IP地址的分配把IP地址的32位按每8位为一段分开。这使得前缀必须为8,16或者24位。因此,可分配的最小的地址块有256(24位前缀,8位主机地址,2^8=256)个地址,而这对大多数企业来说太少了。大一点的地址块包含65536(16位前缀,16位主机,2^16=65536)个地址,而这对大公司来说都太多了。这导致不能充分使用IP地址和在路由上的不便,因为大量的需要单独路由的小型网络(C类网络)因在地域上分得很开而很难进行聚合路由,于是给路由设备增加了很多负担。
无类别域间路由是基于可变长子网掩码(VLSM)来进行任意长度的前缀的分配的。在RFC 950(1985)中有关于可变长子网掩码的说明。CIDR包括:
- 指定任意长度的前缀的可变长子网掩码技术。遵从CIDR规则的地址有一个后缀说明前缀的位数,例如:168.0.0/16。这使得对日益缺乏的IPv4地址的使用更加有效。
- 将多个连续的前缀聚合成超网,以及,在互联网中,只要有可能,就显示为一个聚合的网络,因此在总体上可以减少路由表的表项数目。聚合使得互联网的路由表不用分为多级,并通过VLSM逆转“划分子网”的过程。
- 根据机构的实际需要和短期预期需要而不是分类网络中所限定的过大或过小的地址块来管理IP地址的分配的过程。
CIDR用可变长子网掩码 (VLSM,Variable Length Subnet Masking),根据各人需要来分配IP地址,而不是按照一个全网络约定的规则。所以,网络/主机的划分可以在地址内的任意位置进行。这个划分可以是递归进行的,即通过增加掩码位数,来使一部分地址被继续分为更小的部分。整个互联网现在都在使用CIDR/VLSM网络地址。除此之外,CIDR也应用在其他方面,尤其是大型私人网络。在普通大小的局域网里则较少应用,因为这些局域网一般使用私有网络。
如何理解可变长子网掩码?假设IP地址是192.168.1.0~192.168.1.255,使用255.255.255.0即可实现。但如果现在需要将这些IP分为四份,分配给不同的网络:
- 168.1.0-192.168.1.63
- 168.1.64-192.168.1.127
- 168.1.128 -192.168.1.191
- 168.1.192-192.168.1.255
用可变长子网掩码表示就是:
- 168.1.0/26
- 168.1.64/26
- 168.1.128/26
- 168.1.192/26
这里的/26,代表的是11111111-11111111-11111111-11000000,即26个1,转化为IP就是255.255.255.192。
192.168.1.0对应的二进制是:11000000.10101000.00000001.00000000,在子网掩码下,前面26位保持不变,终止IP为:11000000.10101000.00000001.00111111,即192.168.1.63
内网IP与公网IP
内网IP地址、外网IP地址这个概念并不是固定的,而是相对的。如果用私有IP、公网IP或者局域网IP、互联网IP来理解就容易多了。看网络习惯书籍无法理解很多原因是因为教科书太古老,不与时俱进造成的。几乎所有的教科书都会告诉大家私有IP有3种:A类10.0.0.0~10.255.255.255,B类172.16.0.0~172.31.255.255,C类192.168.0.0~192.168.255.255。
RFC1918 规定区块名 | IP地址区块 | IP数量 | 分类网络 说明 | 最大CIDR区块 (子网掩码) | 主机端位长 |
24位区块 | 10.0.0.0 – 10.255.255.255 | 16,777,216 | 单个A类网络 | 10.0.0.0/8 (255.0.0.0) | 24位 |
20位区块 | 172.16.0.0 – 172.31.255.255 | 1,048,576 | 16个连续B类网络 | 172.16.0.0/12 (255.240.0.0) | 20位 |
16位区块 | 192.168.0.0 – 192.168.255.255 | 65,536 | 256个连续C类网络 | 192.168.0.0/16 (255.255.0.0) | 16位 |
事实上远远不止:
Address Block Name RFC 0.0.0.0/8 "This host on this network" [RFC1122], section 3.2.1.3 10.0.0.0/8 Private-Use [RFC1918] 100.64.0.0/10 Shared Address Space [RFC6598] 127.0.0.0/8 Loopback [RFC1122], section 3.2.1.3 169.254.0.0/16 Link Local [RFC3927] 172.16.0.0/12 Private-Use [RFC1918] 192.0.0.0/24[2] IETF Protocol Assignments [RFC6890], section 2.1 192.0.0.0/29 IPv4 Service Continuity Prefix [RFC7335] 192.0.0.8/32 IPv4 dummy address [RFC7600] 192.0.0.9/32 Port Control Protocol Anycast [RFC-ietf-pcp-anycast-08] 192.0.0.170/32, 192.0.0.171/32 NAT64/DNS64 Discovery [RFC7050], section 2.2 192.0.2.0/24 Documentation (TEST-NET-1) [RFC5737] 192.31.196.0/24 AS112-v4 [RFC7535] 192.52.193.0/24 AMT [RFC7450] 192.88.99.0/24 Deprecated (6to4 Relay Anycast) [RFC7526] 192.168.0.0/16 Private-Use [RFC1918] 192.175.48.0/24 Direct Delegation AS112 Service [RFC7534] 198.18.0.0/15 Benchmarking [RFC2544] 198.51.100.0/24 Documentation (TEST-NET-2) [RFC5737] 203.0.113.0/24 Documentation (TEST-NET-3) [RFC5737] 240.0.0.0/4 Reserved [RFC1112], section 4 255.255.255.255/32 Limited Broadcast [RFC919], section 7
另外,部分阿里云服务器使用路由跟踪显示的defense.gov (DoD Network) IP地址,其实是阿里使用了美国国防部的公网IP当内网IP用。原因是无法从公网访问美国国防部的这些IP段,所以不会造成IP混乱。
IP地址匮乏问题
中国所获得的IPv4地址情况:
- 中国大陆IPv4地址总数为74,391,296个,合4A+111B+31C
- 中国台湾IPv4地址总数为16,280,064个,合248B+106C
- 中国香港IPv4地址总数为06,288,640个,合95B+245C
- 中国澳门IPv4地址总数为00,144,640个,合2B+53C
不管是电脑、手机号是网站服务器都需要使用IP,以上的IP远远不够。这也就导致了我们再也不能像十几年前一样通过简单的统计IP量来统计用户量。
3G/4G网络下的IP地址
用手机本身的流量上网的话,IP是随着你手机信号连接的基站的变化而变化的。手机从基站接入,传递数据给基站,然后基站传递给上层BSC,PCU从中剥离出分组业务数据,传递给SGSN,最后通过SGSN经由GGSN这个网关将数据汇入到茫茫internet中。
手机使用3g/4g信号上网,在同一区域只有1个IP,如果您去了别的城市用3g/4g信号上网则会变动IP。通过手机数据流量上网,即使是在异地,也会分配手机卡归属地的IP地址。比如手机卡归属地是北京,到了山东之后连接数据流量,这时候的IP地址还会是北京的IP。无论手机漫游到天涯海角,手机漫游所在地的SGSN根据手机号码,可以查询到手机的归属地,还可以查询到该归属地的GGSN的IP地址,然后使用GTP(GPRS Tunnel Protocol)在漫游地与归属地建立一个GTP隧道,如下所示:漫游地SGSN<——- GTP隧道—— > 归属地GGSN
漫游地把该手机所有的数据流量统统使用该GTP隧道,流到归属地的GGSN,归属地再剥离掉GTP隧道头,得到用户的报文,再做进一步的处理:
- 如果是手机请求分配IP地址等参数,GGSN将IP地址等参数返回给手机用户,通过GTP隧道传输
- 如果是访问互联网的流量,GGSN完成NAT,将用户流量发送到Internet
这样做的好处是,所有用户的数据流量都经过归属地的计费系统,方便统一计费。
举例:苏州移动用户的无线网络IP均为:
- 136.67.48~117.136.67.95
- 136.67.160~117.136.255
无论苏州移动的用户漫游到哪里,他的IP永远是上面几个。(由于目前已经取消了漫游费,所以手机归属地并不一定是常住地)
宽带/ADSL网络下的IP地址
以前,ADSL或宽带都是在连接时都会分配公网IP,但随着IPv4缺口的变大,很多运营商都不再提供公网IP,类似长城光缆这种二级运营商只给内网IP。目前联通和电信也开始只提供内网IP,然后NAT后大家共享一个公网地址。而通常运营商NAT后分配的地址为:100.64.0.0/10
IP地址归属地
全球IP地址分配由IANA(Internet Assigned Numbers Authority)负责管理,官方网站是:Internet Assigned Numbers Authority但IANA不负责具体的地址分配,具体的地址分配由其下属的几个互联网中心管理,其中包括:
- APNIC(亚太互联网络信息中心)
- AFRINIC(非洲互联网信息中心)
- ARIN(北美互联网号码注册中心)
- LACNIC(拉美互联网信息中心)
- RIPE NCC(欧洲网络资讯中心)
分别负责具体的IP地址分配。理论上,所有IP地址的归属,都能从以上的几个中心网站上查到,其中APNIC的查询页面是: APNIC – Query the APNIC Whois Database可以说,大多数IP数据库中的原始数据都是来自这里。但这里只能查询到IP地址申请人所描述的信息,实际上根本无法精确到具体的街道、校区、宿舍等。而且IANA只负责分配,不负责管理具体这个IP地址怎么用。所以,理论上说,完全精确的IP地址数据库是根本不存在的。需要注意的是:凡是那种有精确楼号、街道、校区的IP地址数据库,都不一定是准确,都是经过人工修正的,如果有一天互联网接入商更改了IP地址分配的策略,那么这种数据库就不准了。国内使用的最多的纯真IP数据库就是基于WHOIS数据库创建的。
目前国内绝大多数IP库都由WHOIS数据库作为基础数据来源。WHOIS数据仅表示某个IP被哪个机构注册,但无从知晓该IP被用在何处,这就导致许多非运营商自己注册的IP地址无法被正确分类。
基于边界网关的IP数据
随着互联网规模的增加,为了处理大批量的路由数据,边界网关协议(即BGP,下同)应运而生,是互联网的基础协议之一。为了保证了全球网络路由的可达性,但凡需要在互联网中注册一个IP(段),都需要借助BGP协议对外广播,这样互联网中的其他自治域才能学习到这段地址的路由信息,其它主机才能成功访问这个IP(段)。因此可以说,BGP数据是最适合分析运营商IP地址的数据来源之一。
但是,目前国内绝大多数IP库都由WHOIS数据库作为基础数据来源。WHOIS数据仅表示某个IP被哪个机构注册,但无从知晓该IP被用在何处,这就导致许多非运营商自己注册的IP地址无法被正确分类。ipip.net是最早开始做BGP/ASN数据分析的公司之一,数据准确性甩其它库几条街。但很可惜是,ipip.net作为商业公司,绝大多数高质量的IP数据都是收费的,且价格不菲。但有类似的 开源版本。
服务器如何获取IP
在讨论获取客户端IP 地址前,我们首先下弄明白的是以下三个的具体含义:REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR
- REMOTE_ADDR:访问端(有可能是用户,有可能是代理的)IP
- HTTP_CLIENT_IP:代理端的(有可能存在,可伪造)
- HTTP_X_FORWARDED_FOR:用户是在哪个IP使用的代理(有可能存在,也可以伪造)
没有使用代理服务器的情况:
- REMOTE_ADDR = 您的 IP
- HTTP_CLIENT_IP = 没数值或不显示
- HTTP_X_FORWARDED_FOR = 没数值或不显示
使用透明代理服务器的情况:Transparent Proxies
- REMOTE_ADDR = 最后一个代理服务器 IP
- HTTP_CLIENT_IP = 代理服务器 IP
- HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:98.182.163, 203.98.182.163, 203.129.72.215。
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
使用普通匿名代理服务器的情况:Anonymous Proxies
- REMOTE_ADDR = 最后一个代理服务器 IP
- HTTP_CLIENT_IP = 代理服务器 IP
- HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:98.182.163, 203.98.182.163, 203.129.72.215。
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。
使用欺骗性代理服务器的情况:Distorting Proxies
- REMOTE_ADDR = 代理服务器 IP
- HTTP_CLIENT_IP = 代理服务器 IP
- HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:98.182.163, 203.98.182.163, 203.129.72.215。
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
- REMOTE_ADDR = 代理服务器 IP
- HTTP_CLIENT_IP = 没数值或不显示
- HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:98.182.163, 203.98.182.163, 203.129.72.215。
完全用代理服务器的信息替代了您的所有信息,就像您就是完全使用那台代理服务器直接访问对象。
备注:服务器如果做了负载均衡,则需要在在获取IP时使用HTTP_X_FORWARDED_FOR获取原IP。