1.IP地址介绍
1.内网 IP 地址(私有 IP 地址)
内网 IP 地址,即私有 IP 地址,是在局域网(LAN)内部使用的 IP 地址。这些地址不会在公共互联网中路由,因此可以在多个局域网中重复使用。私有 IP 地址通常由路由器或其他网络设备通过 DHCP(动态主机配置协议)分配给局域网内的设备。
1.私有 IP 地址范围
根据 RFC 1918,私有 IP 地址有以下范围:
- 10.0.0.0 到 10.255.255.255(10.0.0.0/8)
- 172.16.0.0 到 172.31.255.255(172.16.0.0/12)
- 192.168.0.0 到 192.168.255.255(192.168.0.0/16)
这些地址仅在局域网内有效,不会在公共互联网中出现。
2.使用场景
- 家庭网络:路由器为家庭中的设备(如电脑、手机、智能电视等)分配私有 IP 地址。
- 公司或学校网络:内部网络内的所有设备使用私有 IP 地址进行互连。
2.公网 IP 地址(公共 IP 地址)
公网 IP 地址,即公共 IP 地址,是在公共互联网上使用的 IP 地址。每个公网 IP 地址都是唯一的,由互联网服务提供商(ISP)分配,确保全球范围内的唯一性。
1.公共 IP 地址管理
公共 IP 地址由全球组织(如 IANA 和各地区的 RIRs)管理并分配给 ISP 和最终用户。
2.使用场景
- 访问互联网:当设备需要访问互联网时,它们使用公网 IP 地址进行通信。
- 托管服务:如网站、邮件服务器和其他在线服务,必须有一个公网 IP 地址才能在互联网上访问。
3.内网 IP 与公网 IP 的关系
1.网络地址转换(NAT)
NAT(网络地址转换)是一种技术,使多个设备可以通过一个或多个公共 IP 地址访问互联网。NAT 通常由路由器或防火墙实现。
2.NAT 的工作原理
-
请求阶段:
- 内网设备(如你的电脑)使用私有 IP 地址发送请求到互联网。
- 路由器使用 NAT,将私有 IP 地址转换为公共 IP 地址,并记录转换表(包括原始私有 IP 和端口号)。
-
响应阶段:
- 互联网服务器将响应发送到路由器的公共 IP 地址。
- 路由器根据转换表,将响应转发到对应的内网设备。
3.举例说明
-
内网 IP 地址:
- 你的电脑在学校局域网内的 IP 地址是
10.195.1.65
。 - 这个 IP 地址仅在学校局域网内部有效。
- 你的电脑在学校局域网内的 IP 地址是
-
公网 IP 地址:
- 当你访问
https://ip.3322.net/
时,你的请求会通过学校的路由器发送到互联网。 - 路由器将你的私有 IP 地址
10.195.1.65
转换为公共 IP 地址183.157.163.123
。 - 网站
ip.3322.net
看到的就是183.157.163.123
,这是你的学校网络对外展示的 IP 地址。
- 当你访问
4.总结
-
内网 IP 地址(私有 IP 地址):
- 仅在局域网内部使用。
- 不在公共互联网中路由。
-
公网 IP 地址(公共 IP 地址):
- 在公共互联网上使用。
- 由 ISP 分配,全球唯一。
-
NAT 技术:
- 使局域网内的多个设备通过一个公共 IP 地址访问互联网。
- 路由器记录并管理私有 IP 和公共 IP 的转换关系。
2.IP查询
前面已经介绍了内网 IP 和公网 IP 的区别。如果你想查询某个 IP 在现实世界中的位置,通过内网 IP 是无法实现的。因此,需要先通过访问 https://ip.3322.net/ 获取你的设备的公网 IP,然后才能进行后续的地理位置查询操作。
我编写了一个程序,用户可以输入对应的公网 IP,程序将访问该公网 IP 并返回其对应的国家、省份、城市,以及经度和纬度。具体代码如下所示:
import requestsheaders = {'Accept': '*/*','Accept-Language': 'zh-CN,zh;q=0.9','Cache-Control': 'no-cache','Connection': 'keep-alive','Origin': 'https://ip-api.com','Pragma': 'no-cache','Referer': 'https://ip-api.com/','Sec-Fetch-Dest': 'empty','Sec-Fetch-Mode': 'cors','Sec-Fetch-Site': 'same-site','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36','sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"',
}params = {'fields': '66842623','lang': 'en',
}input_ip = input('请输入你需要查询的IP: ')response = requests.get(f'https://demo.ip-api.com/json/{input_ip}', params=params, headers=headers)
info_json = response.json()if info_json['status'] == 'success':ip = info_json.get('query', 'N/A')country = info_json.get('country', 'N/A')region = info_json.get('regionName', 'N/A')city = info_json.get('city', 'N/A')lat = info_json.get('lat', 'N/A')lon = info_json.get('lon', 'N/A')print(f'IP: {ip}')print(f'Country: {country}')print(f'Region: {region}')print(f'City: {city}')print(f'Latitude: {lat}')print(f'Longitude: {lon}')
else:print('无法获取该IP的信息。')
当前,如果你不想执行程序,你也可以访问ip-api,在里面输入对应的公网IP,也一样可以得到对应的位置信息。
3.定位位置
前面提到的程序或网站查询通常只能定位到具体的城市。如果你还想进一步精确到具体的街道等详细信息,则需要使用经度和纬度进行查询。你可以打开百度地图,并在其中输入前面通过 IP 地址获取的经度和纬度,即可定位到对应 IP 的具体位置信息。通过这种方式,你可以获得更详细的地理位置数据,从而实现更精确的定位。