如何验证代理链路中的 HTTP Range 与断点续传完整性

HTTP Range 能提高大文件下载、媒体验证和中断后采集的效率,也会引入正确性风险。代理可能忽略请求范围、缓存错误分段、返回不一致校验器,或在各段之间更换出口。下载器最终可能得到长度正确但字节错误的文件。
本指南建立用于代理采购的 Range 与续传测试,只使用自有或获准文件和终点。
明确预期协议
单字节范围通常应返回 206 Partial Content、有效 Content-Range、正确分段长度和稳定表示校验器。源站若忽略 Range,可能返回完整内容和 200。客户端必须区分,不能把完整响应追加到部分文件。
记录测试编号、路由别名、请求范围、状态、Content-Range、长度、ETag 哈希、Last-Modified、分段摘要、整文件摘要、代理会话哈希和失败阶段。不得记录代理密码、授权头、Cookie 或原始会话令牌。
建立确定性夹具
创建已知字节和强摘要的自有二进制对象,长度足以跨多个分段,并在每个边界放置不同模式。提供稳定 ETag、Last-Modified、Accept-Ranges 和总长度。
再创建大小接近但边界字节不同的第二版本,用于验证对象更新时续传能否安全停止。
建立直连基线
分别请求第一个字节、中间区间、最后字节、开放结束范围、后缀范围、无法满足的范围,以及两个能拼成较大区间的相邻范围。逐一验证状态、边界、长度和分段摘要。
无法满足的请求应明确当前总长度,不能返回看似合理的部分正文。
运行代理路由矩阵
| 维度 | 取值 |
|---|---|
| 路径 | 直连、网关 A、网关 B |
| 地址族 | 已购买的 IPv4、IPv6 |
| 会话 | 粘性、轮换 |
| 连接 | 新建、复用 |
| 编码 | identity;明确支持时再测压缩 |
| 缓存 | 唯一未命中、受控命中 |
固定对象版本、范围、客户端和超时,每段在每条路由重复。轮换代理可以更换出口,但所有分段仍必须属于同一对象表示。
数学验证 Content-Range
对于 bytes start-end/total,要求起点不大于终点,返回长度等于终点减起点加一,终点小于总长度,正文等于自有夹具对应字节,并且同一次拼接的所有分段共享同一强校验器。
拒绝字节不同的重叠段、意外空洞和下载途中变化的总长度。不能只用 Content-Length 推断正确。
使用校验器保护续传
续传时带上合适校验器,避免把新版对象字节追加到旧文件。如果校验器不再匹配,从干净临时文件重新开始。完整摘要通过前,不覆盖已验证目标文件。
弱校验器与强校验器能力不同。无法证明两个分段代表相同字节时,应重新开始而不是猜测。
分开压缩与字节范围
Range 针对选定表示。自动压缩会改变偏移、长度和校验器。先用 identity 建立字节正确性;只有源站协议明确时再测试压缩,并记录偏移属于编码还是解码字节。
组合前先执行gzip 与 Brotli 完整性测试。
测试失败与重试
在已知字节数后中断连接并续传。分别测试响应头前超时、分段中超时,以及最后一段完成但提交前中断。记录重试是否创建新隧道或改变代理出口。
部分 GET 通常可重试,但必须写入带偏移的临时文件,绝不盲目追加。结合代理重试风暴预防指南限制次数和总耗时。
检测缓存和路由污染
在获准夹具中使用唯一挑战,分开缓存未命中与受控命中。跨网关比较校验器与分段摘要,缓存不得在版本 B 校验器下返回版本 A 分段。
不得绕过第三方缓存规则,只在自有或明确许可环境测试。
测量有效性能
记录首字节时间、分段吞吐、续传成功率、重复下载字节、完整文件成功率和每个已验证对象成本。原始吞吐高的路由,如果经常因错误分段重下整文件,仍然昂贵。
上线检查清单
- 直连首段、中段、末段、后缀和无效范围全部通过;
- 每个 206 的数学边界有效;
- 分段摘要匹配自有夹具;
- 一次拼接不会混用校验器;
- 对象变化会触发干净重启;
- identity 通过后才测压缩;
- 中断传输续写临时文件;
- 完整摘要通过后才提交;
- IPv4、IPv6、网关与会话分开统计;
- 日志不含凭据或私有载荷。
常见问题
Range 请求返回 200 一定是错误吗?
不一定,服务器可能忽略 Range 并返回完整对象。客户端应替换或重启,不能追加。
分段可以使用不同代理出口吗?
若源站允许且校验器证明表示相同,可以。但访问状态或地区内容会变化时,粘性会话更安全。
总长度相同就足够吗?
不够。错误或重复分段仍可能保持总长度,必须验证每段及最终整文件摘要。
应立即并行下载分段吗?
先证明顺序下载正确,路由、源站与缓存稳定后再加入受限并行。
合规说明
只从自有或获准系统与对象请求范围。遵守速率限制、许可、缓存规则和隐私要求,不得利用分段下载规避访问控制或流量限制。