我想问一个关于 mDNS 的问题。
我正在尝试创建一个 Linux 进程,当设备加入 Linux AP 时,它可以发现来自其他设备的某些服务(例如 _airplay._tcp.、_raop._tcp)。
我可以通过 mDNS 获取通知,并使用命令dns-sd
,
dns-sd -B _xxxx._tcp
我可以看到:
Browsing for _xxx._tcp
Timestamp A/R Flags if Domain Service Type Instance Name
18:06:15.281 Add 3 8 local. _xxxx._tcp. xxxx_name
但是,当我将设备移出 WiFi 范围时,我无法通过 mDNS 获取已移除通知,并且dns-sd
命令中看不到任何已移除事件。我想知道在这种情况下 mDNS 是否无法知道设备已被移除?
或者也许 mDNS 可以通过网络接口的改变来知道设备被移除了?我无法获取移除事件,是不是因为我的 Linux 网络配置错误?
答案1
是的,mDNS 无法知道设备已与网络断开连接。不在网络上的设备无法说它不再在网络上,并且 mDNS 中没有设备或服务注册的中央注册表——它完全明确地设计为分散式。您可以通过将 mDNS 记录 TTL 设置为相当低来权衡网络流量和查询延迟的准确性,但您无法完全解决问题。
鉴于使用常规 DNS(和动态更新)也会出现同样的问题,或者实际上任何服务发现系统,解决你遇到的任何问题实际上试图解决的问题是“不要依赖服务发现数据是最新的,因为它通常不会是最新的”。这意味着您要自己检查服务是否“活跃”,正确处理各种错误(包括使用合理的低连接超时),并且通常假设 SD 数据充其量只是正确方向的一个模糊提示,而不是某种绝对保证,即某个特定服务在任何给定时刻都可以供您使用。