http的变迁(http1.0-http2.0,https)

先来一张图来解释。。。

太模糊了?不急不急,让我们分步分析。

http1.0

http1.0早在1996年就出现了。基本上满足了ajax的需求,但是呢,毕竟刚出来没多久,在优化上就得多下功夫,在http开始普及之后,他的缺点也开始展现。

http1.0最大的问题就是关于tcp连接的问题,大家都知道tcp是连接型的协议,所以需要建立连接和断开连接。但是早期的http1.0只能在一个tcp上承载一个http,而且web端只能有6-8个链接,这就使高并发的状态下带宽利用率非常低。所以在99年,推出了http1.1。

http1.0与http1.1

下图表示了其主要区别

来详细说一说。

  • 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。在这之中Etag也是最为重要的。它提供了精确的缓存定向。可以精确缓存某个文件而不是根据日期全部缓存。浏览器缓存控制
  • 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

  • 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

  • Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。Host,referer,origin三者区别

  • 长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

好了,现在已经优化到http1.1了。但是是不是还有问题呢。有肯定是有的,在这之前我们先说一下https;

http与https

https其实和http差不多,就是加了个s嘛,实质上也是,https是http上加了一层安全套接层(SSL :safe socket level),也就是这样。

http1.1与SPDY

然而http1.1还有几个明显的缺点,
一是会发生堵塞:请求到达的服务器的速度是不同的,如果先发的请求先到达可能会发生阻塞,这样带宽就降低了
二是不支持服务端推送,如果要求做一个服务端数据变动页面立即改变的组件就很难做。要用短轮询和长轮询。这样对带宽影响也是很大的。

所以,GOOGLE推出了SPDY。

SPDY是基于https的,也就是这样。

嘛,SPDY解决的问题还是很多的。具体如下。

  • 降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。
  • 请求优先级(request prioritization)。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。

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

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

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

SPDY与http2

结果httpSPDY这么好用,基本上大家都在用,就基于SPDY推出了 http2.0,而且把SPDY的优势用在了http上,也就是可以不用加密也能使用。而且稍微的把头部压缩算法换了一换。

具体来说

  • HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
  • HTTP2.0 消息头的压缩算法采用 HPACK http://http2.github.io/http2-spec/compression.html,而非 SPDY 采用的 DEFLATE http://zh.wikipedia.org/wiki/DEFLATE

综合上文 来个完整的流程图吧。

发布于:2019-11-08 12:41:32