HTTP 1.1暗许援助断点续传。

简述

断点续传:指的是在上传/下载时,将任务(3个文书或压缩包)人为的剪切为多少个部分,每1个片段应用多少个线程举办上传/下载,假如遇上网络故障,能够从已经上传/下载的局地起初一而再上传/下载未到位的片段,而从未须要从头开始上传/下载。能够节省时间,提升速度。

 

 

 

断点续传的用处

有时候用户上传/下载文件需求历时数钟头,万一线路中断,不负有断点续传的
HTTP/FTP 服务器或下载软件就只可以从头重传,相比好的 HTTP/FTP
服务器或下载软件具有断点续传能力,允许用户从上传/下载断线的地点继续传送,那样大大缩小了用户的郁闷。

常见的扶助断点续传的上传/下载软件:QQ
旋风、迅雷、快车、电驴、酷⑥ 、土豆、优酷、百度录像、天涯论坛录像、腾讯录像、百度云等。

在 Linux/Unix 系统下,常用援助断点续传的 FTP 客户端软件是 lftp。

关联header如下:

Range & Content-Range

HTTP1.1
协议(福睿斯FC2616)早先支持获取文件的一些情节,那为并行下载以及断点续传提供了技术辅助。它通过在
Header 里多少个参数完成的,客户端发请求时对应的是 Range
,服务器端响应时对应的是 Content-Range。

Range

用来请求头中,内定第三个字节的岗位和倒数字节的岗位,一般格式:

Range:(unit=first byte pos)-[last byte pos]

Range 底部的格式有以下两种状态:

Range: bytes=0-499 表示第 0-499 字节范围的内容 
Range: bytes=500-999 表示第 500-999 字节范围的内容 
Range: bytes=-500 表示最终 500 字节的内容 
Range: bytes=500- 表示从第 500 字节起初到文件甘休部分的内容 
Range: bytes=0-0,-1 代表第三个和最后叁个字节 
Range: bytes=500-600,601-999 同时钦命几个范围

Content-Range

用于响应头中,在产生带 Range 的请求后,服务器会在 Content-Range
尾部重临当前领受的限量和文书总大小。一般格式:

Content-Range: bytes (unit first byte pos) – [last byte
pos]/[entity legth]

例如:

Content-Range: bytes 0-499/22400

0-499 是指当前出殡的数量的限制,而 22400 则是文件的总大小。

而在响应达成后,重回的响应头内容也不比:

HTTP/1.1 200 Ok(不行使断点续传格局) 
HTTP/1.1 206 Partial Content(使用断点续传格局)

 

做实校验

在其实情状中,会冒出一种情况,即在极端发起续传请求时,ULX570L
对应的文本内容在劳务器端已经爆发变化,此时续传的多少一定是荒唐的。如何消除那一个标题了?鲜明此时须要有一个标识文件唯一性的措施。

在 XC60FC2616 中也有对应的概念,比如完毕 Last-Modified
来标识文件的末尾修改时间,那样即可判断出续传文书时是不是曾经发生过改变。同时
FC2616 中还定义有一个 ETag 的头,能够选取 ETag 头来放置文件的绝无仅有标识。

Range:用于客户端到服务端的请求,可以通过改字段钦定下载文件的某一段大小及其单位,字节偏移从0初步。典型格式:

Last-Modified

If-Modified-Since,和 Last-Modified 一样都是用来记录页面最后修改时间的
HTTP 头音信,只是 Last-Modified 是由服务器往客户端发送的 HTTP 头,而
If-Modified-Since
则是由客户端往服务器发送的头,能够观看,再度呼吁当地存在的 cache
页面时,客户端会通过 If-Modified-Since 头将原先服务器端发过来的
Last-Modified
最终修改时间戳发送回去,那是为了让服务器端举办求证,通过那个日子戳判断客户端的页面是不是是最新的,假设不是最新的,则赶回新的剧情,假使是新型的,则赶回
304 告诉客户端其地面 cache
的页面是时髦的,于是客户端就能够间接从当地加载页面了,这样在网络上传输的数码就会大大减弱,同时也减轻了服务器的承受。

    Ranges:    (unit=first byte pos)-[last byte pos]

Etag

Etag(Entity Tags)首要为了消除 Last-Modified 一点都不大概缓解的一对难点。

  1. 一对文件也许会周期性的更动,可是内容并不更改(仅改变修改时间),这时候大家并不期望客户端认为那几个文件被修改了,而再度GET。
  2. 一点文件修改11分频仍,例如:在秒以下的岁月内举办改动(1s 内修改了 N
    次),If-Modified-Since 能检查到的粒度是 s
    级的,那种修改不能够断定(或然说 UNIX 记录 MTIME 只好精确到秒)。
  3. 一些服务器不能够确切的获取文件的末梢修改时间。

为此,HTTP/1.1 引入了 Etag。Etag
仅仅是三个和文件有关的符号,能够是一个本子标记,例如:v1.0.0;恐怕说
“627-4d648041f6b80” 这么一串看起来很隐衷的编码。不过 HTTP/1.1
标准并不曾明显 Etag 的始末是什么只怕说要怎么落实,唯一规定的是 Etag
须求放在 “” 内。

    Ranges:    bytes=五千- 下载从第伍仟字节起头到文件甘休部分

