通过 python 和 cmd 查找 ip 地址之间的区别

difference between finding ip address by python an cmd

我写这段代码是为了在 python 中查找 google ip

import socket
print socket.gethostbyname('google.com')
.
.
173.194.39.0

但是如果我们使用命令提示符和 ping 命令查找 google ip 结果 is:216.58.208.36 为什么两个结果之间存在差异?

主机名通过称为 DNS 服务器的东西转换为 IP 地址。当您在 Web 浏览器中键入名称或使用诸如 ping 之类的程序时,您提供的主机名 (google.com) 最终会到达该域的权威 DNS 服务器——与您对应的实际服务器分开内容.

google.com有多个不同的服务器可以响应数据请求。根据您用于生成请求的不同程序的实现以及其他因素(例如您发出请求时的网络流量),来自同一主机的多个请求可能会被权威 DNS 服务器定向到不同的服务器。这是通过向您的计算机返回不同的 IP 地址来实现的。

FWIW,google.com 的 ping 和 socket.gethostbyname() 在我的机器上解析为 216.58.217.14,运行 OS X Yosemite.

这两个 IP 地址都解析为 Google.com。我们可以使用 unix whois 命令从命令行验证这一点。

$ whois 216.58.208.36 

NetRange:       216.58.192.0 - 216.58.223.255
CIDR:           216.58.192.0/19
NetName:        GOOGLE

$ whois 173.194.39.0

NetRange:       173.194.0.0 - 173.194.255.255
CIDR:           173.194.0.0/16
NetName:        GOOGLE

我 运行 遇到了同样的问题,原因是第一个需要 IP 地址的命令正在使用缓存的 DNS 条目(因为 DNS 条目的生存时间 (TTL) 尚未过期) 然后在发出第二个命令时,缓存条目上的 TTL 已过期,因此为该域发出了一个新的 DNS 请求,因此从 DNS 服务器获取了一个新的 IP 地址,该地址恰好是不同的,因为该域有很多的 IP 地址就像 Google.com。

Python 仅依赖于操作系统的 DNS 解析器(或 运行ning 中的任何守护进程),据我所知,套接字模块无法让您清除 DNS在尝试解析地址之前缓存。如果你想更多地控制这个功能,你可以使用 DNSPython 或类似的东西。如果您在操作系统上使用 DNS 守护程序(例如 Linux),那么通常重新启动守护程序会强制刷新 DNS 缓存,您会发现两个地址相同(除非您 运行 进入时间问题,如上所述,TTL 到期)。