HTTP的变迁

一张图看懂HTTP发展

http 变迁

http1.0

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

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

http1.0与http1.1

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

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

http与HTTPS

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

http1.1 与SPDY

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

所以,GOOGLE推出了SPDY。
http1.1

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

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

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

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

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

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

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

SPDY与http2

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

具体来说:

引用

记录点滴,成为更好的自己。 — weizhuo.ma