gitbobobo/StreamMusic

APP 首次启动时连接时连接失败

Opened this issue · 4 comments

Describe the bug (BUG 描述,多条问题请分别建立 issue)
APP 启动时,提示主线路连接失败,需退出 APP 并重新进入时方可成功。

To Reproduce (复现步骤,复现问题是处理问题的必要条件)
Steps to reproduce the behavior:

  1. 在 NAS 的公网 IP 更新后进入 APP
  2. 提示主线路连接失败
  3. 杀掉 APP 进程,重新进入
  4. 主线路连接正常

Expected behavior (期望行为)
在 NAS 线路正常的条件下,每次进入 APP 均能够正确连接。

Screenshots (截图)

Platform and Device Info (操作系统及设备信息)

  • OS: Android 14(Xiaomi HyperOS 1.0.41)

Music Server Type (音乐服务器类型)
Navidrome 0.53.2

  • Direct Mode(直连模式)
  • Library Mode(媒体库模式)

Additional context (额外信息)
推测可能的原因有二:

  1. 家宽的公网 IP 每天通过 DDNS 动态更新,若系统设置的 DNS 服务器的缓存并未随之更新,则可能在家宽的公网 IP 更新后返回其缓存中过期的 IP 地址,造成连接失败。这一原因在很多 APP 中都存在;
  2. APP 可能默认经由 IPv4 连接,而音乐服务器域名并未设置 A 记录而是仅设置了 AAAA 记录。目前家宽很难拿到公网 IPv4,在可预见的未来公网 IPv6 将成为主流。

建议的服务器连接流程如下:

  1. 内置 DNS 服务器配置,首先尝试解析 AAAA 并通过 IPv6 访问。若无 AAAA 记录,则直接放弃 IPv6 连接,改为 IPv4 连接;
  2. 若解析到 IPv6 地址,尝试若干次。若失败,等待若干时间后重新解析 AAAA 记录;
  3. 尝试使用新的解析记录重新连接。若连接失败,放弃 IPv6 连接,改为 IPv4 连接。

我这里没有动态IP的环境,无法复现你的这个问题。

一个音乐播放器要配置 DNS 服务器,感觉很奇怪,所以不会去做。

如果第一次无法连接,而杀掉 APP 重进可以连接,那你可以尝试在连接失败后在首页下拉刷新,这样会重新触发连接服务器的动作,或是等待每30秒一次的自动连接

疑问,你是每次 NAS 的公网 IP 更新后进入 APP 都会触发这个bug吗?

其次,我是动态ipv4公网,也是通过ddns动态更新的,暂时没有遇到这个问题。

另外,在 NAS 的公网 IP 更新后进入 APP 这个是公网ip更新后大概多久进的app呢?也许我可以尝试复现一下,但是一般动态公网更新是不是都是在半夜了(仅从我个人收到ip更新的邮件时间来看)?

还有,我感觉你的推测不是很靠谱。若系统设置的 DNS 服务器的缓存并未随之更新,则可能在家宽的公网 IP 更新后返回其缓存中过期的 IP 地址 ,如果系统设置的DNS服务器的缓存没有更新,不太可能就在你重启APP这么短的时间内刚好更新了吧(除非公网ip刚刚更新)?至于推测二,如果这个推测成立,我觉得他不会因为重启APP而修复,而是应该每次打开APP都失败。

最后,如果感觉是DNS服务器的问题,一般的做法不应该是修改系统中配置的DNS服务器地址吗?

疑问,你是每次 NAS 的公网 IP 更新后进入 APP 都会触发这个bug吗?

其次,我是动态ipv4公网,也是通过ddns动态更新的,暂时没有遇到这个问题。

另外,在 NAS 的公网 IP 更新后进入 APP 这个是公网ip更新后大概多久进的app呢?也许我可以尝试复现一下,但是一般动态公网更新是不是都是在半夜了(仅从我个人收到ip更新的邮件时间来看)?

还有,我感觉你的推测不是很靠谱。若系统设置的 DNS 服务器的缓存并未随之更新,则可能在家宽的公网 IP 更新后返回其缓存中过期的 IP 地址 ,如果系统设置的DNS服务器的缓存没有更新,不太可能就在你重启APP这么短的时间内刚好更新了吧(除非公网ip刚刚更新)?至于推测二,如果这个推测成立,我觉得他不会因为重启APP而修复,而是应该每次打开APP都失败。

