首先,一些背景知识:avahid 在我的嵌入式 Linux 设备上引起了我的问题(它有崩溃的错误,看起来不会很快修复)并且我只需要最少的 mDNS 功能(即足够让某人在 Mac或者 PC 可以执行“ping6 mydevicename.local。”并将该主机名解析到我的设备),所以我编写了自己的极简 mDNS 服务器(在 C 中),它基本上只监听多播 DNS 数据包并用必要的 mDNS 响应它们记录。
这主要是有效的——特别是,从 Mac 上进行上述 ping6 测试可以立即解决并且效果很好。
然而,我注意到,如果我从 Linux 机器上执行 ping6,它只能工作。尤其:
- Linux 客户端大约需要 4 秒来解析主机名
- 这 4 秒延迟发生在每个发送的 ping 数据包中……也就是说,ping6 程序不是每秒发送一个 ping,而是每 4 秒发送一个 ping。(虽然它确实得到了预期的乒乓球)
- 当我在嵌入式 Linux 设备上运行 avahid 时没有出现此问题,因此我认为该行为一定是由我的新 mDNS 服务器正在执行的不正确操作引起的。
- 发生这种情况时,我的 mDNS 服务器会从客户端获取反向 mDNS 数据包,如下调试输出所示:
[…]
RECEIVED 90 IPv6 BYTES FROM [fe80::21c:abff:fe00:a60] on s6#2 (sock=6)
--- Received IPv6 Data (90 bytes): -------------------------------------
0000: .............3.2 [00 00 00 00 00 01 00 00 00 00 00 00 01 33 01 32]
0016: .6.4.2.0.e.f.f.f [01 36 01 34 01 32 01 30 01 65 01 66 01 66 01 66]
0032: .b.2.0.6.2.0.0.0 [01 62 01 32 01 30 01 36 01 32 01 30 01 30 01 30]
0048: .0.0.0.0.0.0.0.0 [01 30 01 30 01 30 01 30 01 30 01 30 01 30 01 30]
0064: .0.0.0.8.e.f.ip6 [01 30 01 30 01 30 01 38 01 65 01 66 03 69 70 36]
0080: .arpa..... [04 61 72 70 61 00 00 0c 00 01]
HandlemDNSRequest: transID=0 flags=0 numQuestions=1 numAnswers=0 numAuthorityRRs=0 numAdditionalRRs=0
Ooh, a reverse-mDNS request for [3.2.6.4.2.0.e.f.f.f.b.2.0.6.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa] scope=3
所以我的问题是:
每次程序尝试使用我的 mDNS 服务器解析 mDNS 主机名时,什么会导致 Linux mDNS 主机名解析客户端软件(NSS-resolver?)有四秒的延迟?
响应上述 mDNS 请求的适当方式是什么?我查看了 mDNS 和 DNS 规范,但找不到任何明确的要求。我尝试让它响应通常的信息(主机名、IP 地址等),但这并没有使延迟消失。
还有什么我可能做错了吗?(除了尝试推出我自己的 mDNS 服务器——但相信我,如果我觉得有更好的选择,我不会这样做;avahid 只是没有减少芥末)