我有一个独立的、隔离的网络,运行混合的 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
更新:
options single-request
到/etc/resolv.conf
。这似乎解决了我的问题。
不过,我还是很好奇:
- SOA 记录实际上方法
- 为什么服务器第一次没有响应 A 查询
答案1
您的 DNS 服务器似乎存在错误。向 DNS 服务器发送了两个请求,但它只发送了一个回复。客户端会执行在这种情况下应该执行的操作,它会等待一小段时间,然后重新传输请求。
对于非交互式使用,5 秒的初始延迟可能比较合理。但对于交互式使用,我认为这太高了。
正确的解决方法是将 DNS 服务器升级到没有该错误的版本,或者如果尚未发布修复程序,请联系供应商。其他所有方法都是权宜之计。
man resolv.conf
在 Ubuntu 系统上使用将解释single-request
和single-request-reopen
选项的作用。这是针对某些 DNS 服务器中已知错误的两种不同解决方法。这些选项的缺点是它将名称解析速度降低了大约两倍。但是,考虑到该错误似乎将名称解析速度降低了大约 1000 倍,您最好还是使用解决方法。
当请求不存在的记录时,您可能会收到带有 SOA 记录的响应。不仅发送错误代码,还发送 SOA 记录的原因是 SOA 记录包含允许缓存负面结果的信息。
答案2
正确解释数据包捕获的方式是,您看到丢弃的回复数据包两个都并A
记录AAAA
答复。
该SOA
记录似乎让你感到困惑,值得详细说明:
- 该
SOA
记录实际上在权威部分,而不是答案部分。 NXDOMAIN
表示“没有具有该名称的记录”。如果有其他具有相同名称但类型不同的记录,您将看到的响应是NOERROR
答案部分中有零条记录。- 您看到的是一条
NOERROR
没有答案的响应,以及一个权威部分,告诉您答案来自哪个区域。您可以SOA
完全忽略该组件。此回复告诉您没有AAAA
记录。
现在我们已经确定AAAA
回复是一个格式正确的数据包,并且应该在这种情况下,它完全改变了我们所看到的内容。你会看到A
记录回复丢失的情况,此外 AAAA
回复丢失。您的研究表明,AAAA
回复丢失的频率越来越高,但并非全部。
根据提供的信息,我们无法解释这里发生了什么。您需要在 DNS 服务器上设置数据包捕获并确定以下因素:
- 与缺失答复相关的查询是否真正到达了 DNS 服务器?
- 如果查询到达 DNS 服务器,那么答复是否真的被发送了?
- 如果服务器没有发送回复,您的 DNS 服务器是否必须从需要很长时间才能响应的其他 DNS 服务器获取此信息?(首次尝试超时,但查询已缓存以供第二次尝试)您是否看到足够重的查询负载以溢出套接字队列?
- 如果服务器是发送回复时,服务器和客户端之间的哪些设备可能会丢失数据包?您的某个 DNS 服务器与其他服务器相比是否存在路由问题?是否似乎所有 DNS 服务器都丢失了数据包,这表明客户端和服务器之间的某个地方存在网络问题?
如您所见,这里可能发生了很多事情。您需要缩小问题范围以排除各种可能性。我很抱歉这个答案不是结论性的,但这远远超出了几个评论所能涵盖的范围。请随时更新您的问题。