chunked编码

作者: fenerchen | 来源:发表于2018-05-31 21:04 被阅读0次

    定义

    分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。

    说明

    通常,HTTP应答消息中发送的数据是整个发送的,Content-Length消息字段表示数据的长度。数据的长度很重要,因为客户端需要知道哪里是应答的结束位置,以及后续消息的开始。当时用chunked传输,数据分解成一系列数据块,并以一个或多个块发送,这样就可以直接发送数据而不是预先知道发送内容的总大小。当最后一个chunked的长度是0时,表明已经到了数据的末尾

    格式

    如果一个HTTP消息(请求消息或应答消息)的Transfer-Encoding消息头的值为chunked,那么消息体由数量未定的块组成,并以最后一个大小为0的块结束。
    每一个非空的块都以该块包含数据的字节数(字节数以十六进制表示)开始,跟随一个CRLF (回车及换行),然后是数据本身,最后块CRLF结束。在一些实现中,块大小和CRLF之间填充有白空格(0×20)。
    最后一块是单行,由块大小(0),一些可选的填充白空格,以及CRLF。最后一块不再包含任何数据,但是可以发送可选的尾部,包括消息头字段。
    消息最后以CRLF结尾。

    chunked传输的优势

    1、一般http通信时会使用content_length头信息来表示服务器发送的文档内容长度,浏览器接收到此头信息后接受完content_length中定义的长度字节后开始解析页面,但是如果服务器端有部分数据延迟发送则会出现浏览器白屏,用户体验差。
    而chunked传输,浏览器不需要等到内容字节全部下载完成,只要接收到一个chunked块就可以解析页面,并可以下载html中定义的页面内容,包括js,css,image等。
    进行chunked编码传输的http数据要在消息头部设置transfer_encoding:chunked表示content body将用chunked编码传输内容。
    2、node中文件的读写也采用流式传传输。例如使用ReadStream文件系统API.
    创建读文件流,然后有数据就处理。

    var server = http.createServer((request, response) => {
        response.writeHead(200,{'Content-Type':'img/jpg'})
      var stream=fs.createReadStream('baobao1.jpg')
      stream.on('data',(chunck)=>{
          response.write(chunck)
      })
      stream.on('end',()=>{
          response.end()
      })
    })
    server.listen(8000)
    

    还有一种管道传输,就是把一个流接到另一个流中。流对接会让代码变简单。

    var server = http.createServer((request, response) => {
        response.writeHead(200,{'Content-Type':'img/jpg'})
      var stream=fs.createReadStream('baobao1.jpg')
     stream.pipe(response)
    })
    server.listen(8000)
    

    采用数据块的形式来传输的好处:

    • 高效的内存分配。不需要把所有的数据全部写入内存,减少内存消耗
    • 数据一旦就绪就可以写入了

    相关文章

      网友评论

        本文标题:chunked编码

        本文链接:https://www.haomeiwen.com/subject/pzjcsftx.html