【发布时间】:2016-11-09 07:55:12
【问题描述】:
我正在使用 libresolv 执行对 dns 服务器的请求。
我也使用本地 dns 缓存。 (dnsmasq/未绑定)
当我使用dig,例如dig google.com,请求被缓存,下一个请求使用缓存值。
我们可以在 dnsmasq 日志中看到这一点:
Nov 9 10:46:46 y dnsmasq[24003]: query[A] google.com from 127.0.0.1
Nov 9 10:46:46 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov 9 10:46:46 y dnsmasq[24003]: reply google.com is 173.194.32.165
Nov 9 10:46:46 y dnsmasq[24003]: reply google.com is 173.194.32.160
Nov 9 10:46:49 y dnsmasq[24003]: query[A] google.com from 127.0.0.1
Nov 9 10:46:49 y dnsmasq[24003]: cached google.com is 173.194.32.165
Nov 9 10:46:49 y dnsmasq[24003]: cached google.com is 173.194.32.168
然后我使用res_query,我得到了这个:
Nov 9 10:50:29 y dnsmasq[24003]: query[MX] google.com from 127.0.0.1
Nov 9 10:50:29 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov 9 10:50:29 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov 9 10:51:13 y dnsmasq[24003]: query[MX] google.com from 127.0.0.1
Nov 9 10:51:13 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov 9 10:51:13 y dnsmasq[24003]: forwarded google.com to **.**.**.**
所以看起来来自 dns 服务器的响应没有命中 dns 缓存,也没有被缓存。
有没有办法缓存来自res_query的请求?
这就是我向 DNS 解析器发出请求的方式:
struct __res_state dnsstate;
int rc = res_ninit(&dnsstate);
if (rc < 0) {
return result;
}
dnsstate.retrans = timeout;
int len = res_nquery(&dnsstate, domain.c_str(), ns_c_in, ns_t_mx, nsbuf, sizeof(nsbuf));
我想 res_nquery 不会检查本地 DNS 缓存,而 dig 会。
【问题讨论】:
-
@Alnitak 是的,所以我应该向管理员询问 libresolv 的工作原理? Stackoverflow 变成了非常可笑的提问场所。
-
我可能误读了这个问题(现在很难说,我有 9 个小时的时差,只睡了 3 个小时)但正如所写的那样,我真的无法说出你在问什么。尝试查看 tcpdump 以查看 libresolv 发送的内容与 dig 发送的内容之间的差异(如果有)。也许还可以显示一些代码来显示如何您正在使用 libresolv。
-
@Alnitak 我在我的问题中添加了一些代码。 Tnx 获取有关 tcpdump 的建议。我已经试过了。似乎 res_nquery 仍然发送数据包来检查 dns,而 dig 什么也不发送,只是检查 dns 缓存。似乎 res_nquery 只能处理对 dns 的海峡请求
-
dig和res_nquery都只会将查询发送到您的resolv.conf中的任何内容,即您的 dnsmasq 实例,并且默认情况下,两者还将设置+RD位以请求递归。然后 dnsmasq 将从缓存中提供答案,或者如果 TTL 已过期,则去获取,但据我所知 DNS 协议本身没有任何内容(因此在res_nquery设置中没有任何内容)客户端可以设置将影响该行为。 -
附注也尝试发送 same 查询 - 您的
dig示例请求 A 记录,但您的res_nquery请求 MX 记录 - 也许 dnsmasq 本身根据查询 RTYPE 表现不同?
标签: c++ c caching dns libresolv