旅行一个月后收到流量提醒,这个问题就来了:是 VPN 吃掉了套餐吗?隧道确实会增加字节,因为每个数据包都会多一层外层报头,连接本身也要携带自己的控制流量。但隧道不会把你下载的文件变成两倍,也不会让运营商停止计费。诚实的答案分两半:一半讲额外开销,一半讲这些数字是怎么产生的。

误解:VPN 让流量成倍增长

流行的说法是隧道会让流量大约翻倍,于是套餐消耗快一倍。那需要额外开销接近有效载荷本身的大小,只有极小的数据包和话多的协议才会如此。日常浏览和流媒体中,多出来的字节只占很小一部分,一个月提前用完也很少是隧道造成的。不稳定的隧道是另一回事,真正的成倍增长就藏在那里。

运营商计的是外层连接,不管里面装的是什么,所以隧道不可能让流量免费。它也无法向运营商隐藏用量,因为搬运流量的正是运营商。

真正增加字节的是什么

封装会给每个数据包套上新的报头,认证还会加上自己的字段,具体代价取决于协议和所用的地址族。小包最吃亏,因为固定报头在小总量里占比更高。持续的大包传输按比例付得更少,所以同一个 VPN 上的两个人可能看到完全不同的百分比。数据包大小和 MTU 决定了路径上有多少花在报头而不是内容上。

保活包和握手会带来只为维持隧道而存在的流量,在一切正常时可以忽略不计。链路不稳时它们就变成真实成本,因为每次重连都要重做建立过程,每条断掉的流都会让应用重试。重试才是最贵的部分:一次从零开始的上传,可能比一周的保活包还费。

应用发送的也不只是文件内容。请求、确认和协议寒暄在隧道之前就存在,现在照样计入,所以有无隧道的差别是那层包装,而不是整段对话。包装才是 VPN 真正拥有的部分。

为什么两个计数器永远对不上

有四个地方会报告用量:手机、VPN 应用、路由器和运营商,每个都在不同的时间窗口里统计不同的接口。虚拟接口的计数器看到的是内层流量,物理接口看到的是外层数据包,两者之差大致就是你想要测量的额外开销。有些归因视图还会重叠,也就是说把每个显示的数字都加起来,可能把同一批字节算了两遍。计费周期、应用会话和系统重启的起点也各不相同。

在 Android 上,这件事的受支持视图是 NetworkStatsManager,它按接口和按 uid 报告时间窗口内的分桶数据。凡是涉及钱的事,请更相信运营商的对账,而不是某个应用会话的总量。应用只是便利视图,可能根据实现方式包含或排除流量;而报告延迟会让后一次读数看起来出错,其实什么都没变。

adb shell dumpsys netstats | grep -A3 "iface=wlan0"
adb shell dumpsys netstats detail | grep -i vpn

比较之前,先读懂每一行里的接口名称。两个不同接口的总量不是对同一件事的两次测量,把它们当成一个,得出的额外开销其实是记账差异。

用一个可重复的任务来测,而不是跑测速

选一个计数器、一台设备、一个网络和一个任务,然后重复该任务并比较读数。测速是错的工具,因为它会刻意尽量多消耗,其成本可能超过你正在排查的日常问题。先暂停备份和更新,等后台活动安静下来,再把协议和客户端版本记在数字旁边。续传的上传和干净传输是两种不同的工作负载,比较它们测不出任何有用的东西。

如果直接对比与你的隐私要求冲突,那就改为对比两种受支持的 VPN 配置,并把这一限制写在结果旁边。记录哪种配置给出了哪个数字,让对比能留给下一个读者。

账单和应用对不上时该看哪里

先看时间窗口,再看接口,最后看层次。三关都过了还对不上,那就是运营商的问题而不是客户端设置,答案通常会指出上报延迟或共享额度。

让应用更新和移动数据的设置与套餐相称,并把大批传输安排在承受得起的连接上。如果你在共享网络,请单独查看热点覆盖情况,因为手机上的隧道并不能说明共享出去的流量如何路由或如何计费。

相关文章