If-Range

用以判断实体是或不是发生变动,若是实体未改变,服务器发送客户端丢失的一些,不然发送全数实体。一般格式:

If-Range: Etag | HTTP-Date

爱博体育,也等于说,If-Range 能够采纳 Etag 大概 Last-Modified 再次回到的值。当没有
ETage 却有 Last-modified 时,能够把 Last-modified 作为 If-Range
字段的值。

例如:

If-Range: “627-4d648041f6b80” 
If-Range: Fri, 22 Feb 2013 03:45:02 GMT

If-Range 必须与 Range 配套使用。如若请求报文中尚无 Range,那么 If-Range
就会被忽略。要是服务器不支持 If-Range,那么 Range 也会被忽视。

倘若请求报文中的 Etag 与服务器目的内容的 Etag
相等,即没有爆发变化,那么应答报文的事态码为
206。假设服务器指标内容发生了扭转,那么应答报文的状态码为 200。

用来校验的任何 HTTP
头信息:If-Match/If-None-Match、If-Modified-Since/If-Unmodified-Since。

    Ranges:    bytes=0~N 下载第0-N字节范围的始末

行事规律

Etag 由劳动器端生成,客户端通过 If-Range
条件判断请求来证实财富是还是不是修改。请求一个文本的流水生产线如下:

首先次呼吁:

  1. 客户端发起 HTTP GET 请求叁个文书。
  2. 服务器处理请求,再次来到文件内容以及对应的 Header,个中囊括
    Etag(例如:627-4d648041f6b80)(假使服务器帮衬 Etag 生成并已拉开了
    Etag)状态码为 200。

第四回呼吁(断点续传):

  1. 客户端发起 HTTP GET 请求1个文本,同时发送
    If-Range(该头的始末便是首先次呼吁时服务器重回的
    Etag:627-4d648041f6b80)。
  2. 服务器判断接受到的 Etag 和总结出来的 Etag
    是或不是匹配,假使匹配,那么响应的情况码为 206;不然,状态码为 200。

    Ranges:    bytes=M-N 下载第M-N字节范围的内容

检查和测试服务器是不是协助断点续传

CU奥迪Q3L 完成检测:

[root@localhost ~]# curl -i --range 0-9 http://www.baidu.com/img/bdlogo.gif
HTTP/1.1 206 Partial Content
Date: Mon, 21 Nov 2016 05:26:29 GMT
Server: Apache
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Set-Cookie: BAIDUID=0CD0E23B4D4F739954DFEDB92BE6CE03:FG=1; expires=Tue, 21-Nov-17 05:26:29 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Last-Modified: Fri, 22 Feb 2013 03:45:02 GMT
ETag: "627-4d648041f6b80"
Accept-Ranges: bytes
Content-Length: 10
Cache-Control: max-age=315360000
Expires: Thu, 19 Nov 2026 05:26:29 GMT
Content-Range: bytes 0-9/1575
Connection: Keep-Alive
Content-Type: image/gif

GIF89a[root@localhost ~]#

能够找到 Content-Range,则表明服务器扶助断点续传。有个别服务器还会回去
Accept-Ranges,输出结果 Accept-Ranges: bytes
,表明服务器支持按字节下载。

http://blog.csdn.net/liang19890820/article/details/53215087

    Ranges:    bytes=-N 下载最终N字节内容

 

If-Range:用于客户端到服务端的请求,用于判断实体是还是不是产生变动,必须与Range协作使用。若实体未被涂改,则响应所贫乏的那部分;不然,响应整个新的实业。

The If-Range HTTP request header makes a range request conditional:
if the condition is fulfilled, the range request will be issued and the
server sends back
206 Partial
Content answer with the appropriate body. If the condition is not
fulfilled, the full resource is sent back, with
200 OK status.

 

Accept-Ranges:用于server到client的对答,client通过该自段判断server是或不是帮衬断点续传。

    Accept-Ranges:bytes    表示帮助以bytes为单位开始展览传输。

    Accept-Ranges:none     表示不支持断点续传

 

Content-Ranges:用于sever到client的回复,与Accept-Ranges在同贰个报文内,通过该字段内定了回去的文本能源的字节范围。格式如下:

    Content-Ranges:bytes M-N/size 大小为size的文本的第M-N字节范围的内容

 

关于ETag

ETag用于标识/保障文件的唯一性、完整性,每便文件有更新该值就会转移。

 

关于HTTP 206

断点续传,就算回到文件的一片段,则采纳HTTP
206状态码;借使回到整个文件,则使用HTTP 200响应码。

HTTP/1.1 200 OK(不使用断点续传)

HTTP/1.1 206 Partial Content(使用断点续传)

 

HTTP/1.1 206 Partial Content

Server: nginx/1.4.2

Date: Fri, 20 Oct 2017 03:28:44 GMT

Content-Type: application/octet-stream

Content-Length: 11

Last-Modified: Tue, 25 Aug 2015 08:56:26 GMT

Connection: keep-alive

ETag: “55dc2dba-14dd5b”

Content-Range: bytes 0-10/1367387

 

断点续传检查:

curl -i –range 0-9 url   
响应中包罗Accept-Range也许Content-Ranges则意味援助。

 

参考:

If-Range:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Range