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,提问作者Ξένη Γήινος
相关产品推荐
相关产品推荐

