我正在使用 Fedora 18 和 avahi 命令行工具(版本 0.6.31)
我使用 avahi-resolve-host-name 来发现我的子网上的设备的 IP 地址,以便在开发过程中进行测试。 我使用 Wireshark 监视请求和响应。 一次成功请求和响应后,Wireshark 上不再显示进一步的请求,但该工具仍返回 IP 地址。 计算机/avahi 守护进程/其他东西是否有可能“缓存”结果?
问题:我希望在每次调用 avahi-resolve-host-name 时发送请求数据包。 这可能吗?
原因:可以这么说,我收到了“误报”。 我尝试解析“test1.local”,并且获得了结果 IP,但该设备不再位于该 IP 上。 我希望每次都发送请求,这样我就可以避免看到设备的 IP 地址不正确。
我发现我回答你的问题有点晚了,但我会留下一个通用答案,以防其他人偶然发现这个问题。
我的答案是基于avahi-0.6.32_rc。
计算机/avahi 守护进程/其他东西是否有可能“缓存”结果?
是的,avahi-daemon 正在缓存查找结果。虽然这似乎没有在功能中明确列出,但
avahi-daemon(8)
手册页提示了这一点:
守护进程[...]为本地程序提供两个 IPC API,以利用 avahi-daemon 维护的 mDNS 记录缓存。
我希望在每次调用 avahi-resolve-host-name 时发送请求数据包。这可能吗?
是的,确实如此。相关选项是
cache-entries-max
(来自avahi-daemon.conf(5)
):
采用无符号整数,指定每个接口缓存的资源记录数。较大的值允许 mDNS 在大型 LAN 中正常工作,但也会增加内存消耗。cache-entries-max=
要达到想要的效果,只需简单设置:
cache-entries-max=0
这将完全禁用缓存并强制 avahi-daemon 在每个请求上重新发出 MDNS 数据包,从而使您可以监控它们。
但是,我应该在这里指出,这也会使 avahi 对于正常使用来说几乎毫无用处。虽然 avahi-daemon 将发出查找数据包,但它将无法存储结果,并且每次调用
avahi-resolve-host-name
(以及其他命令行工具、nss-mdns、D-Bus API...)都会失败。
我自己偶然发现了这个问题,并找到了不需要更改配置的解决方案。看来只要杀死守护进程(
avahi-daemon --kill
)就会刷新缓存。我使用的是 Ubuntu 18.04,守护进程会自动重新启动。如果在其他发行版上它被杀死后没有运行,可以使用 avahi-daemon --daemonize
重新启动它。
请注意,需要 root 才能杀死 avahi 守护进程,因此在某些情况下这可能不是最佳选择。
刚刚偶然发现了这个老问题,遇到了同样的问题(一台机器被分配了一个新的IP地址,即使重新启动该机器后我也无法再通过
mymachine.local
连接 - 我的系统总是会尝试使用旧的IP地址)
这是我最后发现的:
出于性能原因,名称(主机名、用户名等)通常由
nscd
(名称服务缓存守护进程)服务进行缓存。
幸运的是,
nscd
提供了一个invalidate
命令,它可以刷新给定类型名称的缓存。
例如
$ ping mymachine.local
PING mymachine.local (192.168.1.234) 56(84) bytes of data.
^C
--- lists.local ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 0ms
$ sudo nscd -i hosts
$ ping mymachine.local
PING lists.local (192.168.1.27) 56(84) bytes of data.
64 bytes from 192.168.1.27: icmp_seq=1 ttl=64 time=0.621 ms
64 bytes from 192.168.1.27: icmp_seq=2 ttl=64 time=0.590 ms
^C
--- lists.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.590/0.605/0.621/0.015 ms