主要观点:DNS 是互联网和现代网络的关键组成部分,Firefox 长期以来通过getaddrinfo
解析 DNS 域,其在多个操作系统上有相同签名和大致相同的工作方式,但存在一些缺陷,如同步、功能有限、不暴露原始 DNS 细节、存在实现 bug 等。Firefox 有专门的线程池用于 DNS 解析,为解决getaddrinfo
的问题,还使用了DnsQuery_A
等 API,后来实现了 RFC8484 的 DNS over HTTPS,能获取更多 DNS 信息。不同操作系统有不同的用于解析 HTTPS 记录的 API,如 Linux 的res_nquery
、Android 的res_query
和android_res_nquery
、Windows 的DNSQuery_A
、MacOS 的res_query
和DNSServiceQueryRecord
,这些 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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。