http1.x http2.0浅析

来源:互联网 发布:藏族演出服淘宝网 编辑:程序博客网 时间:2024/06/13 17:25

一 HTTP 1.0

http1.0版本,默认是短链接,即每次请求需重新建立TCP连接,数据传送后断开连接,每次请求互不干扰,相互独立,即连接无法复用,同时存在令人诟病的head of line blocking问题,即其中一个响应没有到达,后续所有的请求将被阻塞;
如:

curl -0 --head "http://httpdnsv3.ffdns.net/httpdns?dn=report.laogen.xyz"HTTP/1.1 200 OKDate: Tue, 11 Jul 2017 01:13:38 GMTContent-Type: text/plainConnection: closeServer: XNS-HTTPDNS

实际,在http1.0标准协议中是支持长连接的,需要设置http报文头部Connection域为keep-alive
如:

curl -0 --head -H"Connection:keep-alive" "http://httpdnsv3.ffdns.net/httpdns?dn=report.laogen.xyz"HTTP/1.1 200 OKDate: Tue, 11 Jul 2017 01:13:55 GMTContent-Type: text/plainConnection: keep-aliveServer: XNS-HTTPDNS

短链接的缺点是,每次都要建立新的TCP连接,增加开销。如,一个网页有10张图片,则需要十个TCP连接,考虑一下,每次TPC连接都要经过三次握手,即增加量1.5RTT时间,再加上TCP慢启动机制,频繁的建立连接将消耗大量时间和资源,加上之前提到的head of line blocking 问题,http1.1对以上两个问题做了一定优化。

二 HTTP 1.1

http1.1版本,默认是长连接,即在同一TCP连接上,可以传送多个http请求和响应。
如:

curl --head -H"Connection:keep-alive" "http://httpdnsv3.ffdns.net/httpdns?dn=report.laogen.xyz"HTTP/1.1 200 OKDate: Tue, 11 Jul 2017 01:28:11 GMTContent-Type: text/plainConnection: keep-aliveServer: XNS-HTTPDNS

同时,http1.1还支持并发请求,即不需要等待上一次请求结果就可以发送下一次请求-http pipelining

不仅如此,HTTP 1.1还通过增加更多的请求头和响应头来改进和扩充HTTP 1.0的功能。例如,由于HTTP 1.0不支持Host请求头字段,
WEB浏览器无法使用主机头名来明确表示要访问服务器上的哪个WEB站点,这样就无法使用WEB服务器在同一个IP地址和端口号上
配置多个虚拟WEB站点。在HTTP 1.1中增加Host请求头字段后,WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,
这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。HTTP 1.1的持续连接,
也需要增加新的请求头来帮助实现,例如,Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后保持连接;
Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭连接。HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。

通过上边学习,http1.1性能提高已经很多,但是还是有很多可以优化的地方,比如http1.1 http pipelining

  1. pipelining 只适用于http1.1,并且要求server段支持
  2. 只有幂等请求(head / get)支持pipelining,因为非幂等的请求可能存在依赖关系
  3. head of line blocking 没有得到完全解决,其中:
    a. 对于同一个域名, pipelining个数有限制,超过限制的请求将被阻塞
    b. response要求依次返回,遵循FIFO原则,即请求1的响应没有回来,2.3.4…的响应也不会回来
    c. 大部分代理不支持pipelining
    ……
    另外长连接的问题:有文章提到,长连接的时间只能保持一段时间;(有待学习)

三 HTTP 2.0

http2.0版本,在http1.1的基础上做了如下优化,减少网络延迟,提高吞吐量:
(以下图片来自https://www.zhihu.com/question/34074946)
1. 多路复用
突破1.1并发限制,通过多个请求流共享一个TCP连接,解决了http1.x head of line blocking问题
这里写图片描述
在http2.0中,将通信的基本单位缩小为二进制帧,在单一连接上,可以实现多流并行;
2. 请求优先级
多路复用带来的问题是,在共享同一连接的基础上,可能会导致重要的请求被阻塞,2.0支持给每个请求设置优先级,这样重要的请求会优先得到响应
3. 首部压缩
http1.1不支持首部压缩,http2.0采用HPACK算法压缩头部信息
4. 服务端推送
即服务端可以对客户端一个请求发送多个响应,比如客户端请求主页,那么服务端可能会把主页内容,logo图片等信息一起响应。
更重要的一点是:可以缓存!也让在遵循同源的情况下,不同页面之间可以共享缓存资源成为可能。(我理解是:两个或多个页面使用了统一资源的图片或其他类型资源在内,那么就可以缓存并复用)

原创粉丝点击