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

  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(回车换行,即\r\n)结尾的一行明文,用 16 进制数字表示长度;

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

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

范围请求

  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--

13 HTTP传输大文件的方法的更多相关文章

  1. 把大象装进冰箱:HTTP传输大文件的方法

    上次我们谈到了HTTP报文里的div,知道了HTTP可以传输很多种类的数据,不仅是文本,也能传输图片,音频和视频.   早期互联网上传输的基本上都是只有几k大小的文本和小图片,现在的情况则大有不同.网 ...

  2. 基于RMI服务传输大文件的完整解决方案

    基于RMI服务传输大文件,分为上传和下载两种操作,需要注意的技术点主要有三方面,第一,RMI服务中传输的数据必须是可序列化的.第二,在传输大文件的过程中应该有进度提醒机制,对于大文件传输来说,这点很重 ...

  3. C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用

    我也遇到同样问题,所以抄下做MARK http://www.cnblogs.com/lmjq/archive/2011/07/19/2110319.html 刚做完一个binding为netTcpBi ...

  4. netty接收大文件的方法

    参考:http://blog.csdn.net/linuu/article/details/51371595 https://www.jianshu.com/p/a0a51fd79f62 netty默 ...

  5. Linux培训教程 linux系统下分割大文件的方法

    在linux中分割大文件,比如一个5gb日志文件,需要把它分成多个小文件,分割后以利于普通的文本编辑器读取. 有时,需要传输20gb的大文件,Linux培训 教程件到另一台服务器,也需要把它分割成多个 ...

  6. linux传输大文件

    http://dreamway.blog.51cto.com/1281816/1151886 linux传输大文件

  7. WCF 用netTcpbinding,basicHttpBinding 传输大文件

    问题:WCF如何传输大文件 方案:主要有几种绑定方式netTcpbinding,basicHttpBinding,wsHttpbinding,设置相关的传输max消息选项,服务端和客户端都要设置,tr ...

  8. 使用QQ传输大文件

    现在在公网上能传输大文件并且稳定支持断点续传的软件非常少了,可以使用qq来做这件事. qq传输单个文件有时候提示不能超过4g有时候提示不能超过60g,没搞明白具体怎么样. 可以使用qq的传输文件夹功能 ...

  9. TCP协议传输大文件读取时候的问题

    TCP协议传输大文件读取时候的问题 大文件传不完的bug 我们在定义的时候定义服务端每次文件读取大小为10240, 客户端每次接受大小为10240 我们想当然的认为客户端每次读取大小就是10240而把 ...

  10. php中读取大文件实现方法详解

    php中读取大文件实现方法详解 来源:   时间:2013-09-05 19:27:01   阅读数:6186 分享到:0 [导读] 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解 ...

随机推荐

  1. 快手商品详情API接口如何使用

    使用快手开的API接口获取商品详情,可按照以下步骤进行: 1.注册账号并创建应用 注册开发者账号,并在账号后台中创建一个应用,获得AppKey和AppSecret等信息.这些信息是使用API接口访问快 ...

  2. 为不断增长的Go生态系统扩展gopls

    原文在这里. 由 Robert Findley and Alan Donovan 发布于 2023年9月8日 今年夏天初,Go团队发布了gopls的v0.12版本,这是Go语言的语言服务器,它进行了核 ...

  3. RabbitMQ入门实践

    一.概述: 大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力. 1.消息服务中两个重要概念: 消息代理(message broker)和目的地(destination)当消息发送者发送 ...

  4. C# 代码实现关机

    AdvApi32.LookupPrivilegeValue(null, "SeShutdownPrivilege", out var lpLuid); using var t = ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (94)-- 算法导论9.2 3题

    三.用go语言,给出 RANDOMIZED-SELECT的一个基于循环的版本. 文心一言: 在循环中实现 RANDOMIZED-SELECT 的一个版本可以如下所示.这个版本使用 Go 语言编写,利用 ...

  6. TCP vs UDP:揭秘可靠性与效率之争

    概述 今天我们开始主要讲解TCP的相关知识点.在之前讲解分层章节的时候,我们提到过一个重要观点.在网络层及以下几层,更多的是让主机与主机建立连接,也就是说你的电脑需要知道另一台电脑在哪里才能连接上它. ...

  7. Linux 安装 helm

    下载helm压缩包,地址   https://github.com/helm/helm/releases/tag/v3.10.1 选择适合自己操作系统的包 上传解压安装 1 root@calico-m ...

  8. Modbus转Profinet网关连接三菱变频器博图快速配置

    Modbus转Profinet网关连接三菱变频器博图快速配置 本案例将分享如何使用兴达易控的modbus转profinet网关(XD-MDPN100)来连接西门子1200系列plc,并实现三菱变频器的 ...

  9. vue3 + mark.js | 实现文字标注功能

    页面效果 具体实现 新增 1.监听鼠标抬起事件,通过window.getSelection()方法获取鼠标用户选择的文本范围或光标的当前位置. 2.通过 选中的文字长度是否大于0或window.get ...

  10. pandas(进阶操作)-- 处理非数值型数据 -- 数据分析三剑客(核心)

    博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...