HTTP 请求头 Range

请求资源的部分内容(不包括响应头的大小),单位是byte,即字节,从0开始.

如果服务器能够正常响应的话,服务器会返回 206 Partial Content 的状态码及说明.

如果不能处理这种Range的话,就会返回整个资源以及响应状态码为 200 OK .(这个要注意,要分段下载时,要先判断这个)

比如:类似下面的

➜  /tmp  curl -H "Range: bytes=0-10" http://127.0.0.1:8180/bg-upper.png -v
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8180 (#0)
> GET /bg-upper.png HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 127.0.0.1:8180
> Accept: */*
> Range: bytes=0-10
>
< HTTP/1.1 206 Partial Content
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Accept-Ranges: bytes
< ETag: W/"3103-1435633968000"
< Last-Modified: Tue, 30 Jun 2015 03:12:48 GMT
< Content-Range: bytes 0-10/3103
< Content-Type: image/png
< Content-Length: 11
< Date: Tue, 29 Dec 2015 09:18:36 GMT
<
�PNG * Connection #0 to host 127.0.0.1 left intact

响应头就是 HTTP/1.1 206 Partial Content

Range 请求头格式

Range: bytes=start-end

例如:

Range: bytes=10- :第10个字节及最后个字节的数据

Range: bytes=40-100 :第40个字节到第100个字节之间的数据.

注意,这个表示[start,end],即是包含请求头的start及end字节的,所以,下一个请求,应该是上一个请求的[end+1, nextEnd]

响应头

Content-Range

Content-Range: bytes 0-10/3103

这个表示,服务器响应了前(0-10)个字节的数据,该资源一共有(3103)个字节大小。

Content-Type

Content-Type: image/png

表示这个资源的类型

Content-Length

Content-Length: 11

表示这次服务器响应了11个字节的数据(0-10)

Last-Modified

Last-Modified: Tue, 30 Jun 2015 03:12:48 GMT

表示资源最近修改的时间(分段下载时要注意这个东西,因为如果修改了,分段下载可能就要重新下载了)

ETag

ETag: W/&quot;3103-1435633968000&quot;

这个响应头表示资源版本的标识符,通常是消息摘要(类似MD5一样)(分段下载时要注意这个东西,或者缓存控制也要注意这个东西)

注意,每种服务器对生成ETag的算法不同,这个要特别注意 如果使用分布式缓存,要特别要保证每台服务器生成的ETag算法是一致的.

缓存的过期,要同时结合(ETag + Last-Modified)这两个响应头来判断.

强ETag

只要实体发生任何改变,都会改变ETag值.如:

ETag: &quot;1234234234&quot;

弱ETag

它在前面会有个 W/ ,如:

ETag: W/&quot;12342423&quot;

分段下载

利用这个特点,我们可以使用分段下载(多线程下载,分布式下载)

思想:先请求一个 HEAD 方法的请求,获取总文件大小:

HEAD 请求

➜  /tmp  curl -X HEAD http://127.0.0.1:8180/bg-upper.png -v
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8180 (#0)
> HEAD /bg-upper.png HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 127.0.0.1:8180
> Accept: */*
>
< HTTP/1.1 200 OK
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Accept-Ranges: bytes
< ETag: W/"3103-1435633968000"
< Last-Modified: Tue, 30 Jun 2015 03:12:48 GMT
< Content-Type: image/png
< Content-Length: 3103
< Date: Tue, 29 Dec 2015 10:16:16 GMT
<
* transfer closed with 3103 bytes remaining to read
* Closing connection 0
curl: (18) transfer closed with 3103 bytes remaining to read
➜ /tmp

那个响应头的 Content-Length 就是总字节大小了(3103)字节.

多线程下载

假设分2条线程

线程1 下载

3103 / 2 = 1551

➜  /tmp  curl -H "Range: bytes=0-1551" http://127.0.0.1:8180/bg-upper.png -v -o 0-1151.png
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to 127.0.0.1 (127.0.0.1) port 8180 (#0)
> GET /bg-upper.png HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 127.0.0.1:8180
> Accept: */*
> Range: bytes=0-1551
>
< HTTP/1.1 206 Partial Content
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Accept-Ranges: bytes
< ETag: W/"3103-1435633968000"
< Last-Modified: Tue, 30 Jun 2015 03:12:48 GMT
< Content-Range: bytes 0-1551/3103
< Content-Type: image/png
< Content-Length: 1552
< Date: Tue, 29 Dec 2015 10:19:43 GMT
<
{ [data not shown]
100 1552 100 1552 0 0 1376k 0 --:--:-- --:--:-- --:--:-- 1515k
* Connection #0 to host 127.0.0.1 left intact
➜ /tmp

这样子,线程1就下载了(0-1551)字节的数据了.

线程2 下载

➜  /tmp  curl -H "Range: bytes=1552-3103" http://127.0.0.1:8180/bg-upper.png -v -o 1552-end.png
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to 127.0.0.1 (127.0.0.1) port 8180 (#0)
> GET /bg-upper.png HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 127.0.0.1:8180
> Accept: */*
> Range: bytes=1552
>
< HTTP/1.1 416 Requested Range Not Satisfiable
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Accept-Ranges: bytes
< Content-Range: bytes */3103
< Content-Type: text/html;charset=utf-8
< Content-Language: en
< Content-Length: 954
< Date: Tue, 29 Dec 2015 10:26:18 GMT
<
{ [data not shown]
100 954 100 954 0 0 457k 0 --:--:-- --:--:-- --:--:-- 931k
* Connection #0 to host 127.0.0.1 left intact
➜ /tmp

合并

cat 0-1151.png 1552-end.png > filename.png

这样子就OK了.

HTTP 请求头注意

根据HTTP规范,HTTP的消息头部的字段名,是不区分大小写的.

3.2. Header Fields

Each header field consists of a case-insensitive field name followed

by a colon (“:”), optional leading whitespace, the field value, and

optional trailing whitespace.

RFC7230

 

Http 请求头 Range的更多相关文章

  1. iOS开发——网络篇——文件下载(NSMutableData、NSFileHandle、NSOutputStream)和上传、压缩和解压(三方框架ZipArchive),请求头和请求体格式,断点续传Range

    一.小文件下载 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion ...

  2. Android系列之网络(二)----HTTP请求头与响应头

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  3. HTTP响应头和请求头信息对照表

    HTTP请求头提供了关于请求,响应或者其他的发送实体的信息.HTTP的头信息包括通用头.请求头.响应头和实体头四个部分.每个头域由一个域名,冒号(:)和域值三部分组成. 通用头标:即可用于请求,也可用 ...

  4. http请求头响应头大全

    转:http://www.jb51.net/article/51951.htm 本文为多篇“HTTP请求头相关文章”及<HTTP权威指南>一书的阅读后个人汇总整理版,以便于理解. 通常HT ...

  5. http断点续传原理:http头 Range、Content-Range

    所谓断点续传,也就是要从文件已经下载的地方开始继续下载.在以前版本的 HTTP 协议是不支持断点的,HTTP/1.1 开始就支持了.一般断点下载时才用到 Range 和 Content-Range 实 ...

  6. (二)----HTTP请求头与响应头

    一.HTTP头引入: 正确的设置HTTP头部信息有助于搜索引擎判断网页及提升网站访问速度.通常HTTP消息包括:客户机向服务器的请求消息和服务器向客户机的响应消 息.客户端向服务器发送一个请求,请求头 ...

  7. Android Http请求头与响应头的学习

    本节引言: 上节中我们对Android涉及的网络编程进行了了解,也学习了下Http的基本概念,而本节我们 要学习的是Http的请求头与响应头,当然,可以把也可以把这节看作文档,用到的时候来查查 即可! ...

  8. HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端

    协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...

  9. HTTP请求头与响应头(转载)

    欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/400503 ...

随机推荐

  1. 零基础快速入门SpringBoot2.0 (一)

    零基础快速入门SpringBoot2.0 (一) 一.SpringBoot2.x依赖环境和版本新特性说明 简介:讲解新版本依赖环境和springboot2新特性概述 1.依赖版本jdk8以上, Spr ...

  2. node的webserver模板

    const express = require('express'); const swig =require('swig'); const fs = require('fs'); //创建服务器 c ...

  3. 创建一个 Dynamic Web Project

    准备工作 一.修改 JDK Compliance level 二.创建 Dynamic Web Project Ctrl + N 三.配置网站服务器 tomcat 这里切记不要点击 Finish ,一 ...

  4. 7- vue django restful framework 打造生鲜超市 -商品类别数据展示(上)

    Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页 并没有将列表页的数据json 与前端的页面展示结合起来 讲解如果将dr ...

  5. PHP 根据IP获取地理位置

    /** * 根据用户IP获取用户地理位置 * $ip 用户ip */ function get_position($ip){ if(empty($ip)){ return '缺少用户ip'; } $u ...

  6. 宏基笔记本升级bios(2012-12-28-bd 写的日志迁移

    首先到宏基官网下载中心 去下载你需要的新版本的bios安装包如图: 我的是宏基4750g的win7旗舰版64位,这里一定要根据自己的电脑的型号和安装的系统来选择,你可以选择最新的版本也可以选择老的版本 ...

  7. windows下软件安装目录

    说明:该软件目录为自身在实际学习开发中系统下安装的目录,方便自己的查看以及和他人交流,如有软件需要,请留言,谢谢! 1) PADSVX.1.2 中级PCB绘图软件! 2) Caendece 17.2 ...

  8. pandas知识点(数据结构)

    1.Series 生成一维数组,左边索引,右边值: In [3]: obj = Series([1,2,3,4,5]) In [4]: obj Out[4]: 0 1 1 2 2 3 3 4 4 5 ...

  9. 【python学习】新手基础程序练习(二)

    Ι 继续上一节得内容,这里主要是对各种知识的理解以及如何运用. 一.执行 Python 脚本的两种方式 1.把python执行文件加到计算机的环境变量中,然后新建文件把程序写在新文件里,再通过cmd命 ...

  10. Artwork 18年中南多校第一场A

    一.题意 对于一个矩阵,若干道命令,每道命令将会把某一段格子涂黑,请问每次涂黑之后矩阵中未被涂黑的块的数量? 二.思路 保存每道命令,并且忠实的执行他,到最后一步开始搜索联通块的数量,并将其保存. 之 ...