两个上下行数字来自不同源、统计的是不同范围——连接页含直连,统计页只算代理
| 维度 | 连接页 · 实时上下行 | 统计页 · 累计用量 |
|---|---|---|
| 取数源 | 客户端内核 Clash APIGET /traffic(SSE 推 {up,down} bytes/s)+ GET /connections(downloadTotal/uploadTotal 差分算瞬时速率) |
服务端 GET /v1/usage ← 节点 sing-box v2ray_api StatsService 的 per-user 计数器 |
| 计数粒度 | sing-box 引擎全局总量(不分出站,所有连接合计) | 每用户独立计数器 user>>>{dp_uuid}>>>traffic>>>uplink|downlink |
| 测量位置 | 客户端本机(TUN 入口处的总吞吐) | 节点上(只有流量真正到达节点才被计) |
| 含直连流量? | 含 ✅ | 不含 ❌ |
| 语义 | "这台设备此刻的总网速"(代理 + 直连) | "通过节点代理出去、计费口径的用量" |
全局 TUN 模式下,客户端 sing-box 按路由规则把流量分成两类:
所以服务端记账(统计页)物理上只能看到代理流量。直连那部分对节点是不可见的。
保持现状,不改连接页口径。连接页继续显示"总吞吐"语义(含直连)——与多数客户端一致;统计页继续"仅代理"。两者口径差异由本文档说明,不视为缺陷。
proxy 出站的连接字节——/connections 每条连接带 chains/outbound 信息可分类求和;全局 SSE /traffic 给不了出站维度,需改用 /connections 轮询差分。当前未做。
client/lib/screens/connect_page.dart(stats.downloadSpeed/uploadSpeed)← client/lib/bridge/kernel_process.dart(/traffic、/connections)client/lib/screens/stats_page.dart ← GET /v1/usage(server/internal/usage/*)← agent 读 v2ray_api(server/internal/agentd/render.go · parseUserStat)