首先,有一些背景知识:avahid使我的嵌入式Linux设备出现问题(崩溃的bug看上去似乎无法在短期内得到解决),并且我只需要最少的mDNS功能(即足够使Mac上的某人可以使用)或PC可以执行“ ping6 mydevicename.local”,并将该主机名解析为我的设备),所以我编写了自己的极简主义mDNS服务器(用C语言编写),该服务器基本上只侦听多播DNS数据包,并用必要的mDNS响应它们记录。
这通常可以正常工作-特别是,从Mac进行上述ping6测试可以立即解决,并且效果很好。
但是,我注意到,如果我在Linux机顶盒上执行ping6,则只能正常工作。尤其是:
Linux客户端解析主机名大约需要4秒钟
对于发送的每个ping数据包,都会发生4秒钟的延迟……即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服务器外-相信我,如果我觉得有更好的选择,那不是我想做的;只是不切芥末而已)
最佳答案
我终于可以通过使用nTap设备和WireShark来找出问题所在,以捕获由Avahid和我自己的程序生成的mDNS流量。由于avahid不会产生此问题,因此大概是avahid生成的响应就是Linux正在寻找的响应。我更新了程序以生成类似的响应,这使5秒的延迟消失了。
特别是,avahid生成的反向mDNS响应仅包含0个查询和1个答案(主机名类型),如所附的wireshark屏幕截图所示。
关于linux - mDNS服务器应如何处理反向mDNS请求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23165071/