与AAAA请求相关的延迟

我有一个运行混合的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 ,则不会有任何延迟。

附加信息:

  • IPv6在服务器网卡上被禁用

更新:

Ask Ubuntu上的这个答案build议添加

 options single-request 

/etc/resolv.conf这似乎纠正了我的问题。

不过,我仍然好奇:

  • SOAlogging实际上意味着什么
  • 为什么服务器第一次没有响应A查询

您的DNS服务器似乎是越野车。 两个请求被发送到DNS服务器,但它只发送一个单一的答复。 客户端在这种情况下做客户端应该做的事情,等待一会儿然后重新发送请求。

对于非交互式使用,初始延迟5秒可能是合理的。 但是对于交互式的使用,我会认为这太高了。

正确的解决办法是将DNS服务器升级到没有错误的版本,或者如果尚未发布修复,请与供应商联系。 其他一切都是解决方法。

在Ubuntu系统上使用man resolv.conf将解释single-requestsingle-request-reopen选项的function。 对于某些DNS服务器中的已知错误,这是两种不同的解决方法。 这些选项的缺点是它减慢了大约两倍的名称parsing度。 不过,考虑到该错误似乎会使名称parsing速度减慢大约1000倍,您仍然可以使用解决方法。

当请求不存在的logging时,您可能会收到一个带有SOAlogging的响应。 不仅发送错误代码而且发送SOAlogging的原因在于,SOAlogging包含将允许caching否定结果的信息。

解释您的数据包捕获的正确方法是,您看到AAAAAlogging响应的丢弃答复数据包。

SOAlogging似乎让你感到困惑,值得详细阐述:

  • SOAlogging实际上是在权威部分,而不是答案部分。
  • NXDOMAIN意思是“没有那个名字的logging”。 如果有其他logging具有相同的名称,但types不同,则您将看到的答案是“ NOERROR ,答案部分中的logging为零。
  • 你所看到的是一个NOERROR响应,零答案和一个权威部分告诉你这个答案来自哪个区域。 您可以完全忽略SOA组件。 这个答复告诉你没有AAAAlogging。

现在我们已经确定AAAA答复是一个格式正确的数据包,在这种情况下你应该看到,它改变了我们正在看的内容。 您看到Alogging回复正在丢失的情况, 除了 AAAA回复正在丢失。 你的研究表明, AAAA反应正在失去更多的频率,但不是唯一的。

根据所提供的信息,我们无法解释这里发生了什么。 您需要在DNS服务器上设置数据包捕获,并确定以下因素:

  1. 与缺失答复相关的查询是否实际到达DNS服务器?
  2. 如果查询到达DNS服务器,是否实际发送回复?
  3. 如果服务器没有发送回复,您的DNS服务器是否需要从需要很长时间才能响应的不同DNS服务器获取此信息? (在最初的尝试超时,但在第二次尝试caching查询)您是否看到足够大的查询负载溢出您的套接字队列 ?
  4. 如果服务器正在发送回复,服务器和客户端之间的设备可能会丢失数据包? 与其他DNS服务器相比,其中一台DNS服务器是否存在路由问题? 似乎是从所有的DNS服务器丢失数据包,build议客户端和服务器之间的networking问题?

正如你所看到的,这里有很多事情可以做。 你将需要缩小问题的范围,以排除可能性。 对于这个答案我并不确定,但是这远远不止于一些评论。 随时更新您的问题。