http 1.0 / 1.1 / 2.0的区别

http 1.0 / 1.1 / 2.0的区别http1.0 / 1.1 / 2.0的区别

大家好,又见面了,我是你们的朋友全栈君。

1. http 1.0

  1.1 链接无法复用,即不支持持久链接:

          http 1.0 规定浏览器与服务器保持较短时间的链接,浏览器每次请求都和服务器经过三次握手和慢启动(基本思想是当TCP开始传输数据或发现数据丢失并开始重发时,首先慢慢的对网路实际容量进行试探,避免由于发送了过量的数据而导致阻塞)建立一个TCP链接,服务器完成请求处理后立即断开TCP链接,而且不跟踪每个浏览器的历史请求。

        注意:由于http 1.0每次建立TCP链接对性能的影响实在是太大,http1.1实现持久化链接之后,又反向移植到http 1.0上,只是默认是没有开启持久链接的,通过http的header部分的 Connection: KeepAlive 来启用

1.2 线头阻塞(Head of Line (HOL) Blocking)

               请求队列的第一个请求因为服务器正忙(或请求格式问题等其他原因),导致后面的请求被阻塞。

2. http 1.1

    2.1 支持持久链接(在request和response中的header中的connection是close或者Keep-Alive进行控制)

          一个TCP链接可以传送多个http请求和相应,减少了TCP建立链接和关闭链接的消耗。另外http1.1允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能      够区分出每次请求的响应内容。

2.2 支持http管道

不使用管道的http请求,在使用持久链接时,必须严格满足先进先出的队列顺序(FIFO),即发送请求,等待响应完成,再发送客户端队列中的下一个请求。管道可以让我们把 FIFO 队列从客户端(请求队列)迁移到服务器(响应队列),即客户端可以并行,服务端串行。客户端可以不用等待前一个请求返回,发送请求,但服务器端必须顺序的返回客户端的请求响应结果。
缺点:
a. 一个请求响应阻塞,就会阻塞后续所有请求
b. 并行处理请求时,服务器必须缓冲管道中的响应,从而占用服务器资源,如果有个响应非常大,则很容易形成服务器的受攻击面;
c. 响应失败可能终止 TCP 连接,从页强迫客户端重新发送对所有后续资源的请求,导致重复处理;
d. 由于可能存在中间代理,因此检测管道兼容性,确保可靠性很重要;
e. 如果中间代理不支持管道,那它可能会中断连接,也可能会把所有请求串联起来。

2.3 使用多个TCP链接

http1.1 在客户端排队所有请求,让后通过一个TCP持久链接,一个接一个的发送请求(如果有http管道还必须顺序等待服务端的顺序返回结果)。但实际中,浏览器的开发时不会这么笨,浏览器允许我们打开N个TCP链接(大多说浏览器是6个TCP链接,这个数字越大,客户端和服务器的资源占用越多,这个数据也只是感觉安全的数字而已)。
带来的好处:
1. 客户端可以并行发送最多 N个请求;
2. 服务器可以并行处理最多 N个请求;
3. 第一次往返可以发送的累计分组数量(TCP cwnd)增长为原来的 N 倍。
代价:
1.更多的套接字会占用客户端、服务器以及代理的资源,包括内存缓冲区和 CPU时钟周期;
2.并行 TCP 流之间竞争共享的带宽;
3.由于处理多个套接字,实现复杂性更高;
4.即使并行 TCP 流,应用的并行能力也受限制。

因此使用多个TCP链接只是权宜之计,后续的http 2.0支持多路复用,很好的解决了上述问题。

2.4 http 1.1 增加了请求头和响应头来扩充功能

    举例:
         a. 支持Host请求:
         b. Connection: 请求头的值为Connection时,客户端通知服务器返回本次请求结果后保持连接;Connection请求头的值为close 时,客户端通知服务器返回本次请求结果后关闭连接
         c. 支持断点续传:
         d.身份认证:
         e.状态管理:
         f. 缓存处理:

2.5 域名分区

域名分区是思想是将原来集中到一个服务器上的资源分布到多个服务器上,这样就可以突破浏览器的链接限制(一般是6个),提高并行能力。
代价:
1. 每多一台主机都要多一次的 DNS 查询,每多一个套接字都会多消耗两端的一些资源;
2.必须手工分离一台主机上的资源到多台;.
实际实践中,效果并不是很明显,反而导致被滥用。

2.6 http的header的优化

