我在 DreamPlug(运行 Ubuntu Jaunty 的插件计算机)上使用 Avahi 时遇到了以下非常奇怪的问题。
经过几天的努力,我思考我已设法缩小问题范围。
DreamPlug 充当 WiFi 接入点,具有主机名plug
和 IP 地址(在和192.168.1.1
中设置)并运行 lighttpd。/etc/hosts
/etc/hostname
现在我的 Mac 可以直接http://plug.local
在 Chrome 中访问,但如果我尝试在 iPad 上加载http://plug.local
,它就不起作用。也就是说,它不起作用直到我在桌面上加载该页面。
由于某种原因,iPad 永远无法解析主机名,直到主机名首先在 Mac 上解析...这很奇怪,因为除了连接到同一个接入点(DreamPlug)之外,iPad 和 Mac 之间没有任何连接。
因此,再次澄清一下:iPad 上的 Safari 在访问时会挂起(直到它报告浏览失败),http://plug.local
除非我http://plug.local
在 Mac 上访问、运行ping plug.local
、执行或基本上执行ssh [email protected]
任何事物否则,将解析主机名,此时 iPad 会立即解析主机名并开始正常工作。
如果我的理解正确,当 iPad 连接时,它们会广播分辨率请求plug.local
。无论出于何种原因,DreamPlug 都会忽略此请求(或永远不会收到)。但是,Mac做设法广播其请求。它广播解析请求,DreamPlug 广播回结果plug.local
-> 192.168.1.1
。然后 iPad 接收这结果(实际上是为 Mac 准备的)然后能够成功解析。
我很乐意avahi-daemon.conf
根据要求提供我的或其他的配置文件。
更新:我现在已经设法使用 Wireshark 并发现 iPad 确实向网络广播了请求。
我捕获了导致 Avahi 响应的数据包和没有导致 Avahi 响应的数据包。
它们看起来完全相同,唯一的区别是失败的那个指定了额外的 RR 类型OPT
...我不知道OPT
记录是什么。可能是因为某种原因 Avahi 不喜欢OPT
附加 RR 的 DNS 查询?
以下是从 Wireshark 截取的两张截图。第一张显示了从台式计算机(在本例中,设备名为runway.local
)发送的“良好”mDNS 请求。此查询运行正常,服务器(位于192.168.1.1
)立即响应:
以下是从 返回的响应示例runway.local
:
同时,这是从 iPad 发送的针对同一主机名的第二个 DNS 查询。runway.local
在这种情况下,请求似乎被忽略了(无论如何,此 DNS 查询从未收到任何响应):
尝试追踪 iPad 请求中导致问题的原因,看起来两个数据包几乎相同,从桌面(运行 OS X)和 iPad 发送的 mDNS 查询之间的唯一区别是 iPad 在OPT
DNS 请求的底部附加了一条资源记录。
问题是:资源记录的意义是什么——是这个——还是其他什么——导致该 DNS 请求被 Avahi 忽略。
更新这可能是我一直在寻找的突破:
我一直在使用 --debug 标志运行 avahi-daemon,并且注意到很多“无效查询包。”消息。这让我找到了这个页面:http://avahi.org/ticket/284这似乎是一个已知问题(尽管应该得到解决)。
具体来说:
tcpdump 让我相信这是由于 Mac OS 10.6 使用 RFC2671 在 DNS 查询的附加数据部分中添加信息造成的。具体来说,它提供“UDP 有效负载大小”(在我的情况下为 1440)作为响应数据包最大大小的提示。[...] Avahi 认为具有非空附加数据部分的查询无效,它会在生成无效查询数据包消息之前检查 AVAHI_DNS_FIELD_ARCOUNT != 0。
答案1
我并不经常访问 SF,但我可以看到这个问题已经引起了相当多的关注,所以让我在这里总结一下我的发现,并希望能为遇到同样问题的人提供一些解决方案:-
这似乎是 Ubuntu Jaunty 附带的 Avahi 版本的一个错误(http://avahi.org/ticket/284) 与提供 UDP 有效负载大小有关,可能是 mDNS 规范最近更改的结果(尽管我自己还没有读过)。正如我在原始问题的评论中所解释的那样,我确实尝试升级我的 Avahi 版本,但我的 Linux 技能还不够好,我没能让它工作。(无论如何,运行 3 年前不受支持的操作系统真的不推荐……)
最后,我决定冒险一试,清除了 DreamPlug 的 SD 卡,并在其上安装了 Debian Squeeze,运行良好(尽管仅适用于 iOS 5.0+)。关于如何更改 DreamPlug 操作系统的讨论超出了本问题的范围,但归根结底,问题在于 Avahi 版本过时了。使用较新的版本,您应该没问题!
祝你好运!