如果网络接口已正确设置和配置,我们就可以开始探测目标设备是否存在。请注意,Fuchsia 模拟器(包括 aemu 和 qemu)使用的发现机制与此处描述的不同,不在本文档的讨论范围内。
此示例使用 avahi 来检查 mDNS 记录。avahi 工具链与本地守护程序通信,该守护程序可能正在运行,也可能未在运行。如果未运行,avahi 命令通常会失败,并显示 Daemon not running
消息。
如果需要,只需将守护进程作为前台进程启动即可。在终端中,执行以下命令:
sudo avahi-daemon
守护程序会在遇到 mDNS 查询时将其缓存,并在完成后安全地终止。
多播 DNS 解析
设备发现使用多播 DNS (mDNS) 来确定 Fuchsia 目标的 IP 地址。
Fuchsia 目标设备会通过 mDNS 将其 IP 信息广播到服务类型为 _fuchsia._udp
的设备。您可以使用 avahi 通过以下命令查询此信息:
avahi-browse --resolve _fuchsia._udp
此命令似乎会挂起。它首先会转储 avahi 缓存中的所有记录,然后等待并监听 mDNS 广播。使用 --resolve
标志后,avahi 会尝试解析遇到的任何记录。解析会生成 Fuchsia 目标设备的 IPv6 地址。
bash$ avahi-browse --resolve _fuchsia._udp
+ zx-c863147051da IPv6 fuchsia-c863-1470-51da _fuchsia._udp local
= zx-c863147051da IPv6 fuchsia-c863-1470-51da _fuchsia._udp local
hostname = [fuchsia-c863-1470-51da.local]
address = [fe80::ca63:14ff:fe70:51db]
port = [5353]
txt = []
在此处,您可以看到系统找到了包含主机名 fuchsia-c863-1470-51da
的主机记录,随后将其解析为 fe80::ca63:14ff:fe70:51db
,即已连接的 Fuchsia 目标的地址。
mDNS 数据包检查
如果未找到任何记录,您可以查看目标是否在回复 mDNS 查询。mDNS 在端口 5353 上运行,可以使用 tcpdump
进行检查。将命令限制为必需的接口,并按 IPv6 协议和 mDNS 端口进行过滤:
sudo tcpdump -n -i zx-c863147051da "ip6 && port 5353"
您应该会看到类似于以下内容的输出,其中显示了 mDNS 查询/响应周期。
bash$ sudo tcpdump -n -i zx-c863147051da "ip6 && port 5353"
13:32:41.725007 IP 169.254.31.167.58994 > 224.0.0.251.5353:
0 PTR (QU)? _fuchsia._udp.local. (37)
13:32:41.725057 IP 169.254.31.167.58994 > 224.0.0.251.5353:
0 PTR (QU)? _fastboot._tcp.local. (38)
13:32:43.724131 IP6 fe80::ca63:14ff:fe70:51da.34810 > ff02::fb.5353:
0 PTR (QU)? _fuchsia._udp.local. (37)
13:32:43.724183 IP6 fe80::ca63:14ff:fe70:51da.34810 > ff02::fb.5353:
0 PTR (QU)? _fastboot._tcp.local. (38)
13:32:43.725635 IP6 fe80::ca63:14ff:fe70:51db.5353 > fe80::ca63:14ff:fe70:51da.34810:
0*- [0q] 1/0/3 PTR fuchsia-c863-1470-51da._fuchsia._udp.local. (152)
mDNS 防火墙/netfilter 规则
在某些情况下,可能需要检查内核的 netfilter 规则,以通过 mDNS 发现设备。如果您在运行 nft list tables
时看到类似如下内容,则可能需要调整规则。
bash$ sudo nft list tables
table ip filter
table ip nat
table inet firewalld
大多数设置应仅包含前两条规则。如需移除 firewalld
规则,可以执行以下命令:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo nft delete table inet firewalld
mDNS 流量通过 224.0.0.251
和 fe02::fb
多播地址(分别为 IPv4 和 IPv6)在端口 5353 上传输。不妨检查一下 filter
表,看看是否有任何政策应用于端口 5353 或这些地址。
bash$ sudo nft list table ip filter
table ip filter {
...
}
多播 ping
发现目标设备的 IPv6 地址的另一种方法是 ping 本地多播 ff02::1
设备地址。这是 IANA 指定的预定地址。如需了解详情,请参阅 RFC-4291 的第 2.7.1 章
ping6 ff02::1%zx-c863147051da
请注意,本地网络接口是使用 IPv6 地址的范围 ID 组件指定的,这是 ping 多播地址的要求。使用 -I
标志也能达到类似的效果。Ping 响应来自 Fuchsia 设备,并包含其 IP 地址信息。
bash$ ping6 ff02::1%zx-c863147051da
PING ff02::1%zx-c863147051da (ff02::1%zx-c863147051da) 56 data bytes
64 bytes from fe80::ca63:14ff:fe70:51da%zx-c863147051da: icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from fe80::ca63:14ff:fe70:51db%zx-c863147051da: icmp_seq=1 ttl=64 time=0.958 ms
请注意,本地主机本身可能会回复多播 ping。其中,fe80::ca63:14ff:fe70:51da
是主机端接口的地址(如上所述),fe80::ca63:14ff:fe70:51db
是 Fuchsia 目标设备的地址。
一个简单的经验法则是,响应时间远低于 1 毫秒的设备通常是 localhost,而响应时间接近或超过 1 毫秒的设备很可能是 Fuchsia 目标设备。