一、HTTP协议基础#
HTTP协议通过Range请求实现断点续传:
客户端请求指定范围
客户端在请求头中携带Range字段,例如:1 2GET /file.zip HTTP/1.1 Range: bytes=500-1000服务端响应部分内容
若支持范围请求,服务端返回状态码206 Partial Content及对应数据片段:1 2 3HTTP/1.1 206 Partial Content Content-Range: bytes 500-1000/5000 Content-Length: 501完整性校验机制
通过ETag或Last-Modified头确保文件未变更,避免续传数据不一致。
二、Nginx静态资源断点续传#
Nginx默认支持静态文件的断点续传。需要有以下配置:
| |
验证方法:
使用curl检测响应头:
| |
若输出包含Accept-Ranges: bytes与Content-Length,则表明支持续传。
三、Go实现#
对于动态生成的文件(如需鉴权的资源),需手动处理Range请求。
| |
• 解析Range请求头并验证范围有效性
• 使用Seek定位文件指针,返回部分内容
• 通过ETag实现文件一致性校验
四、客户端如何检测服务端是否支持?#
可通过以下步骤判断:
发送HEAD请求
获取响应头信息:1curl -I http://your-domain/file.zip检查关键头字段
•Accept-Ranges: bytes:表明支持字节范围请求 •Content-Length:必须存在且为固定值(动态内容可能无法支持) •ETag或Last-Modified:用于文件变更校验实验性范围请求测试
发送带Range头的GET请求:1curl -H "Range: bytes=0-100" http://your-domain/file.zip若响应状态码为
206且包含Content-Range头,则确认支持续传。
五、Nginx反向代理Go服务的注意事项#
当Go服务部署于Nginx后,需确保配置正确处理Range请求:
| |
• 确认Nginx与Go服务对文件有读取权限
• 检查Content-Length是否被意外修改(如Gzip压缩)
• 使用tcpdump或Wireshark抓包验证请求头传递
六、边界问题与优化建议#
多范围请求处理
支持形如Range: bytes=0-100,200-300的请求需分段响应,可通过Go的multipart/byteranges实现。速率限制与防滥用
Nginx配置限速:1 2 3location /download { limit_rate 1m; # 限制下载速度为1MB/s }日志监控
监控206状态码频率,识别异常续传行为。

