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:分块传输详解的更多相关文章

  1. HTTP协议探究(六):H2帧详解和HTTP优化

    一 复习与目标 1 复习 HTTP1.1存在的问题 HTTP2.0要兼容HTTP1.1 HTTP2.0的重要概念 分帧层 二进制:流 消息 帧 流的状态.优先级和并发 流量控制 服务器推送 首部压缩 ...

  2. TCP协议三次握手与四次挥手详解

    在计算机网络的学习中TCPi协议与Http协议是我们必须掌握的内容,其中Tcp协议属于传输层,而Http协议属于应用层,本博客主要讲解Tcp协议中的三次握手与四次挥手,关于Http协议感兴趣的可以参看 ...

  3. C++中头文件与源文件的作用详解

    一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 ...

  4. 转:HTTP协议简介与在python中的使用详解

    1. 使用谷歌/火狐浏览器分析 在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来.而浏览器和服务器之间的传输协议是HTTP,所以: HTML是一种用 ...

  5. tcp协议:三次握手四次挥手详解-转

    https://www.cnblogs.com/welan/p/9925119.html

  6. TCP协议“三次握手”与“四次挥手”详解(上)

    在使用TCP协议进行数据的传输之前,客户端与服务器端需要建立TCP Connection,即建立连接,之后两端才能进行数据的传输. 下面堆TCP连接“三次握手”的过程进行说明. 1.相关概念 首先,我 ...

  7. 5┃音视频直播系统之 WebRTC 中的协议UDP、TCP、RTP、RTCP详解

    一.UDP/TCP 如果让你自己开发一套实时互动直播系统,在选择网络传输协议时,你会选择使用UDP协议还是TCP协议 假如使用 TCP 会怎样呢?在极端网络情况下,TCP 为了传输的可靠性,将会进行反 ...

  8. 实现响应式——Bootstrap的删格系统详解

    Bootstrap 今天和大家一起学习如今很流行的前端框架之一,Bootstrap框架. 前言 今天带大家看看Bootstrap框架,其实我呢主要还是用里面的删格系统,单单这个删格系统就比较强大了.其 ...

  9. TCP协议“三次握手”与“四次挥手”详解(下)

    前面进行“三次握手”建立连接后,当客户端的数据发送完毕,它就会要求与服务器端断开连接,那么就要进行“四次挥手”进行连接的释放. 注意,此处所谓的“客户端”与“服务器端”,只是为了方便标识连接的双方,即 ...

随机推荐

  1. eclipse中导入maven项目:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.Maven

    org.codehaus.plexus.archiver.jar.Manifest.write(java.io.PrintWriter) 解决方法为:更新eclipse中的maven插件 1.help ...

  2. python 递归求阶乘

    #用递归函数求 n 阶乘的值 def factorial(i): : else: )# sum=n*(n-)!所以直接调用自身 n=int(input('请输入阶乘数:')) ): print('%d ...

  3. lua 删除table元素

    tab1 = { key1 = "val1", key2 = "val2", "val3" } for k, v in pairs(tab1 ...

  4. AtomicLong可以被原子地读取和写入的底层long值的操作

    java.util.concurrent.atomic.AtomicLong类提供了可以被原子地读取和写入的底层long值的操作,并且还包含高级原子操作. AtomicLong支持基础long类型变量 ...

  5. uva10480最小割集

    求最小割集 dinic处理后用dfs对所有点进行标记,遍历整个联接边,起点访问了,终点没访问或者起点没访问,终点访问了就是最小割集之一 #include<map> #include< ...

  6. LeetCode 40

    // 既然不能重复利用,就在递归中选择下一个数,不能重复的话,就用setclass Solution { public: vector<vector<int>> combina ...

  7. Java 调用PHP的Web Service(三)

    usoap是PHP环境中的开源soap工具,算是用得比较多的一个工具了. 在utf-8环境中,nusoap可以工作得很好.但是当用于中文环境中时,nusoap经常会出现一些让人不得其解的问题. 最近一 ...

  8. PHP与Java集成开发详解(一)

    很久以前,有人从www上看到看到天空上一个很亮的亮点,它就是Java语言,与此同时,在另一个地方一位梦想家也看到了一个亮点,它就是PHP. 时间一天天过去,这两个亮点也变得越来越亮,很快,它们受到了编 ...

  9. TextView上下滑动

    LocationResult = (TextView) findViewById(R.id.textView1);LocationResult.setMovementMethod(ScrollingM ...

  10. facade外观模式

    通过买股票与通过基金买股票引出外观模式: package com.disign.facade; /** * Created by zhen on 2017-05-18. */ public class ...