最后,如果感觉是DNS服务器的问题,一般的做法不应该是修改系统中配置的DNS服务器地址吗?

  1. 每次都会触发,因为还有其它服务也是在这个域名上并且基于浏览器访问,这个问题就非常明显,必须切出去一次
  2. 可能纯 IPv6 涉及到 IPv6 不通时存在双栈优先问题,纯 IPv6 且 IPv6 不通时客户端认为服务器不可用的问题。小米 Android 的 IPv6 实现本来也有各种问题,所以也不能完全下结论是 DDNS 的问题
  3. 一般是更新 IP 后首次请求该地址时触发,DDNS 在每日早 6 时重新拨号时更新,首次请求大致是更新后 1 小时。因为手里的家宽更新周期是 2015 分钟左右,长期来看等待 IP 自动更新很影响体验
  4. 有的 DNS 服务器为了保证及时响应,会在下游请求的时候返回一个 TTL 非常短(例如 1s)的过期缓存记录,之后 DNS 服务器自行从上游更新缓存。下游第二次请求时该记录已在其本地超期,重新请求并更新记录后访问即恢复正常。Dart 的 Dial 机制不太清楚,如果 Addr 未及时更新无论如何重试也不会连接成功
    考虑到 DNS 服务器的负载,自身更新缓存的过程没有下游请求一般是不会触发的。而且 DDNS 的域名很可能就只有一个人用,自然不会有其他触发更新的情况。这实际上是一种比较合理的逻辑,因为某些 DNS 代理程序就是这么实现的
  5. 局域网里一般会把这类域名的流量通过防火墙强制转发到目标主机,不存在此类问题;而移动网络环境个人一般不会主动修改运营商下发的 DNS;大厂的公共 DNS 体验也逐渐下降,基本不再考虑在移动端配置

疑问,你是每次 NAS 的公网 IP 更新后进入 APP 都会触发这个bug吗?
其次,我是动态ipv4公网,也是通过ddns动态更新的,暂时没有遇到这个问题。
另外,在 NAS 的公网 IP 更新后进入 APP 这个是公网ip更新后大概多久进的app呢?也许我可以尝试复现一下,但是一般动态公网更新是不是都是在半夜了(仅从我个人收到ip更新的邮件时间来看)?
还有,我感觉你的推测不是很靠谱。若系统设置的 DNS 服务器的缓存并未随之更新,则可能在家宽的公网 IP 更新后返回其缓存中过期的 IP 地址 ,如果系统设置的DNS服务器的缓存没有更新,不太可能就在你重启APP这么短的时间内刚好更新了吧(除非公网ip刚刚更新)?至于推测二,如果这个推测成立,我觉得他不会因为重启APP而修复,而是应该每次打开APP都失败。
最后,如果感觉是DNS服务器的问题,一般的做法不应该是修改系统中配置的DNS服务器地址吗?

  1. 每次都会触发,因为还有其它服务也是在这个域名上并且基于浏览器访问,这个问题就非常明显,必须切出去一次
  2. 可能纯 IPv6 涉及到 IPv6 不通时存在双栈优先问题,纯 IPv6 且 IPv6 不通时客户端认为服务器不可用的问题。小米 Android 的 IPv6 实现本来也有各种问题,所以也不能完全下结论是 DDNS 的问题
  3. 一般是更新 IP 后首次请求该地址时触发,DDNS 在每日早 6 时重新拨号时更新,首次请求大致是更新后 1 小时。因为手里的家宽更新周期是 2015 分钟左右,长期来看等待 IP 自动更新很影响体验
  4. 有的 DNS 服务器为了保证及时响应,会在下游请求的时候返回一个 TTL 非常短(例如 1s)的过期缓存记录,之后 DNS 服务器自行从上游更新缓存。下游第二次请求时该记录已在其本地超期,重新请求并更新记录后访问即恢复正常。Dart 的 Dial 机制不太清楚,如果 Addr 未及时更新无论如何重试也不会连接成功
    考虑到 DNS 服务器的负载,自身更新缓存的过程没有下游请求一般是不会触发的。而且 DDNS 的域名很可能就只有一个人用,自然不会有其他触发更新的情况。这实际上是一种比较合理的逻辑,因为某些 DNS 代理程序就是这么实现的
  5. 局域网里一般会把这类域名的流量通过防火墙强制转发到目标主机,不存在此类问题;而移动网络环境个人一般不会主动修改运营商下发的 DNS;大厂的公共 DNS 体验也逐渐下降,基本不再考虑在移动端配置

你是使用ddns服务提供商提供的域名吗,如果是这样的话,我的情况就跟你不太一样了,我是在阿里云上面买的域名,然后本地跑了一个更新域名对应ip的服务来实现ddns的。
关于第四点,这个知识我之前是没有了解过的,感谢分享。不过我有一个想法,如果怀疑是DNS服务器没有更新的话,是不是可以在第二天(DDNS更新后)先用手机使用移动网络(结合第五点)通过浏览器访问同域名的服务,当浏览器访问成功后,在打开音流APP,如果此时还会触发这个bug,那还是跟DNS服务器无关(浏览器能通保证域名对应的ip肯定更新了),如果这个bug消失了,那可以建议作者加上重连机制(如果已有重连机制的话,猜测可能没有重新获取ip地址,还是用上次的ip)。