【问题标题】:Non-blocking DNS resolution非阻塞DNS解析
【发布时间】:2016-04-17 20:53:15
【问题描述】:

这是在尝试构建 DNS 客户端/服务器系统时遇到的问题...

诸如getaddrinfogethostbyname 之类的函数借助某种DNS 解析来回答查询。我已经挖掘了很多源代码,但实际上从未见过任何代码行,其中一个套接字是打开的,并且在 DNS 服务器和客户端之间发生了通信。

我的问题是,gethostbyname 之类的函数如何在读取套接字等时不阻塞地执行网络操作(例如 DNS 查找)?从用户的角度来看,gethostbyname 似乎在操作中几乎是瞬间的......

【问题讨论】:

  • 你怎么得到它不等待?你扫了吗?问题是什么?你读过函数的源代码吗?
  • 我很抱歉。它确实在等待,但似乎很快就完成了。我只是好奇这些函数的内部工作原理,比如它们是否使用非阻塞套接字、某种 IO 轮询等等。到目前为止,我挖掘的源代码甚至没有暗示套接字操作。
  • 很可能gethostbynamegetaddrinfo 最终会使用来自libresolvres_* 函数,因此请寻找后者的来源。
  • Wiki:“DNS 主要使用端口号 53 上的用户数据报协议 (UDP) 来处理请求”。所以,套接字,UDP :)

标签: c sockets networking dns network-programming


【解决方案1】:

由于这些函数直接返回您要求的值(而不是使用回调或返回承诺)并且由于 DNS 查找需要时间,因此这些函数显然必须阻塞。它们的速度取决于许多因素,例如它们查询的 DNS 服务器(本地或远程)、结果是否已在 DNS 服务器中可用(即从先前的查找中缓存)以及上游 DNS 服务器的速度需要哪些查找未知名称。

【讨论】:

    【解决方案2】:

    一些异步解析的 WA 是使用 getaddrinfo_aGAI_NOWAIT 选项。

    glibc 的现有实现使用线程池来执行请求。而且,在没有getaddrinfo_a 支持的系统上实现这样的功能很简单。

    请注意,解析 mechanizm 不仅使用 DNS 服务器,它还使用 /etc/hosts(在 Windows 上:WINDIR/system32/etc/hosts)和其他来源,如 mDNS 等。可以通过/etc/nsswitch.confhosts: 部分进行配置。

    此功能由 NSS 子系统的“插件”提供,其中大部分可以通过前缀 libnss_ 找到。 DNS 解析器,AFAIK,位于libnss_dns.so(我的系统上的/usr/lib/x86_64-linux-gnu/libnss_dns.so),由glibc(Linux Mint 上的libc6 包)提供。

    因此,您应该研究插件实现以使用网络搜索操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 2010-11-11
      • 2016-06-11
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多