文章目录
- HTTP断点续传小结
- 断点续传
- 如何实现断点续传
- Range
- Content-Range
- 第三方库进行范围请求
- 资源发生改变的问题
- 参考资料
HTTP断点续传小结
断点续传
断点续传指的是从文件上次中断的地方开始传送数据,而并非是从文件开头传送,这样可以节省时间,提高速度。也可以将文件划分为几个部分,每一个部分采用一个线程进行上传/下载,这就是多线程下载。
如何实现断点续传
HTTP 1.1中请求头中增加了Range参数,可以实现范围请求,这是实现断点续传的基础。服务器端通过带有Content-Range参数的响应头来响应这个请求 。
Range
格式:
Range: bytes=start-end
其中,start代表文件起始位置,end代表结束位置,两个参数都是数字,单位都是字节。
for example:
Range: bytes=0-66666 //请求范围为1~66666字节的内容
Range: bytes=100- //请求100字节开始到文件结束位置的内容
Range: bytes=-2020 //请求文件倒数2020字节的内容
Range: bytes=0-2020,3000-3100 //请求多个范围的内容,中间用一个逗号隔开
与范围请求相关的有三种状态:
- 在请求成功的情况下,服务器会返回
206
Partial Content
状态码。 - 在请求的范围越界的情况下(范围值超过了资源的大小,即end > 文件长度),服务器会返回
416
Requested Range Not Satisfiable
(请求的范围无法满足) 状态码。 - 在不支持范围请求的情况下(end > start),服务器会返回
200
OK
状态码。
Content-Range
当客户端发出了一个带有Range参数的请求头,服务端会返回状态码为 206
Partial Content` 的响应:
HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/146515 //0-1023指当前发送数据的范围,146515指文件总长度
Content-Length: 1024
...
(binary content)
第三方库进行范围请求
Okhttp范围请求
Request request = new Request.Builder()
.addHeader("RANGE", "bytes=" + downloadLength + "-" + sumLength) //addHeader方法指定下载区间
.url(downloadUrl)
.build();
Retrofit范围请求
主要是通过@Header
注解添加不固定的请求头参数这种方式。
@GET("path/xxx")
Call<Response> getFile(@Header("Range") String range)
//@Headers注解直接将参数写死了,不够灵活
@Headers("Range: bytes:0-")
@GET("path/xxx")
Call<Response> getFile()
资源发生改变的问题
当我们下载一个文件没下载完就暂停,然后隔了很长时间,有时候就算我们使用了断点下载的软件来继续下载文件,还是要从头开始下载,有时候干脆直接下载失败,这是为什么呢?
当服务器中的文件资源发生改变时,就可能会导致这些问题。
解决这个问题的办法通常是在Headers增加标记位。
Last-Modified & If-Modified-Since
If-Modified-Since是请求头中的参数,而Last-Modified是响应头中的参数,两者都是用于记录页面最后修改时间。
验证过程:
当再次请求本地有缓存的页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。
Etag & if-Range
HTTP/1.1 引入了 Etag。Etag是文件的唯一标识
if-Range用于判断资源是否发生改变,如果资源未改变,服务器发送客户端丢失的部分,否则发送整个资源。它可以使用Etag或Last-Modified返回的值。
验证过程:
客户端先发起一个带有Range 和 if-Range 参数的请求,服务器收到请求后会将客户端和服务器的 Etag 进行比对。若相等,请求文件资源没有发生变化,应答报文为 206;若不相等,则请求文件资源发生变化,应答报文为 200。