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

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. VMware下centos7安装

    VMware下centos7安装 转载地址:https://blog.csdn.net/hui_2016/article/details/68927487 一. 软件准备 二. Vmware12安装 ...

  2. hive_连续天次计算

    drop table sospdm.tmp_yinfei_yuanzuan_redbag; create table sospdm.tmp_yinfei_yuanzuan_redbag stored ...

  3. HDU-1009的解题报告

    Hdu-1009 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009 题意:Fatmouse准备M磅的猫食,准备与猫守卫仓库有他最爱吃的食品贸易,J ...

  4. linuxDNS配置

    DNS配置 vim /etc/resolv.conf nameserver 114.114.114.114

  5. 移动端滑屏全应用【四】移动端动画贞动画函数mTween封装

    首先此函数是基于大家都知道的Tween动画算法的,在此基础上使用了三中讲到的兼容版动画贞,可以使动画变得更流畅. 1. 首先要记得引入Tween.js 2. 引入mTween.js 3. 调用 * m ...

  6. UVA 509 RAID!

    思路来自:https://blog.csdn.net/wcr1996/article/details/43834545 先解释一下题意: ①输入:先输入d(disk的数量)  s(每块数据块有s个bi ...

  7. SQL的多种JOIN

  8. AGC 002E.Candy Piles(博弈论)

    题目链接 \(Description\) 给定\(n\)堆糖,数量分别为\(a_i\).Alice和Bob轮流操作.每次可以吃掉最多的一堆,也可以每堆各吃掉一个.无法操作的人输,求谁能赢. \(n\l ...

  9. 2017-9-13-Linux移植:bootloader烧写

    首先看一下Linux启动过程: Linux启动过程 刚开始最重要的是Bootloader的启动,Bootloader因你改改存放到哪?怎么执行?作用是啥? bootloader的烧写: 所谓烧写也就是 ...

  10. Java并发编程(二)-- 创建、运行线程

    Java线程 Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类. Java可以用如下方式创建一个线程: Tread thread = new Thread ...