已知http的请求响应是一对一的. 就是一个请求跟着接下来的响应便是与之配对了.

而另一种方式, 可以依靠顺序, 即发送多个http请求, 然后返回对个http响应. 严格按照顺序将他们对应起来, 称为管道化链接.

但是由于有很多问题, 支持的都不好. 实际应用应该也是比较少的.

转发一篇如下:

原文地址: http://www.yanglicalm.com/2017/02/12/%E7%AE%A1%E9%81%93%E5%8C%96%E8%BF%9E%E6%8E%A5/

其实一切都是由管道化连接而起,这是一个比较有意思的连接方式。

HTTP/1.1 允许在持久连接上可选的使用请求管道。这是相对于keep-alive连接的又一性能优化。在相应到达之前,可以将多条请求放入队列,当第一条请求发往服务器的时候,第二第三条请求也可以开始发送了,在高延时网络条件下,这样做可以降低网络的环回时间,提高性能。


如上图所示,展示了管线化连接的机制,但是也有几点限制:

  • 如果客户端无法确认连接是持久的,就不应该使用管道
  • 必须按照与请求相同的顺序回送HTTP响应,因为HTTP报文中是没有序列号的,所以如果收到的响应失序了,就没办法将其与请求匹配起来
  • HTTP客户端必须做好连接会在任意时刻关闭的准备,还要准备好重发所有未完成的管道化请求
  • HTTP客户端不应该用管道化的方式发送回产生副作用的请求,比如POST请求。

管线化在iOS中的应用

WWDC 2012 session 706 - Networking Best Practices中,Apple的工程师介绍了管线化的概念,我们知道了在NSMutableRequest有个属性叫做HTTPShouldUsePipelining,标示是否开启管线化连接,但是奇怪的是,这个值默认是NO,按说如此强势的功能为什么要设置为NO呢,下面我们来看看。

通过上面的介绍我们会发现,客户端接收响应的顺序必须和发出的请求顺序相同,也就是说这依赖于服务器对于相应的排序,那么问题来了,如果服务器不支持管线化的话,那么响应就会乱序,造成意想不到的问题,有几个很出名的bug:

  • Safari开发团队接到多起报告,说是网页上展示的图片内容混乱,后来经过排查发现是当时的Safari版本默认开启管线化连接,但是很多站点的服务器并不支持,导致这个bug,随即Safari团队宣布不在默认开启管线化连接,事件详情在这里
  • AFNetworking曾经也默认开启管线化连接,后来接到一个issue,也是用户下载多张图片,后来发现图片的内容混淆了,具体内容点这里

但是有件事情是很让我困惑的,我在阅读SDWebImage源码的时候,在SDWebImageDownloader类中将HTTPShouldUsePipelining设置为了YES,不知道为什么没有问题,希望有了解的大神可以给个解答。

除了上述的问题之外,管线化连接还是有性能问题的:

  • 这篇文章从安全角度指出了管线化连接的问题,并且谈到了一些特定情况下的性能损失。
  • 这篇文章测试了几个主流的浏览器,给出了管线化连接的性能并不是一直都是取胜的。
  • WWDC 2015 - Networking with NSURLSession详细解释了一种叫做Head of line blocking的问题,是管线化连接的巨大瓶颈

Head of line blocking

来解释下这个概念,翻译成中文是线头阻塞。我们知道,管线化是把多个HTTP请求放到一个TCP连接中一一发送,而在发送过程中不需要等待服务器对前一个请求的响应,只不过,客户端还是要按照发送请求的顺序来接收响应,也就是说,如果第一个请求耗费了服务器很多的处理时间,那么后面的请求都要等待第一个处理完,也就出现了线头阻塞。

目前,直到HTTP/1.0都没有好的方法来解决这个问题,未来的HTTP/2.0或者SPDY中的异步操作才能解决这个问题

以上三篇,是关于HTTP连接的管理。

