3.2 KiB
Executable File
3.2 KiB
Executable File
SingBox 节点超时问题分析
🔍 问题分析
核心问题
从日志分析发现,SingBox 的 URL 测试功能正在工作,但是测试失败,导致所有节点显示超时(delay=65535)。
关键日志证据
flutter: 👻 16:40:26.497617 INFO SingBox - 📡 收到活动组更新,数量: 2
flutter: 👻 16:40:26.497808 INFO KRLogUtil - 处理活动组: [SingboxOutboundGroup(tag: select, type: ProxyType.selector, selected: auto, items: [SingboxOutboundGroupItem(tag: auto, type: ProxyType.urltest, urlTestDelay: 65535)]), SingboxOutboundGroup(tag: auto, type: ProxyType.urltest, selected: 香港, items: [SingboxOutboundGroupItem(tag: 香港, type: ProxyType.trojan, urlTestDelay: 65535)])]
延迟值从 0 变成了 65535,说明:
- ✅ SingBox 的 URL 测试功能正在工作
- ❌ 但是测试失败了,返回超时值
65535
问题原因
SingBox 无法通过代理访问测试 URL http://connectivitycheck.gstatic.com/generate_204
这是一个经典的"鸡生蛋,蛋生鸡"问题:
- SingBox 需要通过代理测试节点延迟
- 但是代理本身可能无法访问外部测试 URL
- 导致所有节点测试失败,显示超时
🛠️ 解决方案
1. 修改测试 URL
已将测试 URL 从 http://connectivitycheck.gstatic.com/generate_204 改为 http://www.gstatic.com/generate_204
2. 添加备用测试方法
kr_manualUrlTest()- 手动触发 SingBox URL 测试kr_forceDirectTest()- 强制使用直接连接测试(绕过 SingBox URL 测试)
3. 可能的其他解决方案
A. 使用本地测试 URL
"connection-test-url": "http://127.0.0.1:8080/test"
B. 禁用 URL 测试
"url-test-interval": 0 // 禁用自动测试
C. 使用直接连接测试
在应用层面实现延迟测试,不依赖 SingBox 的 URL 测试功能。
🧪 测试步骤
1. 测试新的 URL
curl -I "http://www.gstatic.com/generate_204"
2. 手动触发测试
在应用中调用:
await homeController.kr_manualUrlTest();
3. 使用直接连接测试
await homeController.kr_forceDirectTest();
📊 预期结果
如果问题解决,应该看到:
└─ 节点[0]: tag=auto, type=ProxyType.urltest, delay=150
└─ 节点[0]: tag=香港, type=ProxyType.trojan, delay=200
延迟值应该是实际的毫秒数,而不是 0 或 65535。
🔧 下一步调试
- 重新运行应用,观察新的测试 URL 是否有效
- 如果仍然超时,尝试使用直接连接测试
- 考虑禁用 SingBox 的 URL 测试,完全依赖应用层面的延迟测试
📝 关键文件
lib/app/services/singbox_imp/kr_sing_box_imp.dart- SingBox 配置lib/app/modules/kr_home/controllers/kr_home_controller.dart- 延迟测试逻辑lib/app/modules/kr_home/controllers/kr_home_controller.dart- 直接连接测试
💡 根本解决方案
最佳解决方案是使用应用层面的直接连接测试,而不是依赖 SingBox 的 URL 测试功能。这样可以:
- 避免代理环境下的测试问题
- 提供更准确的延迟测量
- 更好的用户体验
- 更稳定的测试结果