HTTP断点续传知识小结

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。

参考资料

HTTP范围请求

HTTP 断点续传(分块传输)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值