manbetx官方网站

HTTP断点续传原理。HTTP断点续传(分块传输)(HTTP头格式非常明白)

九月 30th, 2018  |  manbetx官方网站

HTTP 1.1默认支持断点续传。

简述

断点续传:指的是以上传/下充斥时,将任务(一个文件要压缩包)人为的细分为几独片,每一个组成部分以一个线程进行上传/下载,如果遇网络故障,可以自曾上传/下载的部分开始持续上传/下充斥不形成的有的,而无必要从头开始上传/下载。可以节省时间,提高速度。

 

  • 简述
  • 断点续传的用
  • Range
    Content-Range
  • 提高校验
    • Last-Modified
    • Etag
    • If-Range
    • 办事规律
  • 检测服务器是否支持断点续传

 

 

断点续传的用途

偶用户上传/下充斥文件要历时数时,万平等路线中断,不有断点续传的
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 代表第一个及终极一个配节 
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
a 206 Partial
Content answer with the appropriate body. If the condition is not
fulfilled, the full resource is sent back, with
a 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

标签:, , , , ,

Your Comments

近期评论

    功能


    网站地图xml地图