基于范围请求 能够实现 断点续传和多线程分片下载html
HTTP/1.1以后才支持,须要双端都支持 服务器
服务端头信息中有 Accept-Ranges:bytes 代表服务器支持范围请求多线程
curl -I "http://www.gnu.org/software/gettext/manual/gettext.html" HTTP/1.1 200 OK Date: Sat, 08 Sep 2018 14:31:38 GMT Server: Apache/2.4.7 Access-Control-Allow-Origin: (null) Accept-Ranges: bytes Vary: Accept-Encoding Cache-Control: max-age=0 Expires: Sat, 08 Sep 2018 14:31:38 GMT Content-Length: 1408775 Content-Type: text/html Content-Language: en
范围请求:curl
http code 返回 206 Partial Contentpost
客户端请求头:Content-Range: bytes 0-1408774/1408775url
start-end/content-lengthspa
end 最大为 content-length - 1, start 从0开始, 包括开始和结束值,超过范围有可能返回 HTTP 416 Range Not Satisfiable ,有的服务器会自动修正线程
Range 还有几种不一样的方式来限定范围,能够根据须要灵活定制: 1. 500-1000:指定开始和结束的范围,通常用于多线程下载。 2. 500- :指定开始区间,一直传递到结束。这个就比较适用于断点续传、或者在线播放等等。 3. -500:无开始区间,只意思是须要最后 500 bytes 的内容实体。 4. 100-300,1000-3000:指定多个范围,这种方式使用的场景不多,了解一下就行了
范围请求示例:code
范围请求须要在head中增长 Range: bytes=0-10htm
curl -I -r 0-100 "http://www.gnu.org/software/gettext/manual/gettext.html"
或
curl -H "Range: bytes=0-10" http://www.gnu.org/software/gettext/manual/gettext.html
HTTP/1.1 206 Partial Content Date: Sat, 08 Sep 2018 14:28:04 GMT Server: Apache/2.4.7 Access-Control-Allow-Origin: (null) Accept-Ranges: bytes Vary: Accept-Encoding Cache-Control: max-age=0 Expires: Sat, 08 Sep 2018 14:28:04 GMT Content-Range: bytes 0-100/1408775 # 本次返回内容的 开始-结束/总长度 Content-Length: 101 #本次返回的总长度 Content-Type: text/html Content-Language: en
资源变化
有时下载的过程当中资源能够能已经发生变化了这时就须要从新下载, 能够经过 ETag 或者 Last-Modified 来标识当前资源是否变化
ETag:当前文件的一个验证令牌指纹,用于标识文件的惟一性。
Last-Modified:标记当前文件最后被修改的时间。
只须要在头信息中传入 etag或 Last-Modified的值,若果资源没有发生变化会继续返回206,不然返回200,此时须要从新下载
If-Range: xxx
If-Range 必须与 Range 配套使用。若是没有 Range,那么 If-Range 就会被忽略。
若是服务器不支持 If-Range,那么 Range 也会被忽略。
Etag(Entity Tags)主要为了解决 Last-Modified 没法解决的一些问题。
一、某些文件周期性改变,但内容没变,只是时间变了
二、某些文件改变很是频繁(1s变化n次),后者只能够精确到秒
三、某些服务器不能精确获得文件的修改时间