fix(client): 看门狗+延迟统一到数据面 IP TCP 探测 + 消费服务端 down 信号
修复:数据面挂了客户端无感。原看门狗探 generate_204,会被分流判 direct 走本地 出网假阳性,永不触发。改为三路融合判活,针对「实际所连节点」(_connectedNode, 非会随 ping 漂移的 effectiveNode): ① 客户端→数据口 TCP 握手(节点 host:443,TUN 内必 direct→直奔真实节点,不被分流糊弄); ② 延迟同源:①的 RTT 回填连接页延迟(ConnectionState.livePingMs),挂了掉成 —; ③ 服务端权威:刷 /v1/nodes,所连节点被判 down(dp_healthy=0/agent掉线/运维下线)即处理。 看门狗即时首测 + 周期 15s;连续 3 次握不上 / 服务端 down → 智能切节点 / 手动告警断开。 连接页延迟改读 livePingMs(删除内核 urltest 取数)。补信号③测试。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -2,7 +2,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../bridge/vpn_bridge.dart';
|
||||
import '../core/responsive/form_factor.dart';
|
||||
import '../util/format.dart';
|
||||
import '../l10n/app_text.dart';
|
||||
@@ -41,9 +40,9 @@ class ConnectPage extends ConsumerWidget {
|
||||
}
|
||||
final down = formatSpeed(stats?.downloadSpeed);
|
||||
final up = formatSpeed(stats?.uploadSpeed);
|
||||
// 延迟来源:连接后优先用内核 urltest 实测(代理真实 RTT);urltest 还没探过时
|
||||
// 回退用节点页的 TCP 探针 ping,尽量不显示 —。都没有才 —。
|
||||
var livePing = conn.phase == VpnPhase.on ? _bestUrltest(stats) : node.ping;
|
||||
// 延迟来源:连接后用看门狗对数据面 IP(节点 host:443)的 TCP 握手 RTT(与判活同源,
|
||||
// 见 connection_provider);首测前/不可达回退节点页 TCP 探针 ping。都没有才 —。
|
||||
var livePing = conn.phase == VpnPhase.on ? (conn.livePingMs ?? 0) : node.ping;
|
||||
if (livePing <= 0) livePing = node.ping;
|
||||
final pingLabel = livePing > 0 ? '${livePing}ms' : '—';
|
||||
final latencyValue = livePing > 0 ? '$livePing' : '—';
|
||||
@@ -208,13 +207,6 @@ class ConnectPage extends ConsumerWidget {
|
||||
}
|
||||
}
|
||||
|
||||
/// 内核 urltest 各出站中的最小正延迟(ms);无则 0。
|
||||
int _bestUrltest(VpnStatsEvent? s) {
|
||||
if (s == null) return 0;
|
||||
final ds = s.urltestResults.where((r) => r.delayMs > 0).map((r) => r.delayMs);
|
||||
return ds.isEmpty ? 0 : ds.reduce((a, b) => a < b ? a : b);
|
||||
}
|
||||
|
||||
/// 实时速率行(连接成功时显示;来自内核 statsStream 实时数据)。
|
||||
class _SpeedRow extends StatelessWidget {
|
||||
const _SpeedRow({required this.t, required this.down, required this.up, required this.latency});
|
||||
|
||||
Reference in New Issue
Block a user