走过路过,不要错过这个公众号哦!
我们打开网页,在址址栏键入网址,直到获取资源, 这一切都是构建在HTTP协议上进行通信的,所以说HTTP是前端开发人员必须掌握的基础中的基础一点不为过。下面请跟前笔者一起漫步的方式一起走过HTTP发展的那些往事,让我们站在历史的高度上回顾和展望。
HTTP(HyperText Transfer Protocol),名为超文本传输协议。之所以叫超文本,是源于当时Tim Beners-Lee博士共享知识的设想,最初的理念是希望通过多文档的互联继而形成超文本,连接可相互参阅的WWW(万维网)。
最初的构想
HTTP其实在1990年就已经有雏形了。被称为HTTP/0.9, 也就是1.0之前版本。标准当时定义得非常简单,就是请求-应答。当时的响应报文也只有一个响应体构成。这就意味着不可以构造特殊的数据类型(Content-type),所以响应包只是简单的以与服务器的TCP连接的断开为结束。
请求-应答式
标准确立:失忆症的巨人
HTTP/0.9 并没有被服务器广泛使用,直到1996年5月HTTP/1.0标准公布。直到现在,若有人提到老标准HTTP,指的就是HTTP1.0。HTTP/1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。也就是说吧,服务器端不对请求和响应的通信状态进行保存。一句话,HTTP是无状态的(stateless)
http/1.0有两个很大的缺点:
连接无法复用 (TCP通道立即关闭)
队首请求阻塞 (http、tcp)
http应用层队首阻塞:http1协议规定严格按照优先级进行请求发送,意味着低优先级请求的发送必须等待高优先级响应后进行。
tcp传输层队首阻塞:tcp要求分组严格按照顺序交付,一个分组未收到,就会阻塞后续的所有高序号分组。直到重传那个丢失的分组。
如果说只是传输文本,这样做其实没多大问题。随着Web的发展,文档中包含大量的图片,多次TCP通道的建立和断开,增加大量冗余的通讯开销。
流水线化
1997年1月,HTTP/1.1版本发布。可以看出从1.0发展到1.1这个过程是非常快的。
HTTP/1.1解决了老版本中的两个痛点。
1 通过持久连接(keep-alive)的方式,使流水线(pipelining)通讯作业成为可能。有的文章中称其为管线化,但笔者更喜欢流水线这个词,形象生动的解释了HTTP/1.1的工作原理。
2 支持多个请求同时发送,互不影响。
在HTTP/1.1中keep-alive是默认开启的。但也可在服务器端将其关闭。
SPDY 多路复用的尝试
虽然在HTTP/1.1中已经支持流水线化,但是随着时代的发展,其功能使用上的疲态已经凸显。
1 一条连接上只能发一个请求
2 请求只能从客户端开始
3 请求/响应首部未经压缩
4 发送冗长的首部
5 可任意选择数据压缩
这些问题,是HTTP协议本身的限制。为了解决它们,必须进行一些协议层面上的改动。
SPDY并没有完全改写HTTP协议,而是在TCP/IP的应用层与传输层之间通过新加会话层的形式运作。
引入了SPDY,HTTP协议得以实现:
1 多路复用
通过单一的TCP连接,可以无限制处理多个HTTP请求。
2 赋予请求优先级
3 压缩HTTP首部
4 推送功能
5 服务器提示功能
SPDY消除了Web瓶颈了吗?
因为SPDY基本上只是将单个域名的通信多路复用,所以当一个Web网站上使用多个域名下的资源,改善效果就会受限。
不少人做过实验,结论是:SPDY没有给页面加载提升多少,不能抵消从SSL切换的成本。
HTTP/2.0的到来
可以说HTTP的发展是相当缓慢的。HTTP/2.0在2015年2月正式发布。并对SPDY协议进行了更新。
与SPDY相比,有重要的两点改进
1 HTTP/2 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
2 HTTP/2 消息头的压缩算法采用 HPACK ,而非 SPDY 采用的 DELEFT
HTTP/2 的改变:
1 HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式。二进制格式在协议的解析和优化扩展上带来更多的优势和可能。
2 HTTP/2 对消息头采用 HPACK 进行压缩传输,能够节省消息头占用的网络的流量。而 HTTP/1.x 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。头压缩能够很好的解决该问题。
3 多路复用,直白的说就是所有的请求都是通过一个 TCP 连接并发完成。HTTP/1.x 虽然能利用一个连接完成多次请求,但是多个请求之间是有先后顺序的,后面发送的请求必须等待上一个请求返回才能发送响应。这会很容易导致后面的请求被阻塞,而 HTTP/2 做到了真正的并发请求。同时, 流还支持优先级和流量控制。
4 Server Push:服务端能够更快的把资源推送给客户端。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 再发送这些请求。当客户端需要的时候,它已经在客户端了。
相关链接:
~求关注
全心全意为人民服务
长按扫码即可关注