可以从已经上传/下载的一对初叶连续上传/下载未到位的一些,~N 下载第0-N字节范围的始末

HTTP 1.1默认匡助断点续传。

简述

断点续传:指的是在上传/下载时,将任务(一个文书或压缩包)人为的剪切为多少个部分,每一个有的应用一个线程举办上传/下载,倘诺遇上网络故障,可以从已经上传/下载的局部初步连续上传/下载未到位的片段,而没有必要从头起始上传/下载。可以节省时间,提升速度。

 

 

 

断点续传的用途

偶然用户上传/下载文件需要历时数钟头,万一路线中断,不拥有断点续传的
HTTP/FTP 服务器或下载软件就只可以从头重传,相比较好的 HTTP/FTP
服务器或下载软件具有断点续传能力,允许用户从上传/下载断线的地方继续传送,这样大大收缩了用户的烦恼。

广大的支撑断点续传的上传/下载软件:QQ
旋风、迅雷、快车、电驴、酷6、土豆、优酷、百度视频、乐乎视频、腾讯录像、百度云等。

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

关联header如下:

Range & Content-Range

HTTP1.1
协议(RFC2616)初步帮助获取文件的部分内容,这为并行下载以及断点续传提供了技术襄助。它经过在
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 表示第一个和末段一个字节 
公海赌船710,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(使用断点续传格局)

 

加强校验

在骨子里情状中,会产出一种情状,即在终端发起续传请求时,URL
对应的文书内容在服务器端已经暴发变化,此时续传的数量肯定是漏洞百出的。怎么着解决这多少个题材了?分明此时需要有一个标识文件唯一性的办法。

在 RFC2616 中也有对应的概念,比如实现 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. 一些文件修改非常频繁,例如:在秒以下的时刻内开展修改(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=4000- 下载从第4000字节开首到文件停止部分

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 请求一个文本,同时发送
    If-Range(该头的内容就是首先次呼吁时服务器再次回到的
    Etag:627-4d648041f6b80)。
  2. 服务器判断接受到的 Etag 和总结出来的 Etag
    是否匹配,假使配合,那么响应的境况码为 206;否则,状态码为 200。

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

检测服务器是否帮忙断点续传

CURL 实现检测:

[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

相关文章