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

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. Python class NameError name "xxx" is not defined

    Python class NameError name "xxx" is not defined 这是因为在 class 中调用了带双下划线 "__" 的函数对 ...

  2. Maya mayapy.exe 安装 Cython,编译 pyd

    Maya mayapy.exe 安装 Cython,编译 pyd 前言 在 Python 2.7 cython cythonize py 编译成 pyd 谈谈那些坑 中最后提到,使用  VCForPy ...

  3. 爬虫2 urllib用法

    from urllib import request,parse # 1. 解析数据 # 解析一条 # response = request.urlopen(url='http://httpbin.o ...

  4. SpringSecurity整合JWT

    一.前言 最近负责支付宝小程序后端项目设计,这里主要分享一下用户会话.接口鉴权的设计.参考过微信小程序后端的设计,会话需要依靠redis.相关的开发人员和我说依靠Redis并不是很靠谱,redis在业 ...

  5. Oracle no TOP, how to get top from order

    On ROWNUM and Limiting Results Our technologist explains how ROWNUM works and how to make it work fo ...

  6. js函数和变量的声明与执行顺序

    一.函数执行顺序 1.正常顺序 function f(){ alert(2); } f(); //alert 2 所有浏览器都能测试通过. 2.倒序调用 f(); //alert 2 function ...

  7. IIS PHP

    Name:PHP_FCGI_MAX_REQUESTS Value:10000

  8. Xamarin Essentials教程使用加速度传感器Accelerometer

    Xamarin Essentials教程使用加速度传感器Accelerometer   加速度传感器是一种能够测量加速度的传感器,用于检测设备状态的改变.在Xamarin中,如果开发者想要使用加速度传 ...

  9. 一个不错的Node.js进阶学习引导

    https://cnodejs.org/topic/58ad76db7872ea0864fedfcc

  10. 1489 ACM 贪心

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1489 题意:为负数表示买酒,正数表示买酒,每两家人之间为one unit of work.问最小的work ...