HTTP 演进史

精通 HTTP 吗?

在面试相关开发岗位的同学中,我经常会问一些跟编程语言不相关的东西,比如下面这些问题:

1. 你平时是怎么学习的?学习渠道有哪些?
2. 项目组中,你认为最重要的是什么?
3. 你在项目组中遇到的最大困难(非编程问题)是什么,你是怎么解决的?
4. 项目执行过程中,其他同事遇到困难,你是如何做的?

这些问题可以让面试者自由发挥的题目,并没有固定的标准的答案。这样的问题问出来有诸多好处,首先可以让面试者稳定一下心态不至于太紧张,其次可以看看他的语言组织能力和表达能力,从中也能看出他有没有过实际的项目经验。

很多人的简历上面写的很完美,做过诸多项目,精通某某语言的编程,精通各种网络协议,熟悉各大操作系统等等,当深入问他们熟悉的知识时,发现他们的回答却含糊不清。不排除世界上有这样的全才,但是肯定不会被我们轻易遇到,至少我觉得自己还没有达到那个能力。

如果你还没有但又想精通各种知识,就慢慢去学习并精通相关的知识,循序渐进,相信自己会做到的。好了,不扯了,今天聊聊 HTTP 的发展历史。

我敢保证有绝大部分的人不知道 HTTP/2,虽然他早就来临.

HTTP 0.x 到 HTTP/2

HTTP/1 是 HTTP 1.0 和 HTTP 1.1 的统称,分别指 HTTP 协议的版本是 1.0 和 1.1.

1960年美国人 Ted Nelson 构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext), 这成为了 HTTP 超文本传输协议标准架构的发展根基,所以他被称之为 HTTP 之父

1989年3月在 CERN(欧洲核子研究组织)工作的 Tim Berners-Lee(蒂姆.伯纳斯.李) 提交了一个提案 Information Management: A Proposal,该提案描绘了其对万维网(World Wide Web)最初的设想即能让远隔两地的人们共享知识,Tim 是 万维网之父,成就和贡献也是不计其数。

直到1990年 HTTP 才算是问世,姑且称之为 HTTP 0.x 版本,也有些地方称之为 HTTP 0.9 版本,总之这不是一个正式版。1996年5月,HTTP 1.0 作为 HTTP 的第一个正式版本正式公布,并记载于 RFC1945 中。

随着人们对互联网的认知和技术的发展(尤其是浏览器等相关的技术),发现 HTTP 1.0 缺点还是比较多,无法满足快速的互联网发展需求。于是在1997年1月发布了 HTTP 1.1 版本,并记载于 RFC2068 中,后来在1999年6月,对 RFC2068 又做了补充和修正,称之为 RFC2616, 至此 HTTP 1.1 开始一统天下,直到现在绝大数开发者使用的都是 HTTP 1.1 版本。

另外一个版本 HTTP/2 标准于2015年5月以 RFC 7540 正式发表,多数主流浏览器已经在2015年底支持了该协议,时隔多年,HTTP/2 才问世。

苹果从 iOS9 开始支持 HTTP2.0,对 iOS 开发人员来说从 iOS9 开始 NSURLSession 可以支持 HTTP2.0 了。目前 Android 绝大部分系统不支持 HTTP/2,Android 原生 HttpURLConnection 框架并不支持 HTTP/2,但可以选用三方开源库 okhttp 作为网络框架,Android 5.0+(系统版本)设备才支持 HTTP/2。所以想全面使用 HTTP/2 还是要付出一定的代价,不过随着技术的革新,相信 HTTP/2 将会大放光彩。

HTTP 不断的改进

用一张图来描述 HTTP 的不断改进和演变史,如下图所示:

下面具体看看这些协议版本的演进过程中,究竟是新增和改进了哪些东西?

HTTP 0.9

HTTP 0.9 并非出自某个标准化组织,只是 Tim 的个人作品而已,比较简单。可以参阅这篇文章 The Original HTTP as defined in 1991 ,该版本规定了 HTTP 使用 TCP/IP 连接,HTTP 请求只有一个请求行,只有一个 GET 方法加上请求的URI。HTTP 响应则直接返回 HTML 文本,没有状态码,所以也没有办法区分错误消息和正常的文本。可以看出,HTTP/0.9并不完善,也不是那么完美,但是这的确是 Tim 坚持下来的结晶。

HTTP 1.0

HTTP 1.0 增加了请求头域和响应头域,增加了 HEAD 和 POST 方法,响应对象不再局限于 HTML 文本,支持长连接和缓存机制等等。

HTTP 1.0 具体特点