[skill][http] http管道化连接的更多相关文章

  1. 前端学HTTP之连接管理

    前面的话 HTTP连接是HTTP报文传输的关键通道.要掌握HTTP就需要理解HTTP连接的来龙去脉以及如何使用这些连接 如果想查看一个网页,浏览器收到URL时,会执行下图所示的步骤.将服务器的IP地址 ...

  2. HTTP的长连接和短连接

        本文总结&分享网络编程中涉及的长连接.短连接概念.     关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持长连接(HTT ...

  3. HTTP连接管理

    本文是<HTTP权威指南>读书笔记: 几乎所有的HTTP通信都是通过TCP/IP承载的,当HTTP要传送一些报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输.因此HTT ...

  4. HTTP权威协议笔记-4.连接管理

    4.1 TCP连接 TCP为HTTP提供了一条可靠的比特传输管道,按顺序正确的传输,步骤如下: 浏览器解析主机名. 查询这个主机名的IP地址(DNS) 获得端口号. 浏览器对服务器该端口号发起连接. ...

  5. HTTP长连接短连接

    一.什么是长连接 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待 ...

  6. HTTP(一) 连接管理

    ・HTTP是如何使用TCP连接的 HTTP传送一条报文时,以流的形式将报文数据内容通过一条打开的TCP连接按序传输. TCP收到数据流之后,由TCP/IP软件将数据流砍成被称作段的小数据块,并将段封装 ...

  7. HTTP协议中的长连接和短连接(keep-alive状态)

    什么是长连接 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待在同 ...

  8. 【转】HTTP长连接与短连接(2)

    一.什么是长连接 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待 ...

  9. HTTP权威指南-连接管理

    现在已经开始学习到第四章咯,坚持就是胜利哟~!ok,废话少说,继续写笔记. 本章中我们要介绍到HTTP的连接.好,现在有几个问题,我列出来了,带着这几个问题,我们进入本章的学习. 1.HTTP是如何使 ...

随机推荐

  1. IOS开发 文件路径

    1.开发平台路径: /Developer/Platforms 此路径下一般有三个目录,分别是mac电脑.模拟器.iphone真机 MacOSX.platform iPhoneSimulator.pla ...

  2. 【Spark 深入学习 -09】Spark生态组件及Master节点HA

    ----本节内容------- 1.Spark背景介绍 2.Spark是什么 3.Spark有什么 4.Spark部署 4.1.Spark部署的2方面 4.2.Spark编译 4.3.Spark St ...

  3. 【Big Data - ELK】ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台

    摘要: 前段时间研究的Log4j+Kafka中,有人建议把Kafka收集到的日志存放于ES(ElasticSearch,一款基于Apache Lucene的开源分布式搜索引擎)中便于查找和分析,在研究 ...

  4. (转)Linux服务器磁盘空间占满问题

    转自:https://www.cnblogs.com/cindy-cindy/p/6796684.html 下面我们一起来看一篇关于Linux服务器磁盘占满问题解决(/dev/sda3 满了),希望碰 ...

  5. python修饰器(装饰器)以及wraps

    Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼. 装饰器的引入 初期及问题的诞生 假如现在在一个公司,有A B C三个业务部门,还有S一 ...

  6. ecshop首页调用团购信息产品购买人数

    当我们在ecshop后台录入ecshop的团购信息之后,我们在ecshop的前台首页index.php里面,可以看到他能调用ecshop的团购商品信息,其中就包括团购商品的一些价格信息.但是如何在ec ...

  7. webstorm开发vue项目环境配置

    1.首先安装nodejs,官网下载nodejs安装包,默认安装NPM包管理器(国内使用npm需要FQ,也可以使用淘宝的镜像:npm install -g cnpm –registry=https:// ...

  8. windows系统下,express构建的node项目中,如何用debug控制调试日志

    debug是一款控制日志输出的库,可以在开发调试环境下打开日志输出,生产环境下关闭日志输出.这样比console.log方便多了,console.log只有注释掉才能不输出. debug库还可以根据d ...

  9. MySql按字段分组取最大值记录 [此博文包含图片]

      要求:获得按table1_id分组,并且age最大的记录信息,即2.3.5条     方法一: select * from (select * from table2 order by age d ...

  10. Mac和Windows中常见中文字体的英文名称

    我们在给HTML元素设置字体的时候经常会有类似 “ font-family:"微软雅黑", "黑体" ” 这样的写法,尤其是在使用Dreamweaver.Apt ...