【发布时间】:2019-07-16 11:57:20
【问题描述】:
python DNS.query 和 socket.gethostbyname 有什么区别,哪个更准确?
我正在使用 DNS.query 来查找网站的 IPv4。 socket.gethostbyname 做同样的任务。那么构建python浏览器有什么不同,哪个更快更准确。
【问题讨论】:
标签: python sockets networking dns
python DNS.query 和 socket.gethostbyname 有什么区别,哪个更准确?
我正在使用 DNS.query 来查找网站的 IPv4。 socket.gethostbyname 做同样的任务。那么构建python浏览器有什么不同,哪个更快更准确。
【问题讨论】:
标签: python sockets networking dns
在您的上下文中定义“准确”。
系统有多种方法来解析名称。它可以使用来自/etc/hosts 的内容。它可以使用 LDAP。它可以使用 Windows 名称解析。它可以使用DNS。还有很多其他的东西。
在 Linux 系统上,您有一个名为 /etc/nsswitch.conf 的文件,它告诉系统您希望如何解析名称。例如,您可能在其中有一行:
hosts: files dns
也就是说,在这台主机上,解析一个名字,系统会先搜索/etc/hosts,如果没有找到,就去DNS。
所以socket.gethostbyname 将向操作系统询问名称,因此将使用上述机制。
如果您使用DNS.query,您“只是”进行 DNS 查询,仅此而已。如果要解析的名称只有/etc/hosts,则无法解析。
因此,什么是准确的取决于您的约束条件和上下文。两个调用做不同的事情。
也如文档中所述,无论如何您都应该使用getaddrinfo 而不是gethostbyname:
gethostbyname() 不支持 IPv6 名称解析,并且 应该使用 getaddrinfo() 代替 IPv4/v6 双栈支持。
【讨论】: