Skip to content

多线程下载

预备知识

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/total

first,数据的开始数据的位置索引 (inclusive)

​ end, 数据的结束位置索引(inclusive)

​ total, 数据的整包大小

还有 Content-Length: len

这个是此次返回的数据的大小

http Head

HEAD方法与GET类似,但是HEAD并不返回消息体。在一个HEAD请求的消息响应中,HTTP投中包含的元信息应该和一个GET请求的响应消息相同。这种方法可以用来获取请求中隐含的元信息,而无需传输实体本身。这个方法经常用来测试超链接的有效性,可用性和最近修改。

可以使用head方法查看我们需要请求文件的大小和是否支持Range

c
HTTP/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