多线程下载
预备知识
http range
在请求大文件时,可以使用
range指定请求文件的一小部分,从而发起多个线程进行请求,加快下载速度
range字段用法:在http request header中添加一个Header
Range:bytes=start-end这里的意思是请求从start开始到end结束的数据,注意的是,这里的start到end是一个闭区间,也就是说
Range:bytes=0-1这样的请求,实际上请求得到是两个byte,分别是0和1,所以说,一个大小为
ContentLength为100的文件,实际在请求的时候,只能请求
Range:bytes=0-99还可以使用这种方式来表达:
Range:bytes=100-这里表达的意思是从100到最后的一个
byte
Range:bytes=-100这里表达的是从结尾的开始的100个byte
Range:bytes=0-1,3-4还可以这样请求多段数据
下面有些实例:
Range头域可以请求实体的一个或者多个子范围。例如, 表示头500个字节:
bytes=0-499表示第二个500字节:bytes=500-999表示最后500个字节:bytes=-500表示500字节以后的范围:bytes=500-第一个和最后一个字节:bytes=0-0,-1同时指定几个范围:bytes=500-600,601-999在发起请求时,如果start大于end,服务器会返回一个200,然后将整个文件返回,而在start大于文件长度时,服务器会返回一个416 Requested range not satisfiable,表示range出错,而正常是返回206 Partial Content,这样才是正确的,在response中还有一个字段为
Content-Range: bytes first-end/totalfirst,数据的开始数据的位置索引 (inclusive)
end, 数据的结束位置索引(inclusive)
total, 数据的整包大小
还有
Content-Length: len这个是此次返回的数据的大小
http Head
HEAD方法与GET类似,但是HEAD并不返回消息体。在一个HEAD请求的消息响应中,HTTP投中包含的元信息应该和一个GET请求的响应消息相同。这种方法可以用来获取请求中隐含的元信息,而无需传输实体本身。这个方法经常用来测试超链接的有效性,可用性和最近修改。
可以使用head方法查看我们需要请求文件的大小和是否支持Range
cHTTP/1.1 200 OK Content-Length: 46744109 //文件的长度 Accept-Ranges: bytes //接受Range字段,以及Range的单位 Cache-Control: max-age=7200 Connection: keep-alive Content-Type: application/octet-stream Date: Sun, 15 May 2022 03:43:45 GMT Etag: "6275afbc-2c9422d" Expires: Sun, 15 May 2022 05:43:45 GMT Keep-Alive: timeout=4 Last-Modified: Fri, 06 May 2022 23:31:08 GMT Proxy-Connection: keep-alive Server: nginx