我有一个运行混合的Windows和Linux系统的独立隔离networking,Windows 2008 R2服务器执行AD职责和DNS。
我在Linux系统上看到了使用getaddrinfo 5秒的延迟。
在Wireshark中我看到(C-> S表示客户端到DNS服务器):
t=0.000 C->S Query A foo.example.com ID=0x1111 t=0.000 C->S Query AAAA foo.example.com ID=0x2222 t=0.004 S->C Response to 0x2222, No error (Query is echoed) Authoritative nameservers: example.com: type SOA, class IN, mname svr01.example.com Name: example.com Type: SOA Class: IN TTL: 1 hour Primary name server: svr01.example.com Refresh interval: 15 minutes Retry interval: 10 minutes Expiration limit: 1 day Minimum TTL: 1 hour [5 second delay] t=5.004 C->S Query A foo.example.com ID=0x1111 t=5.005 S->C Query response A 192.168.1.17'
如果我再次提出同样的要求,不久之后,我将不会像预期那样拖延:
t=0.000 C->S Query A foo.example.com ID=0x3333 t=0.000 C->S Query AAAA foo.example.com ID=0x4444 t=0.001 S->C Query response A 192.168.1.17'
我可以在一段时间内继续得到及时的回应。 过了一段时间(仍在试验),延迟将会返回。
这里发生了什么? 如果我使用gethostbyname() (仅用于IPv4)或nslookup foo.example.com ,则不会有任何延迟。
附加信息:
更新:
Ask Ubuntu上的这个答案build议添加
options single-request
到/etc/resolv.conf 。 这似乎纠正了我的问题。
不过,我仍然好奇:
您的DNS服务器似乎是越野车。 两个请求被发送到DNS服务器,但它只发送一个单一的答复。 客户端在这种情况下做客户端应该做的事情,等待一会儿然后重新发送请求。
对于非交互式使用,初始延迟5秒可能是合理的。 但是对于交互式的使用,我会认为这太高了。
正确的解决办法是将DNS服务器升级到没有错误的版本,或者如果尚未发布修复,请与供应商联系。 其他一切都是解决方法。
在Ubuntu系统上使用man resolv.conf将解释single-request和single-request-reopen选项的function。 对于某些DNS服务器中的已知错误,这是两种不同的解决方法。 这些选项的缺点是它减慢了大约两倍的名称parsing度。 不过,考虑到该错误似乎会使名称parsing速度减慢大约1000倍,您仍然可以使用解决方法。
当请求不存在的logging时,您可能会收到一个带有SOAlogging的响应。 不仅发送错误代码而且发送SOAlogging的原因在于,SOAlogging包含将允许caching否定结果的信息。
解释您的数据包捕获的正确方法是,您看到A和AAAAlogging响应的丢弃答复数据包。
SOAlogging似乎让你感到困惑,值得详细阐述:
SOAlogging实际上是在权威部分,而不是答案部分。 NXDOMAIN意思是“没有那个名字的logging”。 如果有其他logging具有相同的名称,但types不同,则您将看到的答案是“ NOERROR ,答案部分中的logging为零。 NOERROR响应,零答案和一个权威部分告诉你这个答案来自哪个区域。 您可以完全忽略SOA组件。 这个答复告诉你没有AAAAlogging。 现在我们已经确定AAAA答复是一个格式正确的数据包,在这种情况下你应该看到,它改变了我们正在看的内容。 您看到Alogging回复正在丢失的情况, 除了 AAAA回复正在丢失。 你的研究表明, AAAA反应正在失去更多的频率,但不是唯一的。
根据所提供的信息,我们无法解释这里发生了什么。 您需要在DNS服务器上设置数据包捕获,并确定以下因素:
正如你所看到的,这里有很多事情可以做。 你将需要缩小问题的范围,以排除可能性。 对于这个答案我并不确定,但是这远远不止于一些评论。 随时更新您的问题。