• 13 HTTP传输大文件的方法


    如何在有限的带宽下高效快捷传输大文件?

    1. 数据压缩

    2. 分块传输

    3. 范围请求

    4. 多段数据

    数据压缩

    1. 思路:把大文件整体变小

    2. 浏览器发送请求时,请求头字段Accept-Encoding是浏览器支持的压缩格式列表,如 gzip,deflate,br;服务器选择一种压缩算法,放到响应头Content-Encoding中,再把压缩数据压缩后发给浏览器。

    3. gzip 等压缩算法只对文本文件有较好的压缩率,而图片、音频文件已经是高度压缩的,再使用gzip 处理也不会变小,所以失效。

    分块传输

    1. 思路:化整为零,把文件分解成小块,分批发送给浏览器,浏览器收到后再组装复原。

    2. chunked 分块传输编码:响应报文头字段“Transfer-Encoding:chunked”表示,意思是报文的body部分不是一次性发过来的,而是分成了许多的块(chunk)传输。

    3. Transfer-Encoding 与 Content-Length 互斥,因为要么响应报文的传输长度未知,要么已知。

    4. 分块传输的编码规则:

      1. 每个分块包含两个部分,长度头和数据块;

      2. 长度头是以 CRLF(回车换行,即 )结尾的一行明文,用 16 进制数字表示长度;

      3. 数据块紧跟在长度头后,最后也用 CRLF 结尾,但数据不包含 CRLF;

      4. 最后用一个长度为 0 的块表示结束,即“0 ”。

    范围请求

    1. 范围请求(range request):允许客户端再请求头里面是有专用字段来表示只获取文件的一部分,相当于客户端的“化整为零”。

    2. 服务器在响应头使用“Accept-Ranges:bytes” 明确告知客户端,支持范围请求,但是非必须。

    3. 发送 “Accept-Ranges:none” 或不发送“Accept-Ranges:bytes” ,表示服务器不支持范围请求功能。

    4. 格式:“Accept-Ranges:bytes=x-y”

      • x,y表示偏移量,从0开始计数,单位是字节
      • x或y可以省略,“0-”表示文档起点到终点;“10-”表示从第10个字节开始到文档末尾;“-1”表示文档最后一个字节;“-10”表示文档末尾的10个字节。
    5. 服务器收到Range 字段后要做四件事情

      1. 检查范围是否合法,如果范围越界,返回状态码“416”,表示“请求范围有误,服务器无法处理,请再检查一下”
      2. 范围正确,服务器根据Range头计算偏移量,读取文件的片段,返回状态码“206 Partial Content”,表示body是原数据一部分。
      3. 服务器添加一个响应头字段“Content-Range”,告诉片段的实际偏移量和资源大小,格式“bytes x-y/length”,与Range 头的区别是没有“=”,范围长度后面多了总长度。
      4. 发送数据,直接把片段用TCP发给客户端,一个范围请求就处理完成。

    多段数据

    1. 范围请求支持一次只获取一个片段,也支持一次性获取多个片段数据
      2.多个片段用特殊的MIME 类型:“multipart/byteranges”表示,代表报文的body 是多段字节序列组成,加参数“boundary=xxx”给出段之间的分隔标记。
    2. 举例
      • 请求:
    GET /16-2 HTTP/1.1
    Host: www.chrono.com
    Range: bytes=0-9, 20-29
    
    • 响应:
    HTTP/1.1 206 Partial Content
    Content-Type: multipart/byteranges; boundary=00000000001
    Content-Length: 189
    Connection: keep-alive
    Accept-Ranges: bytes
    
    
    --00000000001
    Content-Type: text/plain
    Content-Range: bytes 0-9/96
    
    // this is
    --00000000001
    Content-Type: text/plain
    Content-Range: bytes 20-29/96
    
    ext json d
    --00000000001--
    
  • 相关阅读:
    OpenDiscussion_DataDrivenDesign
    WPF Auto LogOff
    Visual Studio模板
    我的TDD实践---UnitTest单元测试
    我的TDD实践---TDD概念篇
    我的TDD实践---SVN架设篇
    我的TDD实践---CI持续集成
    CSharpThinking---C#版本总结(附加三)
    CsharpThinking---代码契约CodeContract(八)
    c++文件偏移
  • 原文地址:https://www.cnblogs.com/hqq2019-10/p/14779002.html
Copyright © 2020-2023  润新知