HTTP协议响应头之Transfer-Encoding:分块传输详解
Http Connection有两种连接方式:短连接和长连接;短连接即一次请求对应一次TCP连接的建立和销毁过程,而长连接是多个请求共用同一个连接这样可以节省大量连接建立时间提高通信效率。目前主流浏览器都会在请求头里面包含Connection:keep-alive字段,该字段的作用就是告诉HTTP服务器响应结束后不要关闭连接,浏览器会将建立的连接缓存起来,当在有限时效内有再次对相同服务器发送请求时则直接从缓存中取出连接进行通信。当然被缓存的连接如果空闲时间超过了设定值(如firefox为115s,IE为60s)则会关闭连接。

当使用短连接的时候Recipient可以通过服务器端对Connection的关闭来正确获得消息体的结束位置;但长连接的时候Recipient怎么正确得知相邻两次请求的响应内容的分界位置呢?主要是采用设置响应头Content-Length或者Transfer-Encoding:chunked的方法来解决这一问题。
Chunked transfer encoding是一种数据传输机制,将消息体分成若干块从Server传输到Recipient(接收者);目前采用chunked传输方式比较多,为什么要采用chunked下面会说;如果不采用chunked传输方式则必须设置Content-Length字段,以便使Recipient能够正确获知消息体的结束位置,而为什么采用chunked不用设置Content-Length字段呢?因为chunked传输方式特定的格式可以使Recipient正确获知消息体的结束。
Chunked传输即分块传输:将响应主体分成若干块,并在每一块前面加上该块数据的长度以及回车换行,这样Recipient(如浏览器)就可以根据这个长度值正确接收每一块数据,最后以一个0长度的分块作为消息体的结束标志。采用该传输方式Sender在开始传输响应内容到Recipient前不需要知道内容的长度。
Chunked消息体格式如下:
hex的分块长度+<CR>回车+<LF>换行
chunked data
结束块的分块长度为0
如要发送的内容(消息体)为:123456789那么消息体的格式为:
9<CR><LF>
123456789<CR><LF>
0<CR><LF>
采用分块传输方式的好处:
(1)由于在服务器发送数据到Recipient前不需要知道数据的字节长度,所以可以动态产生响应内容而不用先将所有数据进行缓存;由于当消息体结束的时候有明确的信号标识(0<CR><LF>),因此后面对同一HTTP服务器的请求可以复用本次连接。
(2)允许服务器在消息体后面发送额外的响应头字段,这个非常重要当一个字段的值要等到响应内容全部产生后才能确定的情况下,如响应内容的数字签名,如果不使用分块传输服务器为了计算响应内容的算数字签名则必须先缓存所有内容直到内容产生完成。(如果不采用Chunked分块传输则在消息体后面发送的响应头不能被Recipient正确获取)
(3)HTTP服务器有时使用compression(gzip或者deflate)方法优化传输即对被传输的字节进行压缩,chunked和gzip编码相互之间作用在HTTP编码的两个阶段;第一阶段响应内容字节流采用gzip进行压缩编码,压缩完成后产生的字节流采用chunked的方式进行传输编码,这意味着chunked和compression可以同时使用,只是作用于不同的阶段。
HTTP协议响应头之Transfer-Encoding:分块传输详解的更多相关文章
- HTTP协议探究(六):H2帧详解和HTTP优化
一 复习与目标 1 复习 HTTP1.1存在的问题 HTTP2.0要兼容HTTP1.1 HTTP2.0的重要概念 分帧层 二进制:流 消息 帧 流的状态.优先级和并发 流量控制 服务器推送 首部压缩 ...
- TCP协议三次握手与四次挥手详解
在计算机网络的学习中TCPi协议与Http协议是我们必须掌握的内容,其中Tcp协议属于传输层,而Http协议属于应用层,本博客主要讲解Tcp协议中的三次握手与四次挥手,关于Http协议感兴趣的可以参看 ...
- C++中头文件与源文件的作用详解
一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 ...
- 转:HTTP协议简介与在python中的使用详解
1. 使用谷歌/火狐浏览器分析 在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来.而浏览器和服务器之间的传输协议是HTTP,所以: HTML是一种用 ...
- tcp协议:三次握手四次挥手详解-转
https://www.cnblogs.com/welan/p/9925119.html
- TCP协议“三次握手”与“四次挥手”详解(上)
在使用TCP协议进行数据的传输之前,客户端与服务器端需要建立TCP Connection,即建立连接,之后两端才能进行数据的传输. 下面堆TCP连接“三次握手”的过程进行说明. 1.相关概念 首先,我 ...
- 5┃音视频直播系统之 WebRTC 中的协议UDP、TCP、RTP、RTCP详解
一.UDP/TCP 如果让你自己开发一套实时互动直播系统,在选择网络传输协议时,你会选择使用UDP协议还是TCP协议 假如使用 TCP 会怎样呢?在极端网络情况下,TCP 为了传输的可靠性,将会进行反 ...
- 实现响应式——Bootstrap的删格系统详解
Bootstrap 今天和大家一起学习如今很流行的前端框架之一,Bootstrap框架. 前言 今天带大家看看Bootstrap框架,其实我呢主要还是用里面的删格系统,单单这个删格系统就比较强大了.其 ...
- TCP协议“三次握手”与“四次挥手”详解(下)
前面进行“三次握手”建立连接后,当客户端的数据发送完毕,它就会要求与服务器端断开连接,那么就要进行“四次挥手”进行连接的释放. 注意,此处所谓的“客户端”与“服务器端”,只是为了方便标识连接的双方,即 ...
随机推荐
- (CLR via C#学习笔记)异步操作 - 线程池
一 线程池基础 1.线程池维护了一个操作请求队列,将请求的操作追加到线程池队列中,线程池的代码从队列中提取操作项,派发给线程池中的线程; 2.CLR初始化时,线程池中是没有线程的,当有操作派发给线程池 ...
- "CMAKE_CXX_COMPILER-NOTFOUND"
CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found. Please set CM ...
- Linux查看版本当前操作系统内核信息
1. # uname -a (Linux查看版本当前操作系统内核信息) 输出 Linux xxx --generic #~-Ubuntu SMP Wed Jul :: UTC x86_64 x86_6 ...
- [转] VR-FORCES 介绍
转自:https://sanwen8.cn/p/1e6GQeK.html 今天给各位介绍的仿真平台是VR-Forces.VR-Forces是新加坡公司MAK的产品,前身是美国公司.在仿真平台领域里面, ...
- RHEL6.5恢复root密码
1.开机上下键停留在如下界面,键盘输入小写e: 2.选择如下选项,并输入小写e: 3.输入1,回车进入单用户模式: 4.键盘输入小写b,进行启动: 5.进入到单用户模式: 6.修改root用户密码,并 ...
- Java 调用PHP的Web Service(三)
usoap是PHP环境中的开源soap工具,算是用得比较多的一个工具了. 在utf-8环境中,nusoap可以工作得很好.但是当用于中文环境中时,nusoap经常会出现一些让人不得其解的问题. 最近一 ...
- myeclipse10修改全局jsp编码格式为gbk
myeclipse10修改全局jsp编码格式为gbk: window->prefenrence->general->content types-> 展开:text->j ...
- T4 模板代码生成
<# //********************************************************* // // Copyright (c) Microsoft. All ...
- STL标准库-容器-map和multimap
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 map与multimap为关联容器,结构如下 map底层实现依然是rb_tree 他的data可以改,但是key不能改,因此ma ...
- 穷举算法和递推算法(Java)
穷举算法 概念: 最简单算法,依赖计算机的强大计算能力穷尽每一种可能的情况.穷举算法效率不高,但是适合一些没有明显规律可循的场合. 思想: 在使用穷举算法时,需要明确问题答案的范围,这样才可能在指定范 ...