基于范围请求 可以实现 断点续传多线程分片下载

HTTP/1.1之后才支持,需要双端都支持

服务端头信息中有 Accept-Ranges:bytes 表明服务器支持范围请求

curl -I  "http://www.gnu.org/software/gettext/manual/gettext.html"   

HTTP/1.1  OK
Date: Sat, Sep :: GMT
Server: Apache/2.4.
Access-Control-Allow-Origin: (null)
Accept-Ranges: bytes
Vary: Accept-Encoding
Cache-Control: max-age=
Expires: Sat, Sep :: GMT
Content-Length:
Content-Type: text/html
Content-Language: en

范围请求:

http code 返回  206 Partial Content

客户端请求头:Content-Range: bytes 0-1408774/1408775

start-end/content-length

end 最大为 content-length - 1, start 从0开始, 包括开始和结束值,超过范围有可能返回 HTTP 416 Range Not Satisfiable  ,有的服务器会自动修正

Range 还有几种不同的方式来限定范围,可以根据需要灵活定制:
. -:指定开始和结束的范围,一般用于多线程下载。
. - :指定开始区间,一直传递到结束。这个就比较适用于断点续传、或者在线播放等等。
. -:无开始区间,只意思是需要最后 bytes 的内容实体。
. -,-:指定多个范围,这种方式使用的场景很少,了解一下就好了

范围请求示例:

范围请求需要在head中增加 Range: bytes=0-10

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 Partial Content
Date: Sat, Sep :: GMT
Server: Apache/2.4.
Access-Control-Allow-Origin: (null)
Accept-Ranges: bytes
Vary: Accept-Encoding
Cache-Control: max-age=
Expires: Sat, Sep :: GMT
Content-Range: bytes -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 无法解决的一些问题。
1、某些文件周期性改变,但内容没变,只是时间变了
2、某些文件改变非常频繁(1s变化n次),后者只可以精确到秒
3、某些服务器不能精确得到文件的修改时间

参考:https://juejin.im/post/5b555f055188251af25700aa

http范围请求的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  3. 重温Http协议--请求报文和响应报文

    http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...

  4. Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)

    背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...

  5. nodejs之get/post请求的几种方式

    最近一段时间在学习前端向服务器发送数据和请求数据,下面总结了一下向服务器发送请求用get和post的几种不同请求方式: 1.用form表单的方法:(1)get方法 前端代码: <form act ...

  6. ajax异步请求

    做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...

  7. C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)

    本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...

  8. nodejs进阶(5)—接收请求参数

    1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...

  9. 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...

  10. [转]利用URLConnection来发送POST和GET请求

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...

随机推荐

  1. Node.js实现网络编程

    http://www.cnblogs.com/myzhibie/p/4579122.html

  2. 解决java编译错误:编码GBK的不可映射字符

    新建java文件,存储时Encoding选择了UTF-8, 由于语句中包含中文,javac编译时报错,提示"编码GBK的不可映射字符": 解决办法: 1.使用javac -enco ...

  3. NIO缓冲区基本操作:rewind(),clear(),flip()

    rewind() rewind()方法将position置0,清除mark,它的作用在于为提取Buffer的有效数据做准备. ByteBuffer byteBuf = ByteBuffer.alloc ...

  4. ReentrantLock和condition源码浅析(一)

    转载请注明出处..... 一.介绍 大家都知道,在java中如果要对一段代码做线程安全操作,都用到了锁,当然锁的实现很多,用的比较多的是sysnchronize和reentrantLock,前者是ja ...

  5. Android-自定义View前传-View的三大流程-Layout

    Android-自定义View前传-View的三大流程-Layout 参考 <Android开发艺术探索> https://github.com/hongyangAndroid/FlowL ...

  6. Android图片缓存框架Glide

    Android图片缓存框架Glide Glide是Google提供的一个组件.它具有获取.解码和展示视频剧照.图片.动画等功能.它提供了灵活的API,帮助开发者将Glide应用在几乎任何网络协议栈中. ...

  7. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  8. BZOJ.1178.[APIO2009]会议中心(贪心 倍增)

    BZOJ 洛谷 \(Description\) 给定\(n\)个区间\([L_i,R_i]\),要选出尽量多的区间,并满足它们互不相交.求最多能选出多少个的区间以及字典序最小的方案. \(n\leq2 ...

  9. setdest 和cbrgen工具的使用,出现的错误

    在路径 ~/ns-2.34/indep-utils/cmu-scen-gen/setdest下运行 ./setdest -n 250 -p 0.0 -M 10.0 -t 10 -x 1500 -y 1 ...

  10. OpenCV3.3.0 + CLion + CMake 配置(Mac巨细无敌版)

    目录 开始 完成了 参考链接: 1,cmake编译 http://blog.csdn.net/baidu_36316735/article/details/53168438 2,CLion导入open ...