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

python查找ip地址和cmd之间的区别,python,Python,我编写了这段代码,用于在python中查找google ip import socket print socket.gethostbyname('google.com') . . 173.194.39.0 但如果我们使用命令提示符和ping命令来查找GoogleIP,结果是:216.58.208.36 为什么两个结果之间存在差异?主机名通过称为DNS服务器的东西转换为IP地址。当您在web浏览器中键入名称或使用ping之类的程序时,您提供给google.com的主机名最终会到达该域的权威DNS

我编写了这段代码,用于在python中查找google ip

import socket
print socket.gethostbyname('google.com')
.
.
173.194.39.0
但如果我们使用命令提示符和ping命令来查找GoogleIP,结果是:216.58.208.36
为什么两个结果之间存在差异?

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

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


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

这两个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请求,因此获取了新的DNSDNS服务器的IP地址恰好不同,因为该域有很多IP地址,就像Google.com一样

Python只依赖于操作系统的DNS解析器或任何正在运行的守护进程,据我所知,套接字模块在尝试解析地址之前不允许您清除DNS缓存。如果您想要更多地控制此功能,可以使用DNSPython或类似的工具。例如,如果您在操作系统(如Linux)上使用DNS守护进程,则通常重新启动该守护进程将强制刷新DNS缓存,并且您会发现两个地址相同,除非在TTL过期时遇到如上所述的定时问题

看看这个问题