如果我有域名列表及其IP地址,如何跳过DNS请求? scans.io提供了域名及其IP的列表,我想使用该列表而不是向DNS服务器发送查询。 有没有设置我自己的DNS服务器?
编辑: 原因是我有一个包含数百万个域名的大文件,我希望尽快抓取它们而不会被DNS服务器禁止。
答案 0 :(得分:1)
如果您使用InetAddress.getByName(String)
(javadoc),则可以提供DNS名称或IP地址的字符串表示形式。在后一种情况下,该方法不会进行不必要的DNS查找。
当IP有多个网站时会发生什么?如果我没记错的话,这是可能的,只提供IP应该是不够的。
网站由网址标识,而不仅仅是DNS名称或IP地址。 URL为您提供主机名或IP地址,以及要使用的协议,端口号和路径。这些中的任何一个都可能导致您的HTTP请求被定向/重定向到不同的“站点”......无论这意味着什么。
基本上,连接到“网站”的过程如下:
如果同一IP地址+端口上有多个“站点”(例如,因为多个主机名解析为同一个IP),那么服务器将根据起始线(可能还有其他“站点”)进行响应HTTP标头)。
如果您的目标是减少HTTP交互的DNS查找,那么最好的办法是配置客户端DNS缓存。细节是特定于平台的。 Google可以帮助您查找详细信息。
您还可以将DNS条目的大文件转换为“/ etc / hosts”语法,并将本地解析器指向它。
答案 1 :(得分:1)
有几种可能性。
如果不要求将DNS查找从数据文件限制到特定的Java进程,则可以将列表添加到系统的“hosts”文件中。在何处查找文件是特定于操作系统的,如果他们使用OS API调用从主机名解析IP,则必须考虑系统上运行的所有进程都将从hosts文件中获取匹配的IP。
如果Java VM支持,另一个选项是将主机名解析程序配置为使用除常规DNS查找之外的其他数据源。 Oracle的Java VM提供了这种可能性,您可以在网络属性文档的JNDI DNS service provider settings部分找到配置文档。也许有点过时,但this article还为您提供了一个完整的示例,说明如何使用sun.net.spi.nameservice中的API实现自己的NameService。
答案 2 :(得分:1)
您没有解释您希望如何处理您认为需要DNS查找的数据。如果您尝试在java中创建InetAddress对象,则可以调用InetAddress.getByAddress(host, addr)
来构造InetAddress而不执行DNS查找。
要将地址转换为byte[]
,如果您知道地址是有效地址,请致电InetAddress.getByName(addr).getAddress()
。它不会导致DNS查找。如果您不信任您的数据,您可能需要编写一个小函数来自己解析地址并构建一个字节数组。