Http的前世今生2- 转化篇

Posted Coding小作坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Http的前世今生2- 转化篇相关的知识,希望对你有一定的参考价值。

昨天我们做了这个关于HTTP的介绍. 那我们今天来看一下, 到底Http有什么缺点, 我们必选要把这个功不可没的元老换掉呢.

1. 队头阻塞(Head-of-line blocking) :你想这么一个场景呀. 客户发了Data1,回复收到,然后发了Data2, 但是丢了, 客户端这边不会等呀, 继续发Data3,但是server这边收到了Data3,却没有Data2,就苦苦的等呀等. 直到收到了Data2,发ack2给客户端, 才会继续.所以在server这边,这个就会增加时间. 也就是不能给他的应用层发送任何消息.直到排好序. 请求好像瀑布模式之前的请求会阻拦后面的请求.


HTTP1.1还记得吗,在持久连接的基础上,进一步地支持在持久连接上使用管道化(pipelining)特性.管道化允许客户端在已发送的请求收到服务端的响应之前发送下一个请求,借此来减少等待时间提高吞吐.如果多个请求能在同一个TCP分节发送的话,还能提高网络利用率.但是因为HTTP管道化本身可能会导致队头阻塞的问题,以及一些其他的原因,现代浏览器默认都关闭了管道化.


2.另一个TCP影响HTTP的问题是Flow control也就是这个流量控制.用于处理拥塞. 如果有两台挨着的电脑连接100m的网,可以开始传送100m来回,没有任何问题.如果这个服务器不能处理100m就要降到50m,但是如果提前知道,这个也没问题,我们可以设置成50m.但是现实世界是,我们没有两个互联的电脑对吧. 成千上万的电脑,路由,交换器以及各种机器.每一个机器都有他自己的限制. 如果一开始设置一个特别高的速率的话,会造成拥挤, 阻塞网络. 如果速率低的话,又会没有效率,TCP处理的方法就是流量控制flow control,意思就是可以根据网络的反应来不断的条件传输速率,TCP的实现方法是慢启动, 选一个很小的window size. 然后增加. 如果开始产生不良反应,降低.这个慢启动会影响所有TCP连接和每一个http请求.所以TCP为了保证可靠并且能够处理拥塞.TCP给HTTP带来了一系列的影响也就是延迟. 终于我们的主角HTTP2该出来拯救世界了? 还没有. 主角上场之前, 都会有很多其他的小罗罗对吧.


SPDY就是这样一个产物

Http的前世今生2- 转化篇

2012年google如一声惊雷提出了SPDY的方案,优化了HTTP1.X的请求延迟,解决了HTTP1.X的安全性,具体如下:

  1. 降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing).多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率.

  2. 请求优先级(request prioritization).多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞.SPDY允许给每个request设置优先级.这样重要的请求就会优先得到响应.比如浏览器加载首页,首页的html内容应该优先展示.之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容.

  3. Header压缩。前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。

  4. 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性.

    5. 服务端推送(server push),采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了. 

SPDY构成图

Http的前世今生2- 转化篇


但是大佬们能让你google独大吗, 于是基于SPDY发表了升级版也就是我们的HTTP2.


HTTP2.0和SPDY的区别

  • HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS

  • HTTP2.0 消息头的压缩算法采用 HPACK 而非 SPDY 采用的 DEFLATE http://zh.wikipedia.org/wiki/DEFLATE.



Http2是一个二进制协议. 二进制肯定比这个文本要好传输呀.它呢保持Http1.1里面的所有语义,比如Http1.x里面定义的所有头文件,资源等等.所有的工作都是用来解决Http1的缺点.为什么要讲一些Tcp的知识呢. 帮助你学习和理解. 如果通俗的讲,Http2是关于什么的, 它是关于performance的. 

下面说一个小的知识点呀

Http的前世今生2- 转化篇

如果你知道SPDY,这个是google自己研发的解决http1.x的效率问题的,对不对.后来Http2就出来了,google就放弃使用SPDY了,是一个类似但是不一样的协议呀,现在这个协议已经不用了,chrome在2016年就已经不用了。http2是15年正式发布的https://caniuse.com/#search=http2,你看一下,基本已经都支持了,很多网站也都声称实现了Http2.


也可以看一下这个官方的Demo

https://http2.akamai.com/demo


Http的前世今生2- 转化篇



我们来深入看一下Http2.

Http1.1中,使用明文发送请求,拿到回复

HTTP2中可以看出 使用的是二进制,但是内容必须和http1.1包含的内容是一样的,Verb(请求方法,知道有几种吗9种, GET,HEAD,POST,PUT,DELETE,CONNECT,OPTIONS,TRACE,PATCH) ,Resource(资源) 以及其他的头文件等等.同样回复中也包含相同的内容,唯一的区别就是从明文变成了二进制. Http2和http1.1是不兼容的.但是我们需要http2可以在现在的www的架构上运行,我们不可能把几十年创建的架构, 网络全部重建.如果http2不能在现有的url上工作,那就是一场噩梦呀. 所以这就是http2必须能在http1的基础上工作.


为了在Http2使用明文, 客户端需要发一个升级请求包含在头信息-> h2c. 如果服务器支持http2, 它会返回101表示换协议. 返回信息. 升级h2c. 如果服务器不支持连接升级. 会返回200 或者404的状态码.


Frame(桢) HTTP 2.0 通信的最小单位,每个帧包含帧首部,至少也会标识出当前帧所属的流

流->已建立的连接上的双向字节流。

• 消息-> 与逻辑消息对应的完整的一系列数据帧.


今日知识点


1.什么是Http协议无状态协议?怎么解决Http协议无状态协议?


无状态协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息.也就是说,当客户端一次HTTP请求完成以后,客户端再发送一次HTTP请求,HTTP并不知道当前客户端是一个”老用户“.可以使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是”老用户“


2. URI 和 URL的区别

  • URI 是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源, 比如网页,文档, 图片, 视频等.


  • URL 是一种特殊的标识符, uniform resource locator统一资源定位器。它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源. 比如https,ftp等.


  • URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如urn:isbn:0451450523 来通过ISBN number定义.

在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的.


在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。

相反的是,URL类可以打开一个到达资源的流.


今天就写到这. 明天会说明HTTP2的所有优点, 以及如何部署到ngnix上. 











以上是关于Http的前世今生2- 转化篇的主要内容,如果未能解决你的问题,请参考以下文章

Selenium之前世今生

验证码的前世今生(前世篇)

Selenium之前世今生

Selenium之前世今生

Mysql基础篇之一条Sql查询语句的前世今生---01

Mysql基础篇之一条Sql更新语句的前世今生---02