全局发现与本地发现:设备如何在没有账号的情况下找到彼此
问题背景
没有账号体系,也没有「好友列表」存着对方的地址——设备 ID 只是身份,不是位置。程序靠两套发现机制把 ID 解析成可连接的地址。
本地发现(默认开启)
- 每 30 秒向局域网发送广播(IPv4)与组播(IPv6)包;
- 内容:设备 ID + 监听端口;
- 作用范围:同一二层网络。同网段设备听到广播即可直接连接,这是局域网内零配置的原因。
本地发现报文是明文的:同一局域网的旁观者能知道「这些机器在跑它、ID 是什么」。内容无暴露,但存在感有。
全局发现(默认开启)
- 每 30 分钟向官方全局发现服务器登记一次(设备 ID ↔ 外部 IP:端口的映射);
- 设备要跨互联网连接另一台时,先拿对方 ID 去服务器查询地址;
- 查询连接本身走 TLS 且校验服务器证书,查询内容对外不可见。
隐私含义(官方安全页明确列出):发现服务器运营者可以把任意设备 ID 映射到 IP、推断哪些设备在互联;互联网上的窃听者能推断出哪些机器开启了全局发现。设备 ID 本来就可以公开(见[设备 ID(../03-设备配对/01-device-id.md)),所以这条暴露通常可接受;介意者在设置里关掉。
关掉发现之后
两个都关,动态发现的连接就找不到了。替代方案是静态地址:设备编辑 → Advanced → Addresses,写明对方地址:
tcp://192.168.1.50:22000, dynamic
逗号分隔可写多条:静态地址保证可达,dynamic 保留自动发现作为补充。NAS、服务器这类地址稳定的设备用静态写法最省事。
与直连失败的关系
发现只解决「找到地址」,地址可达还要过 NAT 与防火墙。找到对方却连不上时,回到[设备连不上怎么办(../03-设备配对/05-pairing-failed.md)的排查链。