You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

psutil.net_io_counters().bytes_recv含义及VPN下载字节计数异常排查

VPN适配器流量计数略大于下载文件大小的原因

场景与测试

我使用ExpressVPN,物理连接为有线以太网,已连接VPN。在「控制面板\网络和Internet\网络连接」中,有以太网适配器和名为「Local Area Connection 2」的VPN适配器,Windows设置显示通过该VPN联网,以太网无网络。

我进行了以下测试:关闭所有联网程序,记录bytes_recv值,下载大小为1,073,741,824字节的文件,再次记录bytes_recv并计算差值。测试代码如下:

import psutil
import requests
import sys
from io import BytesIO

def test(lan2=False):
    if lan2:
        bytes_recv0 = psutil.net_io_counters(pernic=True)['Local Area Connection 2'].bytes_recv
    else:
        bytes_recv0 = psutil.net_io_counters().bytes_recv
    done = 0
    r = requests.get('http://ipv4.download.thinkbroadband.com/1GB.zip', stream=True)
    with BytesIO() as f:
        for chunk in r.iter_content(131072):
            done += len(chunk)
            f.write(chunk)
            sys.stdout.write('\r{}% done'.format(round(done / 1073741824 * 100, 4)))
    if lan2:
        bytes_recv1 = psutil.net_io_counters(pernic=True)['Local Area Connection 2'].bytes_recv
    else:
        bytes_recv1 = psutil.net_io_counters().bytes_recv
    
    return (bytes_recv1 - bytes_recv0) / 1073741824

测试结果:

In [69]: test()
100.0% doneOut[69]: 2.161009442061186

In [70]: test()
100.0% doneOut[70]: 2.1637731716036797

In [71]: test()
100.0% doneOut[71]: 2.174186712130904

In [72]: test(1)
100.0% doneOut[72]: 1.033312937244773

In [73]: test(1)
100.0% doneOut[73]: 1.0409678984433413

In [74]: test(1)
100.0% doneOut[74]: 1.0346684455871582

测试发现:未设置pernic时数据被重复计数,且「Local Area Connection 2」和以太网适配器的计数均变化;仅统计VPN适配器时,计数略大于1GiB,且errin、errout、dropin、dropout计数无变化。曾猜测是通信编码开销,但64b/66b编码对应的1.03125与结果不匹配,疑惑为何计数会略大于预期。

原因解析

  • VPN协议封装开销:ExpressVPN会将原始IP数据包封装在自身VPN协议(如OpenVPN、IKEv2)的数据包中,每个数据包都会额外增加协议头部、尾部等封装信息,这些字节都会被计入VPN适配器的bytes_recv统计,这是最核心的原因。
  • TCP/IP协议栈额外流量:
    • TCP为保证可靠传输,会产生握手/挥手报文、ACK确认包、滑动窗口调整等控制流量,这些都会被统计到接收字节中;
    • 每个数据段都会携带IP头部(约20字节)和TCP头部(约20字节),累积下来会产生可观的额外计数。
  • HTTP协议附加数据:HTTP响应的状态行、响应头(如Content-Length、Connection字段)也属于接收的字节内容,虽然量不大,但也是额外计数的一部分。
  • 编码开销的误区:64b/66b是以太网物理层的编码方式,这部分开销仅在物理以太网适配器的统计中体现,而VPN适配器统计的是IP层及以上的流量,不会包含物理层编码开销,因此和64b/66b的比例不匹配是正常的。

另外,未设置pernic时的重复计数,是因为VPN流量最终会被封装后通过物理以太网适配器传输,两个适配器的计数都会增加,全局统计是所有适配器的总和,因此出现接近两倍的数值。

内容的提问来源于stack exchange,提问作者Ξένη Γήινος

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:03:09