精华内容
下载资源
问答
  • 断点续传.rar断点续传断点续传
  • 断点续传

    万次阅读 2020-09-02 18:01:06
    【1】断点续传 【1】断点续传 参考资料 HTTP/1.1开始支持断点续传了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。 Range #用于客户端到服务端的请求,可以...

    【1】断点续传


    【1】断点续传
    参考资料

    HTTP/1.1开始支持断点续传了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。
    
    
    • Range
    #用于客户端到服务端的请求,可以通过改字段指定下载文件的某一段大小及其单位,字节偏移从0开始。典型格式:
        Ranges: (unit=first byte pos)-[last byte pos]
        Ranges: bytes=4000- 下载从第4000字节开始到文件结束部分
        Ranges: bytes=0~N 下载第0-N字节范围的内容
        Ranges: bytes=M-N 下载第M-N字节范围的内容
        Ranges: bytes=-N 下载最后N字节内容
    #说明:
    	1.这个数据区间是个闭合区间,起始值是0,所以“Range: bytes=0-1”这样一个请求实际上是在请求开头的2个字节。
    	2.“Range: bytes=-200”,它不是表示请求文件开始位置的201个字节,而是表示要请求文件结尾处的200个字节。
    	3.如果last byte pos小于first byte pos,那么这个Range请求就是无效请求,server需要忽略这个Range请求,然后回应一个200,把整个文件发给client。
    	4.如果last byte pos大于等于文件长度,那么这个Range请求被认为是不能满足的,server需要回应一个416,Requested range not satisfiable。
    #示例解释:
    	表示头500个字节:bytes=0-499
    	表示第二个500字节:bytes=500-999
    	表示最后500个字节:bytes=-500
    	表示500字节以后的范围:bytes=500-
    	第一个和最后一个字节:bytes=0-0,-1
    	同时指定几个范围:bytes=500-600,601-999
    
    • Content-Range
    用于响应头,指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。
    在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。
    一般格式:
    	Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth] 
    	
    
    • Header示例
    #请求
    	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:文件总大小
    #说明
    1.断点续传服务端返回的HTTP状态码应该是206,而不是200。
    2.在实际场景中,会出现一种情况,即在终端发起续传请求时,URL对应的文件内容在服务端已经发生变化,此时续传的数据肯定是错误的。
    	如何解决这个问题了?显然此时我们需要有一个标识文件唯一性的方法。
    	在RFC2616中也有相应的定义,比如实现Last-Modified来标识文件的最后修改时间,这样即可判断出续传文件时是否已经发生过改动。
    	同时RFC2616中还定义有一个ETag的头,可以使用ETag头来放置文件的唯一标识,比如文件的MD5值。
    	终端在发起续传请求时应该在HTTP头中申明If-Match 或者If-Modified-Since 字段,帮助服务端判别文件变化。
    	另外RFC2616中同时定义有一个If-Range头,终端如果在续传是使用If-Range。If-Range中的内容可以为最初收到的ETag头或者是Last-Modfied中的最后修改时候。
    	服务端在收到续传请求时,通过If-Range中的内容进行校验,校验一致时返回206的续传回应,不一致时服务端则返回200回应,回应的内容为新的文件的全部数据。
    	
    

    HTTP Header 说明

    • ETag
    ETag 是 Entity Tag 的缩写,中文译过来就是实体标签的意思。ETag是HTTP1.1中才加入的一个属性,用来帮助服务器控制Web端的缓存验证。
    它的原理是这样的,当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值(3f80f-1b6-3e1cb03b)并通过 ETag 返回给浏览器,
    浏览器把"3f80f-1b6-3e1cb03b" 和 A 同时缓存在本地,当下次再次向服务器请求A时,会通过类似 If-None-Match: "3f80f-1b6-3e1cb03b" 的请求头把ETag发送给服务器,
    服务器再次计算A的哈希值并和浏览器返回的值做比较,如果发现A发生了变化就把A返回给浏览器(200),如果发现A没有变化就给浏览器返回一个304未修改。
    这样通过控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客户端。
    
    • If-None-Match
    与If-Match相反。
    当且仅当服务器上没有任何资源的 ETag 属性值与这个首部中列出的相匹配的时候,服务器端会才返回所请求的资源,响应码为  200  。
    对于其他方法来说,当且仅当最终确认没有已存在的资源的  ETag 属性值与这个首部中所列出的相匹配的时候,才会对请求进行相应的处理。
    当与  If-Modified-Since  一同使用的时候,If-None-Match 优先级更高。
    示例:
    	If-None-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
    	If-None-Match: W/"67ab43", "54ed21", "7892dd"
    	If-None-Match: *
    
    • If-Modified-Since
    If-Modified-Since会告知服务器若If-Modifed-Since字段值早于资源的更新时间,则希望服务端能处理该请求;
    若If-Modifed-Since字段值晚于资源的更新时间,则返回状态码304 Not Modified的响应。
    作用:用于确定代理或客户端拥有的本地资源的有效性。
    
    • If-Match
    服务端有个ETag(实体标记)的字段,与特定资源关联的确定值,当资源更新后Etag也会随之更新。
    所以当客户端If-Match的值若与服务端的ETag一致,才会执行请求,否则会拒绝412。
    
    • If-Unmodified-Since:
     从字面上看, 意思是: 如果从某个时间点算起, 文件没有被修改.....
    如果没有被修改: 则开始`继续'传送文件: 服务器返回: 200 OK
    如果文件被修改: 则不传输, 服务器返回: 412 Precondition failed (预处理错误)
    
    • If-Range
    它告知服务器若指定的If-Range字段值和请求资源的ETag值一致时,则作为范围请求处理,否则返回全部资源。
    (这样做也是合理的,因为ETag不变,说明资源未变,则直接返回客户端请求的资源即可;若资源改变,请求的部分资源没有了,应该返回所有的新资源)
    若不用If-Range,则需要发两次请求。因为若资源改变,会返回客户端412;客户端再发起请求,获得新资源。
    
    展开全文
  • webuploader断点续传

    2020-03-07 00:12:19
    webuploader断点续传,webuploader断点续传webuploader断点续传webuploader断点续传
  • 单文件Http工具类,支持GET,POST,断点续传,多线程断点续传

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,292
精华内容 4,916
关键字:

断点续传