1.可以发送更多格式的内容,如图像、视频、二进制文件,不仅仅局限于文字了。

2.增加了 POST 和 HEAD 方法。

3.改变了 HTTP 请求和回应的格式。除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据,即增加了请求头信息,响应数据不再局限于 HTML 文本。

4.新增状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等功能。

5.增加了长连接的支持,不过 HTTP 1.0 需要在 request 中增加 ”Connection: keep-alive“ header 才能够支持,后面要说到的 HTTP 1.1 默认就支持了。

可以看出,HTTP 1.0在 HTTP 0.9 的基础上做了大量的扩充和改进。

HTTP 1.0 主要缺点

1.每次请求都需要建立 TCP 连接,即每对 Request/Response 都使用一个新的连接。

2.不支持断点续传。

HTTP 1.1

每个新版本的诞生基本都是对上一个版本的补充和改进,就像我们的软件开发一样,协议也需要迭代。

HTTP 1.1 具体特点

1.加强和优化了持久连接即长连接。

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

2.增强了缓存机制。

引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等可供选择的缓存头。

3.请求头引入了 range 头域。

它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

4.将 Content-length 字段的作用进行扩充,即声明本次回应的数据长度(一个TCP连接现在可以传送多个回应,势必就要有一种机制,区分数据包是属于哪一个回应的)。

5.采用分块传输编码。

对于一些很耗时的动态操作,服务器需要等到所有操作完成,才能发送数据,显然这样的效率不高。更好的处理方法是,产生一块数据,就发送一块,采用流模式(stream)取代缓存模式(buffer)。

6.新增了许多动词方法:PUT、PATCH、HEAD、OPTIONS、DELETE。另外,客户端请求的头信息新增了 Host 字段,用来指定服务器的域名。

7.新增了 24 个错误状态响应码。

HTTP 1.0 主要缺点

HTTP 1.1 虽然增加了很多功能,在一定程度上已经很强大了,但是他自身也是有缺点的,换句话说有优化的空间,主要问题如下:

1.队头堵塞(Head-of-line blocking),各个请求到达的服务器的速度是不同的,如果先发的请求先到达可能会发生阻塞,剩下所有的工作都会被阻塞在那次请求应答之后,这样就降低了带宽。

为了避免这个问题,有两种方法:一是减少请求数,二是同时多开持久连接。

2.臃肿的消息头部

3.不支持服务端推送,例如要求使用 HTTP 协议做一个服务端数据变动页面立即改变的组件就不好做,可用轮询的方式进行,这样就会对带宽影响较大。

SPDY

在说到 HTTP/2 之前,必须要先说说 SPDY。SPDY 是由 Google 公司推出的,SPDY 的推出是为了解决 HTTP 1.1 中存在的一些问题的。

1.多路复用(multiplexing)

多路复用通过多个请求 stream 共享一个 TCP 连接的方式,解决了HOL blocking 的问题,降低了延迟同时提高了带宽的利用率。

2.可以对请求设置优先级

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

3.对请求头的压缩

选择合适的压缩算法可以减小包的大小和数量,这样在一定程度上可以提高网络使用效率。

4.为了数据传输的安全性,强制使用基于 HTTPS 的加密协议传输。

5.支持服务端推送。

称之为 Server Push 功能,服务器在还没有收到客户端的请求,服务器就可以把各种资源推送给客户端。

比如,客户端只请求了 index.html,但是服务器把 index.html、x.css、x.jpg 等资源全部发送给客户端。这样的话,只需要一轮 HTTP 通信,客户端就得到了全部资源,提高了通信的性能,也提高了用户体验。

HTTP/2

本质上来讲,HTTP/2 是建立在 SPDY 基础之上的,借鉴了很多 SPDY 的设计思想和策略。 HTTP 具有 SPDY 的优点,同时自己也有与 SPDY 的不同点,主要如下:

1.HTTP/2 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS。这一点 HTTP/2 相对人性化一些。

2.HTTP/2 会对请求头和响应头做压缩以提升请求性能,HTTP/2 消息头的压缩算法不同于 SPDY。 HTTP/2 采用 HPACK,SPDY 采用的 DEFLATE 算法。

HTTP/2 支持所有的 HTTP 1.1 的核心特征,其提供了 HTTP 语义的传输优化,并且在各方面做到更高效。HTTP/2 的头信息是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为帧(frame),即头信息帧和数据帧。对 HTTP/2 感兴趣的可以看一下 HTTP2 协议初识 这篇文章。


扫码关注,你我就各多一个朋友~

坚持原创技术分享!