zoukankan      html  css  js  c++  java
  • http范围请求


    基于范围请求 可以实现 断点续传多线程分片下载

    HTTP/1.1之后才支持,需要双端都支持 

    服务端头信息中有 Accept-Ranges:bytes 表明服务器支持范围请求

    curl -I  "http://www.gnu.org/software/gettext/manual/gettext.html"   
    
    HTTP/1.1 200 OK
    Date: Sat, 08 Sep 2018 14:31:38 GMT
    Server: Apache/2.4.7
    Access-Control-Allow-Origin: (null)
    Accept-Ranges: bytes
    Vary: Accept-Encoding
    Cache-Control: max-age=0
    Expires: Sat, 08 Sep 2018 14:31:38 GMT
    Content-Length: 1408775
    Content-Type: text/html
    Content-Language: en

    范围请求:

    http code 返回  206 Partial Content

    客户端请求头:Content-Range: bytes 0-1408774/1408775

    start-end/content-length

    end 最大为 content-length - 1, start 从0开始, 包括开始和结束值,超过范围有可能返回 HTTP 416 Range Not Satisfiable  ,有的服务器会自动修正

    Range 还有几种不同的方式来限定范围,可以根据需要灵活定制:
    1. 500-1000:指定开始和结束的范围,一般用于多线程下载。
    2. 500- :指定开始区间,一直传递到结束。这个就比较适用于断点续传、或者在线播放等等。
    3. -500:无开始区间,只意思是需要最后 500 bytes 的内容实体。
    4. 100-300,1000-3000:指定多个范围,这种方式使用的场景很少,了解一下就好了

    范围请求示例:

    范围请求需要在head中增加 Range: bytes=0-10

    curl -I -r 0-100 "http://www.gnu.org/software/gettext/manual/gettext.html"

    curl -H "Range: bytes=0-10"  http://www.gnu.org/software/gettext/manual/gettext.html
    HTTP/1.1 206 Partial Content Date: Sat, 08 Sep 2018 14:28:04 GMT Server: Apache/2.4.7 Access-Control-Allow-Origin: (null) Accept-Ranges: bytes Vary: Accept-Encoding Cache-Control: max-age=0 Expires: Sat, 08 Sep 2018 14:28:04 GMT Content-Range: bytes 0-100/1408775 # 本次返回内容的 开始-结束/总长度 Content-Length: 101 #本次返回的总长度 Content-Type: text/html Content-Language: en

     资源变化

      有时下载的过程中资源可以能已经发生变化了这时就需要重新下载, 可以通过 ETag 或者 Last-Modified 来标识当前资源是否变化

    ETag:当前文件的一个验证令牌指纹,用于标识文件的唯一性。
    Last-Modified:标记当前文件最后被修改的时间。

    只需要在头信息中传入 etag或 Last-Modified的值,若果资源没有发生变化会继续返回206,否则返回200,此时需要重新下载

    If-Range: xxx

    If-Range 必须与 Range 配套使用。如果没有 Range,那么 If-Range 就会被忽略。
    如果服务器不支持 If-Range,那么 Range 也会被忽略。

    Etag(Entity Tags)主要为了解决 Last-Modified 无法解决的一些问题。
    1、某些文件周期性改变,但内容没变,只是时间变了
    2、某些文件改变非常频繁(1s变化n次),后者只可以精确到秒
    3、某些服务器不能精确得到文件的修改时间

    参考:https://juejin.im/post/5b555f055188251af25700aa

  • 相关阅读:
    spring---aop(1)---AOP概念
    spring---transaction(6)---事务的配置
    spring---transaction(5)---事务的体系
    spring---transaction(4)---源代码分析(事务的状态TransactionStatus)
    spring---transaction(3)---源代码分析(事务的管理器PlatformTransactionManager)
    spring---transaction(2)---源代码分析(事务的定义TransactionDefinition)
    spring---transaction(1)---源代码分析(事务的拦截器TransactionInterceptor)
    mybatis源码分析(8)-----事务(mybatis管理、spring管理)
    mybatis源码分析(7)-----缓存Cache(一级缓存,二级缓存)
    mybatis源码分析(6)-----核心调度对象StatmentHandler
  • 原文地址:https://www.cnblogs.com/siqi/p/9610896.html
Copyright © 2011-2022 走看看