http 使用chunk方式优化文件传输-原理

910 阅读2分钟

在做文件下载的时候一般使用分块的方式响应文件内容,但很多时候很少考虑到如何基于服务内存和传输来考虑进行文件下载优化,下面我来给大家介绍两种基于Http传输上的优化方式。chunk顾名思义就是分块,那如何进行chunk分块和怎么样的方式处理是本文介绍的重点。

1、http伪chunk方式

我称之为伪chunk模式是由于它并没有使用http chunk协议进行传输而是采用分块发送的方式,我们看一下http协议中的content-length,设置content-length表明我们要传输给客户端的数据长度,我称之为伪chunk模式就是说http头中的content-length依然要设置值,而在发送文件内容的时候使用分块读取分块发送的方式直到数据发送完成。使用这种伪chunk模式是考虑到网络带宽链路瓶颈的问题进行分块发送。http伪chunk模式使用wireshark等工具是很难分析出来的只是我们分块发送而已。

2、http chunk协议方式

http chunk协议提供了分块传输协议,我们通过分块读取内容来构建http chunk协议包来发送内容。既然是chunk 协议那我们就无需使用content-length来告诉浏览器body的长度。http header中transfer-encoding=chunked来告知浏览器我的内容是分块传输的等发送结束标识后再对http body进行处理。

http chunk协议

http头信息\color{red} http头信息

chunk(1)\color{green} ------chunk块(1)---------

chunk分块长度(十六进制字符串标识长度)

0x0d 0x0a (\r\n)

chunk数据内容

0x0d 0x0a (\r\n)

chunk(1)\color{green}------chunk块(1)-----------

chunk(N)\color{green} ------chunk块(N)-----------

chunk分块长度(十六进制字符串标识长度)

0x0d 0x0a (\r\n)

chunk数据内容

0x0d 0x0a (\r\n)

chunk(N)\color{green} ------chunk块(N)-----------

chunk结束\color{blue} ------chunk结束-----------

chunk分块长度(十六进制字符串标识长度)

0 长度为0表示结束

0x0d 0x0a (\r\n)

0x0d 0x0a (\r\n)

chunk结束\color{blue} ------chunk结束-----------