最近想重新系统地整理一下前端的知识,因此写了这个专栏。我会尽量写一些业务相关的小技巧和前端知识中的重点内容,核心思想。
前言
本期我们来看看应用层的协议,也是使用最广的协议,【HTTP协议】。关于HTTP协议的很多基本描述网络上都有,本文就不作复述了。这里我们主要关注的点是,不同版本的HTTP协议的变化。
HTTP协议发展进程
HTTP是一种位于应用层的协议。所谓的协议,就是一群人在某个时间一起制定下来让大家一直遵守的规范。可是技术是在不同发展的,市场需求也在不同变化,为了满足新的业务需求,HTTP协议本身也需要不停迭代。这就是为什么会有不同版本的HTTP协议。
当今最常提到的版本有:
版本号 | 发布时间 |
---|---|
HTTP/0.9 | 1991 |
HTTP/1.0 | 1996年 |
HTTP/1.1 | 1997年 |
HTTP/2 | 2015年 |
版本迭代内容
HTTP/0.9
这是最早的http版本,内容也极其简单。对于请求只有一个get请求,用于获取某个url下的资源文档。响应也只有文档本身,没有其他内容。
HTTP/1.0
经历了浏览器的早期迅速发展,大家都知道浏览器实际上可以做的事情是很多的,便从协议上新增了许多内容:
- 协议版本信息现在会随着每个请求发送(HTTP/1.0被追加到了GET行)。
- 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)。
- 引入了HTTP头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。
- 在新HTTP头的帮助下,具备了传输除纯文本HTML文件以外其他类型文档的能力
HTTP/1.1
1.0版本发布后,浏览器的功能确实是丰富了不少。但同时也出现了在实际运用中混乱的问题。其中最主要的原因是在1.0中一些字面表达不够清晰具体,或者有歧义。导致不同的浏览器厂商对协议的理解不同,最终出现了市场混乱的局面。
1.1版本最大的功绩就是,从协议上明确一些模糊的地方,制定一份真正的标准协议。也是目前使用最多的版本,它的改进内容有:
- 连接可以复用(keep-alive),节省了多次打开TCP连接加载网页文档资源的时间。
- 增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。
- 支持响应分块。
- 引入额外的缓存控制机制。
- 引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换。
- 通过host头,能够使不同域名配置在同一个IP地址的服务器上。
HTTP/2.0
1.1 是目前使用最广的HTTP协议版本,能沿用那么久想必已经非常稳定了。可是经历了十多年的技术发展之后,web体验想要更上一层楼,HTTP协议又到了要进化的时候了。终于在2015年,迎来了2.0版本。这是一个有着飞跃般进步的版本:
- 二进制分帧:HTTP/1.1的头信息是文本(ASCII编码),数据体可以是文本,也可以是二进制;HTTP/2 头信息和数据体都是二进制,统称为“帧”:头信息帧和数据帧;
- 多路复用(双工通信) :通过单一的 HTTP/2 连接发起多重的请求-响应消息,即在一个连接里,客户端和浏览器都可以同时发送多个请求和响应,而不用按照顺序一一对应,这样避免了“队头堵塞”
- 数据流:因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。
- 首部压缩:HTTP 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP/2 对这一点做了优化,引入了头信息压缩机制(header compression)。一方面,头信息压缩后再发送。另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
- 服务端推送:HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。
HTTP/1.1的缺点(HTTP1 与 HTTP2的区别)
HTTP1的缺点就是2的进步方向,自然就是2者的区别。这是一道常见的面试题,我们一起来看看考虑方向应该是什么.
http1缺点
我们的都知道HTTP/1.1其实已经是一个很标准的协议了,可是HTTP最早在定义的年代,互联网只是被设计成一个用来远距离预览服务器中静态文档(document)的东西。但现在我们看到页面现在已经远远不止如此了,甚至开始向应用(Applications)的方向发展。在这样的大环境下,http1最大的缺点是什么?
- 还不够轻:由于http是无状态连接,因此每次的请求都得把头部信息带上。因此实际上很多的信息内容是重复的,不需要的。
- 队头堵塞:1.1版本比起上一个版本,一个非常显著的进步就是长连接,让多个http请求复用同一个TCP连接。可惜在1.1中所有的请求都是按顺序处理的,因此如果前面有一个处理慢的请求就会卡着后面的请求。
- 单向推送:http请求总是由客户端发起,服务器响应的。就算资源A与资源B是绝对关联的,但为了获取资源A与资源B,客户端必须要发起2次请求。
http2的改进
http1的缺点,自然是http2的努力方向:
- http2让头信息和数据体都用二进制的格式传输,这样减轻了框架的复杂性,并简化了由于包含文本和可选空格的命令而导致混淆的命令的实现。
- 既然不能避免每次都需要带头部信息,那就把信息再变得更小一点。HTTP2压缩大量冗余头帧。 它使用 HPACK 规范作为标头压缩的简单安全方法。
- HTTP2用多路传输的方法可以一次发送多个请求,而不是一个个用队列的方式处理。
- HTTP2支持由服务端主动发起推送。如果客户端发起请求资源A,服务端在知道资源A与资源B是绝对关联的情况下,可以主动推送资源B给客户端。减少客户端请求次数。
总结
HTTP版本这部分不是web工程师的技术方式,但我们应该时刻关注这些协议的发展。因此他们往往决定着整个web的未来发展方向。对协议的深入了解,也可以帮助我们在某些特殊场景下解决一些莫名其妙的bug。例如一些由于市场上老旧浏览器导致的不可见bug。
参考
developer.mozilla.org/zh-CN/docs/…