通过 Python 和 CMD 查找 IP 地址之间的区别



我写了这段代码,用于在python中查找Google IP

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

但是如果我们使用命令提示符和ping命令来查找谷歌IP结果是:216.58.208.36为什么两个结果有差异?

这两个

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过期的计时问题)。

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

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

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

最新更新