流量记账口径 · 连接页实时 vs 统计页累计

两个上下行数字来自不同源、统计的是不同范围——连接页含直连,统计页只算代理

一句话:客户端有两处"上传/下载"数字,口径不同、天然对不上连接页实时速率来自本地内核的全局吞吐,含直连统计页累计用量来自服务端按用户的节点计数,只含真正经过节点的代理流量。两者差额 = 直连流量(国内站 / 分流 direct / LAN)。这是设计使然,非 bug:计费/配额按代理流量算。

两个数据源

维度连接页 · 实时上下行统计页 · 累计用量
取数源 客户端内核 Clash API
GET /traffic(SSE 推 {up,down} bytes/s)+ GET /connectionsdownloadTotal/uploadTotal 差分算瞬时速率)
服务端 GET /v1/usage ← 节点 sing-box v2ray_api StatsService 的 per-user 计数器
计数粒度 sing-box 引擎全局总量(不分出站,所有连接合计) 每用户独立计数器 user>>>{dp_uuid}>>>traffic>>>uplink|downlink
测量位置 客户端本机(TUN 入口处的总吞吐) 节点上(只有流量真正到达节点才被计)
含直连流量? 含 ✅ 不含 ❌
语义 "这台设备此刻的总网速"(代理 + 直连) "通过节点代理出去、计费口径的用量"

为什么统计页不含直连

全局 TUN 模式下,客户端 sing-box 按路由规则把流量分成两类:

所以服务端记账(统计页)物理上只能看到代理流量。直连那部分对节点是不可见的。

结论与含义

现状决策(2026-06-29)

保持现状,不改连接页口径。连接页继续显示"总吞吐"语义(含直连)——与多数客户端一致;统计页继续"仅代理"。两者口径差异由本文档说明,不视为缺陷。

若未来要让两者口径一致:连接页可改为仅累加走 proxy 出站的连接字节——/connections 每条连接带 chains/outbound 信息可分类求和;全局 SSE /traffic 给不了出站维度,需改用 /connections 轮询差分。当前未做。

相关代码 / 文档