美文网首页Android 开发收集Android开发经验谈Android技术知识
多线程下载,断点续传技术要点---Http Header

多线程下载,断点续传技术要点---Http Header

作者: 姜康 | 来源:发表于2018-01-08 17:58 被阅读126次

    涉及到的Header


    • Accept-Ranges
    • Range
    • If-Range
    • Content-Range
    Accept-Ranges:

    表示自身支持范围请求(partial requests),字段的具体值用于定义范围请求的单位。当客户端发现Accept-Ranges时,可以尝试继续中断了的下载,而不是重新下载。

    语法:

    Accept-Ranges: bytes
    Accept-Ranges: none
    

    具体值有两种,一个是none,一个是bytes,none表示不支持任何范围请求单位,等同于没有这个header,因此很少使用;bytes表示请求的单位是bytes(字节)。

    例子:

    Accept-Ranges: bytes
    
    Range

    一个请求Header,告知服务器返回文件的哪一部分。在一个 Range Header中,可以一次性请求多个部分,服务器会以 multipart 文件的形式将其返回。

    • 如果服务器返回的是范围响应,需要使用 206 状态码(Partial Content)。

    • 假如所请求的范围不合法,那么服务器会返回 416 状态码(Range Not Satisfiable),表示客户端错误。

    • 服务器允许忽略 Range Header,从而返回整个文件,状态码用 200

    语法:

    Range: <unit>=<range-start>-
    Range: <unit>=<range-start>-<range-end>
    Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>
    Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>, <range-start>-<range-end>
    
    

    说明:

    <unit>:范围所采用的单位,通常是字节(bytes)。
    <range-start>:一个整数,表示在特定单位下,范围的起始值。
    <range-end>:一个整数,表示在特定单位下,范围的结束值。这个值是可选的,如果不存在,表示此范围一直延伸到文档结束。
    
    

    例子:

    Range: bytes=200-1000, 2000-6576, 19000-
    
    If-Range

    一个HTTP 请求头字段,用来使得 Range 头字段在一定条件下起作用

    • 当字段值中的条件得到满足时,Range 头字段才会起作用,同时服务器回复206 (部分内容状态码),以及Range 头字段请求的相应部分
    • 如果字段值中的条件没有得到满足,服务器将会返回 200 OK 状态码,并返回完整的请求资源

    If-Range 字段通常用于断点续传的下载过程中,用来自从上次中断后,确保下载的资源没有发生改变

    语法:

    If-Range: <星期>, <日> <月> <年> <时>:<分>:<秒> GMT
    If-Range: <etag>
    

    说明:

    <etag>:一个资源标签(entity tag)代表着所请求的资源。它是由被双引号包围的ACSII 编码的字符串组成的(例如"675af34563dc-tr34")。当应用弱匹配算法时,E-Tag会有一个 W/ 前缀。
    <星期>:"Mon","Tue","Wed","Thu","Fri","Sat"或者"Sun"当中的一个(大小写敏感)。
    <日>:两位数字,例如"04"或者"23"。
    <月>
    :"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov",或者"Dec"中的一个(大小写敏感)
    <年>:四位数字,例如"1990"或者"2016"。
    <时>:两位数字,例如"09"或者"23"。
    <分>:两位数字,例如"04"或者"59"。
    <秒>:两位数字,例如"04"或者"59"。
    GMT:格林威治标准时间。HTTP 协议的日期总是要使用GMT,而不是当地时间。
    

    例子:

    If-Range: Mon, 08 Jan 2018 09:11:20 GMT
    

    注意:字段值中既可以用 Last-Modified 时间值用作验证,也可以用ETag标记作为验证,但不能将两者同时使用。

    Content-Range

    响应头Header,显示的是一个数据片段在整个文件中的位置

    语法:

    Content-Range: <unit> <range-start>-<range-end>/<size>
    Content-Range: <unit> <range-start>-<range-end>/*
    Content-Range: <unit> */<size>
    

    说明:

    <size>:整个文件的大小(如果大小未知则用"*"表示)
    

    例子:

    Content-Range: bytes 200-1000/67589
    

    参考以及延伸资料

    Http 请求范围

    相关文章

      网友评论

        本文标题:多线程下载,断点续传技术要点---Http Header

        本文链接:https://www.haomeiwen.com/subject/oznbnxtx.html