与 AAAA 请求相关的延迟

与 AAAA 请求相关的延迟

我有一个独立的、隔离的网络,运行混合的 Windows 和 Linux 系统,其中 Windows 2008 R2 服务器执行 AD 任务和 DNS。

getaddrinfo我发现在 Linux 系统上使用时有 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 上的这个答案建议添加

options single-request

/etc/resolv.conf这似乎解决了我的问题。

不过,我还是很好奇:

  • SOA 记录实际上方法
  • 为什么服务器第一次没有响应 A 查询

答案1

您的 DNS 服务器似乎存在错误。向 DNS 服务器发送了两个请求,但它只发送了一个回复。客户端会执行在这种情况下应该执行的操作,它会等待一小段时间,然后重新传输请求。

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

正确的解决方法是将 DNS 服务器升级到没有该错误的版本,或者如果尚未发布修复程序,请联系供应商。其他所有方法都是权宜之计。

man resolv.conf在 Ubuntu 系统上使用将解释single-requestsingle-request-reopen选项的作用。这是针对某些 DNS 服务器中已知错误的两种不同解决方法。这些选项的缺点是它将名称解析速度降低了大约两倍。但是,考虑到该错误似乎将名称解析速度降低了大约 1000 倍,您最好还是使用解决方法。

当请求不存在的记录时,您可能会收到带有 SOA 记录的响应。不仅发送错误代码,还发送 SOA 记录的原因是 SOA 记录包含允许缓存负面结果的信息。

答案2

正确解释数据包捕获的方式是,您看到丢弃的回复数据包两个都A记录AAAA答复。

SOA记录似乎让你感到困惑,值得详细说明:

  • SOA记录实际上在权威部分,而不是答案部分。
  • NXDOMAIN表示“没有具有该名称的记录”。如果有其他具有相同名称但类型不同的记录,您将看到的响应是NOERROR答案部分中有零条记录。
  • 您看到的是一条NOERROR没有答案的响应,以及一个权威部分,告诉您答案来自哪个区域。您可以SOA完全忽略该组件。此回复告诉您没有AAAA记录。

现在我们已经确定AAAA回复是一个格式正确的数据包,并且应该在这种情况下,它完全改变了我们所看到的内容。你会看到A记录回复丢失的情况,此外 AAAA回复丢失。您的研究表明,AAAA回复丢失的频率越来越高,但并非全部。

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

  1. 与缺失答复相关的查询是否真正到达了 DNS 服务器?
  2. 如果查询到达 DNS 服务器,那么答复是否真的被发送了?
  3. 如果服务器没有发送回复,您的 DNS 服务器是否必须从需要很长时间才能响应的其他 DNS 服务器获取此信息?(首次尝试超时,但查询已缓存以供第二次尝试)您是否看到足够重的查询负载以溢出套接字队列
  4. 如果服务器发送回复时,服务器和客户端之间的哪些设备可能会丢失数据包?您的某个 DNS 服务器与其他服务器相比是否存在路由问题?是否似乎所有 DNS 服务器都丢失了数据包,这表明客户端和服务器之间的某个地方存在网络问题?

如您所见,这里可能发生了很多事情。您需要缩小问题范围以排除各种可能性。我很抱歉这个答案不是结论性的,但这远远超出了几个评论所能涵盖的范围。请随时更新您的问题。

相关内容