文档菜单

按流量计费的流量如何计算

按流量计费(PPG)代理对客户端与Litport节点之间的流量计费。本页说明哪些内容计入流量、提前断开连接会怎样,以及如何减少计费流量。本页涵盖不使用缓存模式时,通过HTTP CONNECT和SOCKS5建立的TCP连接。

哪些内容计入流量#

连接保持打开期间,Litport会计入客户端与节点之间双向交换的每一个字节。

连接的组成部分 是否计入
代理握手:CONNECT请求和响应,或SOCKS5协商 是
TLS握手和记录开销,包括到代理本身的TLS 是
请求,包括任何上传的请求体 是
响应 是,计入节点已发送给客户端的部分

上传会计费吗?#

会。上传和下载都计费,逐字节计算。

TLS开销会计费吗?#

会。TLS握手和记录封装都是经过节点的字节。参见https://代理的成本。

每个请求有最低计费量吗?#

没有。流量按令牌和小时以精确字节数计费,没有单个请求的最低计费量,也不向上取整。

缓存模式的情况如何?#

开启缓存模式后,节点会自行读取HTTPS请求。缓存命中免费;未命中和绕过缓存按缓存选项与故障排查中的说明计费。本页其余部分讲的是不使用缓存模式的流量。

取消的请求会计费吗?#

计费范围是断开连接之前已传输的数据,而不是整个响应。客户端关闭连接后,节点会结束隧道并关闭其上游连接。节点已发往客户端的字节仍会计入,即使客户端从未读取过这些字节:关闭连接时,它们还在传输途中或缓冲区中。

提前断开对较大的响应和较慢的连接节省最多。在较快的连接上,断开时较小响应的大部分可能已经在传输途中。

实测结果#

我们通过一个节点进行了测试,使用HTTP CONNECT、SOCKS5和到代理的TLS,覆盖两个住宅IP代理池和一个数据中心代理池。数值为每个请求的中位数,失败的请求也计算在内。您的数值取决于响应大小、速度和客户端。

客户端的操作 请求数 计费量(每个请求的中位数)
读取完整的220 KB响应体 290 230 KB;使用到代理的TLS时为235 KB
读取220 KB响应体中的约50 KB后断开连接,住宅IP代理池 1,160 86–95 KB
同样的操作,但响应体发送较慢(220 KB历时5秒发送) 1,100 56 KB
读取2 MB或5 MB响应体中的约50 KB后断开连接,住宅IP代理池 200 76–85 KB
读取220 KB响应体中的约50 KB后断开连接,数据中心代理池 30 192 KB
读取约50 KB后停止读取,但保持连接打开20秒 30 230 KB
发送请求3秒后断开连接,而该请求的响应在10秒后才到达 630 5.8–5.9 KB
TLS握手完成后立即断开连接 600 5.8 KB

如何减少计费流量#

  1. 一旦拿到所需内容就立即断开连接。统计接收到的字节数,而不是解压后的大小。
  2. 关闭到代理的连接。仅在应用中停止读取,不会停止传输,也不会停止计费;见上文的结果。
  3. 不要把提前中断的连接放回keep-alive连接池。
  4. 如果在收到任何响应之前断开连接,计费的大约是握手加请求的流量,如上文的延迟响应测试所示。断开时已在途中的响应会被计入。对于仍在传输途中的请求,Litport无法告知网站是否已收到或处理该请求。
  5. 在浏览器中,取消请求后代理连接可能仍保持打开。在依赖这一做法之前,先测量自己环境下的计费流量。
  6. 让重复请求的静态文件由静态响应缓存提供,并屏蔽不需要的图片、媒体和字体。
  7. 在“流量统计”中按令牌查看结果。

Node.js示例#

此示例在收到50 KB响应后关闭隧道。在我们的测试中,计费约94 KB,而读取完整响应约为230 KB。94 KB多于50 KB,是因为其中还包括TLS握手、请求和标头(约7 KB),以及隧道关闭时已在传输途中的数据。

import https from 'node:https'
import { HttpsProxyAgent } from 'https-proxy-agent'

const agent = new HttpsProxyAgent('http://USERNAME:[email protected]:1337')

const req = https.get('https://example.com/page', { agent }, (res) => {
  let received = 0
  res.on('data', (chunk) => {
    received += chunk.length
    if (received >= 50_000) req.destroy() // closes the tunnel; counting stops here
  })
})
req.on('error', () => {})