HTTP进化历程回顾
HTTP,全称是Hypertext Transfer Protocol,译作超文本传输协议,在OSI模型中处于应用层,所以常常称之为应用层协议。如今的HTTP协议在整个互联网应用中当属翘楚,相较于其他各类诸如TCP/UDP/IP等等协议,也是最广为流传。
粗略回顾一下HTTP协议的发展历程,知悉HTTP协议是如何推演,进化。
1.0 ~ 0.9
在HTTP协议整个职业生涯中,不得不提的一个版本就是1.0这个版本,因为正是这个版本加上了版本号这样的东西,那么HTTP 1.0版本究竟都有哪些内容呢?
- 增加了Version,它展示着整个协议进化的历程
- 增加了Http Header,将协议的元数据与业务数据进行了隔离
- 增加了Status Code,统一了通信双方对结果的认知
- ...
第一个版本定的是HTTP 1.0,那么在没有版本号的HTTP协议就被认为是0.9(我猜测的,暂时没有找到作证的资料),而这个版本相当粗糙,只有简单的GET,算是最纯粹的一个文本协议,所以能看出1.0版本对原来版本做的扩展与补充,属于功能性上的扩展。
1.1
在HTTP协议整个职业生涯中,目前最为大众所知的,应该是1.1这个版本,那么这个版本又给我们带来了什么核心的内容?这要回到1.0协议中有什么样的内容是急需解决的?HTTP每一次请求都需要建立新的TCP连接,意味着需要重复进行三次握手四次挥手,这是一个相当大的性能损耗。所以HTTP 1.0协议带来了什么值得关注的内容呢?
- 增加了Kee Alive,连接得以复用,节省了大量的三次握手的成本。
- 增加了Pipleline,优化了传输效率,使得上一个请求不用等待下一个请求即可继续写入。
其他的也包括一些内容,比如:
- 增加了Cache Controller
- 增加了Option
- 增加了Chunked Responses
- ....
2.0
至此,HTTP 1.1协议一直沿用至今,作为它可以表述足够负责的语义,能满足极多的业务场景,但是HTTP 1.1协议还存在一些问题,比如:
- Http Header中存在大量的重复性的内容
- 协议使用的是ZIP压缩,在传输前后占用较高的客户端/服务端CPU,传输成本不低
- 在互联网发展如此迅猛下,网页对资源性的内容下载诉求成爆炸式增长,Kee Alive+Pipleline的方式并不足以大范围提高协议的性能,因为请求还是需要一个一个串行写入。
HTTP 2.0(谷歌出过一个SPDY协议,可以称之为HTTP 2.0前身)在这个基础上做出了几点需要重点关注的优化:
- 对Http Header 使用** HPACK**算法进行压缩优化,消除大量重复性的内容
- 2.0是一个二进制协议,在传输效率上大大提高
- 增加了多路复用,在一个TCP连接上可以并行的写入请求内容。
HTTP 2.0协议对请求引入几个重要的概念,分别为帧,消息,流。HTTP 2.0会在发送端将请求拆分成二进制帧,包括Http Header帧,Request Body处理成Data帧,这些帧在TCP通道上可以并行写入,所以在接收端需要重新将这些帧分门别类,重新归整为消息,原理就是每个帧上都带着一个流ID。
3.0
毫无疑问,相比较于HTTP 1.1版本,2.0版本在性能上的提升是显而易见的,网上也有一些压测对比,可以了解一下。但是不要忘记一个问题,HTTP协议截止2.0版本一直都是构建在TCP协议上的应用层协议,所以TCP协议本身携带的问题无疑也会影响到HTTP,比如众所周知的Head-of-line Blocking问题,译作线头阻塞问题。它是什么问题?简而言之,站在TCP协议的视角并不能窥其HTTP协议的内容,故而当TCP发生丢包导致的超时重传等问题,HTTP上层应用是无法解决的,该阻塞还是会阻塞,上层的并行能力在底层是完全不可知的。那么,基于TCP协议构建的HTTP协议似乎是无解的问题。
TCP确实是无解的,所以谷歌又搞了个QUIC协议出来,全称Quick UDP Internet Connections,基于UDP协议构建的一个HTTP协议,也就是HTTP 3.0。为何UDP可以解决TCP无法解决的问题?因为UDP没有丢包重传等机制,所以前面的包丢了并不会影响后边的包。
但是,说话的时候你总不能对着谁说,然后也不管他听不听得到吧?所以HTTP 3.0需要把TCP协议的重传机制在应用层上再实现一遍。
关于QUIC协议参考资料:
https://mp.weixin.qq.com/s/CbdlTq1xb2N1WSnmGfmEQQ
https://mp.weixin.qq.com/s/ciR-1N4z0zvGOJSoyrvMUA
很粗糙,这并不是想科普HTTP协议,毕竟该协议内容即为庞杂,三言两语也说不完,何况笔者所学也是寥寥无几。笔者更想表达的是在回顾HTTP这样的全民协议的发展历程后,期望于对HTTP协议有一些本质的认知,以及未来对协议的选择与设计上有独立的思考与见解。