• HTTP分段下载


    现代WEB服务器都支持大文件分段下载,加快下载速度,判断WEB服务器是否支持分段下载通过返回头是否有 Accept-Ranges: bytes 字段.分段下载分为两种,一种就是一次请求一个分段,一种就是一次请求多个分段。下面会一一讲解。

    请求分段中的一部分

    请求头部添加如下字段,0-1024代表文件最前面的1025个字节
    Range: bytes=0-1024

    Range字段支持的写法

    Range: bytes=0-1024 获取最前面1025个字节
    Range: bytes=-500   获取最后500个字节
    Range: bytes=1025-  获取从1025开始到文件末尾所有的字节
    Range: 0-0          获取第一个字节
    Range: -1           获取最后一个字节
    

    请求成功后服务器会返回状态码206, 并返回如下字段指示返回结果, 0-1024指示返回分段范围, 7877指示文件总大小
    Content-Range: bytes 0-1024/7877

    下面是用curl请求百度首页图片前面1025个字节的示例, 可以看到返回长度1025.

    请求命令

    curl -v --header Range:bytes=0-1024  "http://www.baidu.com/img/bd_logo1.png"
    

    请求头部

    GET /img/bd_logo1.png HTTP/1.1
    User-Agent: curl/7.15.5 (i386-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
    Host: www.baidu.com
    Accept: */*
    Range:bytes=0-1024
    

    返回头部

    HTTP/1.0 206 Partial Content
    Date: Sun, 06 Sep 2015 07:49:07 GMT
    Server: Apache
    Last-Modified: Wed, 03 Sep 2014 10:00:27 GMT
    ETag: "1ec5-502264e2ae4c0"
    Accept-Ranges: bytes
    Cache-Control: max-age=315360000
    Expires: Wed, 03 Sep 2025 07:49:07 GMT
    Content-Type: image/png
    Content-Range: bytes 0-1024/7877
    Content-Length: 1025
    Age: 989
    

    请求分段中的多个部分

    请求头部Range字段需要添加多个范围
    Range: bytes=0-1024,2000-3000

    请求成功后同样返回状态码206, 返回的Content-Type字段和请求一部分时不一样, 其中multipart/byteranges;指示返回的多段请求类型, boundary指示多段内容之间的分割符
    Content-Type: multipart/byteranges; boundary="Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222"

    同样我们以请求百度首页logo图片为例

    请求命令

    curl -v --header Range:bytes=0-1024,2000-3000  "http://www.baidu.com/img/bd_logo1.png"
    

    请求头部

    GET /img/bd_logo1.png HTTP/1.1
    User-Agent: curl/7.15.5 (i386-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
    Host: www.baidu.com
    Accept: */*
    Range:bytes=0-1024,2000-3000
    

    返回头部

    HTTP/1.0 206 Partial Content
    Date: Sun, 06 Sep 2015 07:49:07 GMT
    Server: Apache
    Last-Modified: Wed, 03 Sep 2014 10:00:27 GMT
    ETag: "1ec5-502264e2ae4c0"
    Accept-Ranges: bytes
    Cache-Control: max-age=315360000
    Expires: Wed, 03 Sep 2025 07:49:07 GMT
    Content-Type: multipart/byteranges; boundary="Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222"
    Content-Length: 2339
    Age: 724
    

    返回内容

    --Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222
    Content-Type: image/png
    Content-Range: bytes 0-1024/7877
    xxxx前面1025字节内容xxxxx
    --Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222
    Content-Type: image/png
    Content-Range: bytes 2000-3000/7877
    xxxx2000-3000中间1001个字节内容字节内容xxxxx
    --Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222--
    

    可以看到每段内容包含Content-Type和Content-Range字段, --boundary 表示内容分段, --boundar-- 表示内容结束.如果请求的Range字段范围超出了文件大小, 则服务器返回406错误码.

  • 相关阅读:
    mybatis源码解读(二)——构建Configuration对象
    mybatis源码解读(一)——初始化环境
    JDK1.8源码(七)——java.util.HashMap 类
    JDK1.8源码(六)——java.util.LinkedList 类
    JDK1.8源码(五)——java.util.ArrayList 类
    JDK1.8源码(四)——java.util.Arrays 类
    JDK1.8源码(三)——java.lang.String 类
    JDK1.8源码(二)——java.lang.Integer 类
    JDK1.8源码(一)——java.lang.Object类
    Java的深拷贝和浅拷贝
  • 原文地址:https://www.cnblogs.com/ourroad/p/4837271.html
Copyright © 2020-2023  润新知