M. HTTP传输大文件的方法

187 阅读1分钟

image.png

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

数据压缩, 把大文件变小

启动压缩算法,来提升传输效率。

涉及请求头:

  • Accept-Encoding
  • Content-Encoding

分块传输,化整为零

报文中内容分多次,分成许多块,逐个发送。有点类似乐高。

涉及请求头:

  • Tranfer-Encoding: chunked

image.png

分块传输具体的规则:
1.每个分块包含两个部分,长度头和数据块
2.长度头以CRLF结束的一行明文,16进制数据表示;
3.数据块紧跟在长度后面,最后已CRLF结束,但数据不包含CRLF;
4.最后用一个长度为0的块标识结束;

image.png

范围请求

相当于客户端的“化整为零”,服务端响应报文携带该头,表明支持范围请求的。 如果服务端不支持,那只能老老实实的收发整块文件了。

涉及请求头:

  • 响应头:Accept-Ranges:bytes
  • 请求头:Range: bytes=x-y

x:起点 - y:终点
0-: 0 至 最后;
10-: 10 至 最后;
-1: 文档最后一个字节;
-10: 文档最后10个字节;

服务器收到Range后,处理步骤:

  1. 检查返回合法性,如果文件只有100字节,请求Range为200-300,越界返回416,客户端检查;
  2. 根据Range计算偏移量,返回206,表示body是原数据的一部分;
  3. 服务器报文实体头增加“Content-Range”,告诉客户端该片段的实际偏移量,格式是 "bytes x-y/length";
  4. 发送请求。

image.png

多段数据

上述是一次获取一个片段数据。

涉及请求头:

  • MIME: multipart/byteranges; boundary=xxxx
  • Range:x-y, j-k image.png

请求实例wireShark抓包 image.png image.png