获取地址信息很糟糕。其他一切都更糟

主要观点:DNS 是互联网和现代网络的关键组成部分,Firefox 长期以来通过getaddrinfo解析 DNS 域,其在多个操作系统上有相同签名和大致相同的工作方式,但存在一些缺陷,如同步、功能有限、不暴露原始 DNS 细节、存在实现 bug 等。Firefox 有专门的线程池用于 DNS 解析,为解决getaddrinfo的问题,还使用了DnsQuery_A等 API,后来实现了 RFC8484 的 DNS over HTTPS,能获取更多 DNS 信息。不同操作系统有不同的用于解析 HTTPS 记录的 API,如 Linux 的res_nquery、Android 的res_queryandroid_res_nquery、Windows 的DNSQuery_A、MacOS 的res_queryDNSServiceQueryRecord,这些 API 各有优缺点。

关键信息

  • getaddrinfo在多个操作系统上的情况及相关 RFC 更新。
  • Firefox 中nsHostResolver的线程池及 DNS 解析方式。
  • 不同操作系统用于解析 HTTPS 记录的 API 及其特点和问题。
  • 实现 RFC8484 的 DNS over HTTPS 及获取的额外信息。

重要细节

  • getaddrinfo同步 API 会阻塞调用线程,需单独线程或多线程处理 DNS 解析。
  • 它功能有限,无法获取 TTL 等信息,也不暴露特定 DNS 错误细节。
  • Android 上res_query存在问题,android_res_nquery在 Android 10 及以上可用,需动态链接等。
  • Windows 的DNSQuery_A在 Windows 10 解析 HTTPS 记录时存在崩溃问题,在 Windows 11 正常。
  • MacOS 的res_query线程不安全,DNSServiceQueryRecord在响应无记录时会挂起。
  • 推荐自己实现 TCP/UDP 解析器或使用现有实现,注意各 API 的问题并记录角落情况。
  • 希望有类似DnsQuery_A且能获取 DNS 响应缓冲区等功能的通用库。

总结:DNS 相关技术在不同操作系统上存在差异和问题,各 API 各有优缺点,未来希望有通用的良好 API。

阅读 10
0 条评论