目前所有的header请求都是以没有经过压缩的纯文本的形式发送(通常会有600`1000字节),而通常使用的http请求body却很少(10~200字节),和header相比,显得很少,特别是在使用了cookie之后,这样的矛盾就更加突出,因此要减少header的数据。

2.7 减少连接次数

即将需要多次才能获取的文件或资源组合并成一个,通过一次网络请求获取。这样减少了协议的开销,间接地将服务器端的管道思维移植到了客户端。缺点:增加复杂性,更缓存带来负担,页面的分步显示,改成一次显示,在网络慢的时候影响用户体验。

2.8 嵌入小的文件

即将资源嵌入文档(通过URI嵌入图片,音频或PDF),可以减少请求次数。嵌入资源作为页面的返回一部分一次返回,即如果在多个页面中都嵌入同样的资源,那么这个资源将会随着每个页面的加载而被加载,从而增大每个页面的总体大小,如果嵌入资源被更新,客户端只能重新获取有效的资源。
实践:一般只考虑嵌入1~2KB一下的资源
参照建议:
1. 如果文件很小,而且只有个别页面使用,可以考虑嵌入;
2.如果文件很小,但需要在多个页面中重用,应该考虑集中打包;
3. 如果小文件经常需要更新,就不要嵌入了;
4. 通过减少 HTTP cookie 的大小将协议开销最小化。

3. http 2.0

HTTP 2.0把解决性能问题的方案内置在了传输层,通过多路复用来减少延迟,通过压缩 HTTP首部降低开销,同时增加请求优先级和服务器端推送的功能。

  3.1 支持多路复用

         多路复用允许同时通过单一的 HTTP 2.0 连接发起多重的请求-响应消息,即所有HTTP 2.0 连接都是持久化的,而且客户端与服务器之间也只需要一个连接即可,所有数据流共用同一个连接 ,减少了因http链接多而引起的网络拥塞(在 HTTP1.1 协议中,同一时间,浏览器会针对同一域名下的请求有一定数量限制),解决了慢启动针对突发性和短时性的http链接低效的问题。

3.2 将通信的基本单位缩小为帧

             即应用层(HTTP)和传输层(TCP or UDP)之间增加一个二进制分帧层,因此在多向请求和响应时,客户端和服务器可以把HTTP消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来,解决了http 1.*的对手阻塞问题。 

3.3 首部压缩

              http 2.0支持DEFLATE和HPACK 算法的压缩。

3.4 服务端推送

          指客户端请求之前发送数据的机制,在 HTTP 2.0 中,服务器可以对客户端的一个请求发送多个响应。

3.5 请求优先级

   HTTP 2.0 使用一个31比特的优先值,0表示最高优先级, 2(31)-1表示最低优先级,服务器端就可以根据优先级,控制资源分配,优先处理和返回最高优先级的请求帧给客户端。



参考文献:
1.http://www.jianshu.com/p/52d86558ca57

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149540.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Android studio 一个项目引入另一个项目作为Libary「建议收藏」

    Android studio 一个项目引入另一个项目作为Libary「建议收藏」1.在我们开发Android项目时,有时需要一个项目作为另一个项目的工具类的引用,这样就需要配置下,使得MyLibrary到MyApplication作为一个module。我们直接截图上步骤:1.

  • idea激活码7天[免费获取]

    (idea激活码7天)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/ide…

  • Hibernate3.3 教程

    Hibernate3.3 教程原文链接自:http://hi.baidu.com/suny_duan/blog/item/9eb1211a4c9027158718bf10.html1.重Annotation,轻xml配置文件;Annotation分为:JPA,hibernate-extension官方网站:http://www.hibernate.org/hibernate使用的是SLF4J日志(它可以匹配各种各样的LOG,如log4j等)它的下载包中会再带一个slf4j-api-1.5.8.jar,除此之外还需要一个slf4j-nop

  • UML工具

    UML工具UML工具graphvizplantumldraw.iodesktopyEd

  • BCG界面库_如何用vc设计界面

    BCG界面库_如何用vc设计界面BCGControlBarLibraryProfessionalEdition installation:整个库的源代码安装在\BCGCBPro 目录下面.可执行文件(*.dll)安装在\Bin (forVisualStudio6.0)或\Bin7 (forVisualStudio.NET)下面。请在你的源代码中做如下的改变:在应用程序的Inc

  • 《欲罢不能:刷屏时代如何摆脱行为上瘾》书摘

    《欲罢不能:刷屏时代如何摆脱行为上瘾》书摘!!!此书大大提高我对这个信息时代的认知,也理解了为什么过去对一些事情那么沉迷。一开始书讲一些物质上瘾,确实不太好看,但是往下看你会感到惊讶。这个信息时代给了我们这代人,太多了获得感,并非获得。这是我最大的感受。然后。具体讲什么内容,谁看谁知道。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号