按流量计费的流量如何计算
按流量计费(PPG)代理对客户端与Litport节点之间的流量计费。本页说明哪些内容计入流量、提前断开连接会怎样,以及如何减少计费流量。本页涵盖不使用缓存模式时,通过HTTP CONNECT和SOCKS5建立的TCP连接。
哪些内容计入流量#
连接保持打开期间,Litport会计入客户端与节点之间双向交换的每一个字节。
| 连接的组成部分 | 是否计入 |
|---|---|
代理握手:CONNECT请求和响应,或SOCKS5协商 |
是 |
| TLS握手和记录开销,包括到代理 |
是 |
| 请求,包括任何上传的请求体 | 是 |
| 响应 | 是,计入节点已发送给客户端的部分 |
上传会计费吗?#
会。上传和下载都计费,逐字节计算。
TLS开销会计费吗?#
会。TLS握手和记录封装都是经过节点的字节。参见https://代理的成本。
每个请求有最低计费量吗?#
没有。流量按令牌和小时以精确字节数计费,没有单个请求的最低计费量,也不向上取整。
缓存模式的情况如何?#
开启缓存模式后,节点会自行读取HTTPS请求。缓存命中免费;未命中和绕过缓存按缓存选项与故障排查中的说明计费。本页其余部分讲的是不使用缓存模式的流量。
取消的请求会计费吗?#
计费范围是断开连接之前已传输的数据,而不是整个响应。客户端关闭连接后,节点会结束隧道并关闭其上游连接。节点已发往客户端的字节仍会计入,即使客户端从未读取过这些字节:关闭连接时,它们还在传输途中或缓冲区中。
提前断开对较大的响应和较慢的连接节省最多。在较快的连接上,断开时较小响应的大部分可能已经在传输途中。
实测结果#
我们通过一个节点进行了测试,使用HTTP CONNECT、SOCKS5和到代理的TLS,覆盖两个住宅IP代理池和一个数据中心代理池。数值为每个请求的中位数,失败的请求也计算在内。您的数值取决于响应大小、速度和客户端。
| 客户端的操作 | 请求数 | 计费量(每个请求的中位数) |
|---|---|---|
| 读取完整的220 KB响应体 | 290 | 230 KB;使用到代理的TLS时为23 |
| 读取220 KB响应体中的约50 KB后断开连接,住宅IP代理池 | 1,160 | 86–95 KB |
| 同样的操作,但响应体发送较慢(2 |
1,100 | 56 KB |
| 读取2 MB或5 MB响应体中的约50 KB后断开连接,住宅IP代理池 | 200 | 76–85 KB |
| 读取220 KB响应体中的约50 KB后断开连接,数据中心代理池 | 30 | 192 KB |
| 读取约50 KB后停止读取,但保持连接打开2 |
30 | 230 KB |
| 发送请求3秒后断开连接,而该请求 |
630 | 5.8–5.9 KB |
| TLS握手完成后立即断开连接 | 600 | 5.8 KB |
如何减少计费流量#
- 一旦拿到所需内容就立即断开连接。统计接收到的字节数,而不是解压后的大小。
- 关闭到代理的连接。仅在应用中停止读取,不会停止传输,也不会停止计费;见上文的结果。
- 不要把提前中断的连接放回keep-alive连接池。
- 如果在收到任何响应之前断开连接,计费的大约是握手加请求的流量,如上文的延迟响应测试所示。断开时已在途中的响应会被计入。对于仍在传输途中的请求,Litport无法告知网站是否已收到或处理该请求。
- 在浏览器中,取消请求后代理连接可能仍保持打开。在依赖这一做法之前,先测量自己环境下的计费流量。
- 让重复请求的静态文件由静态响应缓存提供,并屏蔽不需要的图片、媒体和字体。
- 在“流量统计”中按令牌查看结果。
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', () => {})