已有十字节前缀加验证后的五十四字节后缀复原六十四字节;追加完整六十四字节响应会错误得到七十四字节。

续传前先核对范围与表示身份

范围请求要求获取选中表示的一部分,用于恢复中断传输或读取指定字节窗口。满足单个范围时,通常返回带有 Content-Range 的 206。服务器也可以忽略范围,返回完整表示和 200;如果范围无法满足,还可能返回 416。这些响应要求客户端采取不同动作,不能把所有“没有拿到预期范围”的情况都解释成同一种完整下载。 坏掉的样子 把每个成功响应都直接追加,会破坏下载文件。当服务器忽略 Range,或者 If-Range 验证器不再匹配时,200 响应包含完整表示。把它接在已有前缀后面,就会重复数据。HTTP 成功状态不能证明正文从请求的偏移开始,熟悉的文件名也不能证明表示身份。修改本地文件之前,必须先判断这次得到的是片段还是整份替代内容。 缺少合适验证器时,续传还可能把两个版本的字节组合成一个文件。If-Range 允许服务器仅在表示仍匹配时返回范围,否则发送完整表示。用于该条件的实体标签必须是强标签;弱标签不是字节身份承诺,也不是所有 Last-Modified 日期都能充当强验证器。是否适合用作续传条件,需要符合协议规则和服务器真实更新行为。 其他请求前提条件先于 Range 评估。本来应返回 304 或 412 的请求,不会因为同时带有 Range 就成为成功的范围传输。下面实验没有发送相互竞争的前提条件;把其预期状态用于下载器时,要保留这个限制,不能把它当成所有条件组合下的完整状态表。 范围坐标从零开始,末尾位置也包含在内。把末尾位置误当成长度,会产生差一个字节的问题。后缀范围表示最后若干字节,省略末尾则一直延伸到表示结尾。多个范围可能返回带独立元数据和边界的 multipart 正文;如果把整份正文当成连续文件片段写入,就会把分隔信息也混进下载内容,虽然状态码仍然是 206。 追加前核对表示身份与 Content-Range。完整 200 应替代下载;416 和多范围 206 各有处理路径。原文未压缩的 64 字节示例不等于完整下载器验收。 快速验证 将脚本保存为 check-ranges.py,准备 Python、Docker 和固定摘要的 nginx 镜像后执行。记录环境为 Linux arm64 上的 nginx 1.28.0。实验通过宿主回环提供一个可丢弃的 64 字节静态表示,不启用压缩,使范围位置始终对应摘要断言使用的原始表示,避免把内容编码变化混入基本范围测试: ...

十月 20, 2026 · 2 分钟 · XB Field Notes