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

时间:2015-01-03 19:42:51

标签: python

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

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

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

2 个答案:

答案 0 :(得分:3)

这两个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解析器(或正在运行的任何守护程序),据我所知,套接字模块无法在尝试解析地址之前清除DNS缓存。如果您想要更多地控制此功能,可以使用DNSPython或类似的东西。如果您在操作系统上使用DNS守护程序(例如在Linux上),那么通常重新启动守护程序将强制刷新DNS缓存,并且您发现两个地址都相同(除非您遇到计时问题,因为如上所述,TTL即将到期)。

答案 1 :(得分:1)

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

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

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