所谓断点续传,也就是要从文件已经下载的地方开始继续下载。在以前版本的 HTTP 协议是不支持断点的,HTTP/1.1 开始就支持了。一般断点下载时才用到 Range 和 Content-Range 实体头。
Range
用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:
Range:(unit=first byte pos)-[last byte pos]
Content-Range
用于响应头,指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
请求下载整个文件:
GET /test.rar HTTP/1.1
Connection: close
Host: 116.1.219.219
Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头
一般正常回应
HTTP/1.1 200 OK
Content-Length: 801
Content-Type: application/octet-stream
Content-Range: bytes 0-800/801 //801:文件总大小
If-Range = “If-Range” “:” ( entity-tag | HTTP-date )
IF-Range头部需配合Range,如果没有Range参数,则If-Range会被视为无效。
如果If-Range匹配上,那么客户端已经存在的部分是有效的,服务器将返回缺失部分,也就是Range里指定的,然后返回206(Partial content),否则证明客户端的部分已无效(可能已经更改),那么服务器将整个实体内容全部返回给客户端,同时返回200OK
1. 如果不满足If-None-Match,也就是任何一个Etag匹配了,那服务器就不会产生该请求的响应(412返回)。除非判断其它条件如If-Modified-Since不成立(也就是since的时间后内容没有更改),那server根据不同的请求方式发出不同的响应头,如果是GET或HEAD请求,这种情况就要响应304 Not modified,顺便带上cache相关的头信息,特别是匹配上的Etag; 如果是其它请求方式,那就响应412Precondition Failed了
2.如果If-None-Match成立,也就是一个Etag也没匹配,那服务器会忽略任何其它诸如If-Modified-Since的条件,就不能再产生304的响应头了
HTTP返回码总结
HTTP协议状态码表示的意思主要分为五类,大体是:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1×× 保留
2×× 表示请求成功地接收
3×× 为完成请求客户需进一步细化请求
4×× 客户错误
5×× 服务器错误
Continue
指示客户端应该继续请求。回送用于通知客户端此次请求已经收到,并且没有被服务器拒绝。
客户端应该继续发送剩下的请求数据或者请求已经完成,或者忽略回送数据。服务器必须发送
最后的回送在请求之后。
Switching Protocols
服务器依照客服端请求,通过Upgrade头信息,改变当前连接的应用协议。服务器将根据Upgrade头立刻改变协议
在101回送以空行结束的时候。
Successful
=================================
OK
指示客服端的请求已经成功收到,解析,接受。
Created
请求已经完成并一个新的返回资源被创建。被创建的资源可能是一个URI资源,通常URI资源在Location头指定。回送应该包含一个实体数据
并且包含资源特性以及location通过用户或者用户代理来选择合适的方法。实体数据格式通过煤体类型来指定即content-type头。最开始服务 器
必须创建指定的资源在返回201状态码之前。如果行为没有被立刻执行,服务器应该返回202。
Accepted
请求已经被接受用来处理。但是处理并没有完成。请求可能或者根本没有遵照执行,因为处理实际执行过程中可能被拒绝。
Non-Authoritative Information
No Content
服务器已经接受请求并且没必要返回实体数据,可能需要返回更新信息。回送可能包含新的或更新信息由entity-headers呈现。
Reset Content
服务器已经接受请求并且用户代理应该重新设置文档视图。
Partial Content
服务器已经接受请求GET请求资源的部分。请求必须包含一个Range头信息以指示获取范围可能必须包含If-Range头信息以成立请求条件。
Redirection
==================================
Multiple Choices
请求资源符合任何一个呈现方式。
Moved Permanently ——重定向
请求的资源已经被赋予一个新的URI。
Found
通过不同的URI请求资源的临时文件。
See Other
Not Modified
如果客服端已经完成一个有条件的请求并且请求是允许的,但是这个文档并没有改变,服务器应该返回304状态码。304
状态码一定不能包含信息主体,从而通常通过一个头字段后的第一个空行结束。
Use Proxy
请求的资源必须通过代理(由Location字段指定)来访问。Location资源给出了代理的URI。
Unused
Temporary Redirect
Client Error
=====================
Bad Request
因为错误的语法导致服务器无法理解请求信息。
Unauthorized
如果请求需要用户验证。回送应该包含一个WWW-Authenticate头字段用来指明请求资源的权限。
Payment Required
保留状态码
Forbidden
服务器接受请求,但是被拒绝处理。
Not Found
服务器已经找到任何匹配Request-URI的资源。
Menthod Not Allowed
Request-Line请求的方法不被允许通过指定的URI。
Not Acceptable
Proxy Authentication Required
Reqeust Timeout
客服端没有提交任何请求在服务器等待处理时间内。
Conflict
Gone
Length Required
服务器拒绝接受请求在没有定义Content-Length字段的情况下。
Precondition Failed
Request Entity Too Large
服务器拒绝处理请求因为请求数据超过服务器能够处理的范围。服务器可能关闭当前连接来阻止客服端继续请求。
Request-URI Too Long
服务器拒绝服务当前请求因为URI的长度超过了服务器的解析范围。
Unsupported Media Type
服务器拒绝服务当前请求因为请求数据格式并不被请求的资源支持。
Request Range Not Satisfialbe
Expectation Failed
Server Error
===================================
Internal Server Error
服务器遭遇异常阻止了当前请求的执行
Not Implemented
服务器没有相应的执行动作来完成当前请求。
Bad Gateway
Service Unavailable
因为临时文件超载导致服务器不能处理当前请求。
Gateway Timeout
Http Version Not Supported