演进时间点
HTTP 发明(1989 Tim Berers-Lee) --> HTTP 1.0 (1996) --> HTTP 1.1 (1999) --> HTTP/2 (2015)
HTTP 1.0 中的问题:
每次请求都是一次独立的 TCP (3次握手)连接建立和关闭的过程;
HOL (Head-of-line blocking)如果由于前面的请求不能及时处理,后续请求需要被阻塞直到前面的请求处理完毕才能继续发送。
HTTP 1.1 相比 1.0 改进了包括:
持久化连接,重用了 TCP 连接,减少不必要的资源的建立和释放过程。
Pipeline 机制:多个请求可以同时发送,但是服务端仍然要按序一个个返回,所以仍然有一定程度的(HOL), 各个浏览器对于这个特性不太感冒,很多禁掉或者没有实现这个Pipeline 机制
除了上述主要修改,还涵盖Cache,扩展性(引入的比如路径追踪的头部和OPTIONS 方法),带宽利用(断点续传,部分资源请求,压缩),网络连接管理(持久化,Pilelining),消息传递(分块传输,编码方式指定),网络地址维护,错误通知的管理(新的状态码和警告头部),安全和完整性
为了有效利用带宽和提高Web 服务性能,采用了一些技术
拼接技术: 多个 js 文件整合一个,减少请求次数,但是也造成杀鸡牛刀的影响(小改动大数据的重新下载)
嵌入内联 (将一些图片原始数据嵌入 css 中,也是减少请求次数,缓存无法有效利用,无法页面共享)
Sprite 技术 (将很多小图拼接大图,然后使用js和css 等重新切割出来的小图,维护开发相对复杂)
Sharding 技术(浏览器限制某一个域最多有 5(不同浏览器有些小的差别)连接,所以有些网站为了提高性能,使用新的主机名,提高同时连接的数目,实现资源请求的效率的提升)
HTTP/2 登场
HTTP 1.1 虽然较 1.0 改进了了很多,但是在如今随着网页的越来越复杂丰富,移动网络的兴起(相比传统的有线稳定的网络),如今的带宽往往处理这些越来越力不从心,所以演进了 HTTP/2 (基于 Google SPDY)
HTTP/2 有如下特点:
二进制的协议(相比原来的文本方式,解析处理更加容易)
采用多路复用(共享连接上双方可以同时发送请求和响应,这样原来 HTTP/1.1 的中一些技术比如sharding,嵌入内联,Spriting 就没有必要了)
每个流可以设置优先级和依赖关系 (服务器或者客户端对于并行发送的这些独立的帧的设置,可以控制资源的获取先后顺序)
服务器推送 (服务器主动将资源推送给客户端,减少客户端额外请求的延迟)
头部压缩 (HPACK 压缩格式,主要是静态Huffman 对头部字段编码 ,并且客户端和服务端同时维护,更新这些头部字段的索引列表)
流量控制 (服务器和客户端可以实现自己的数据流流量控制,更加接近应用级别的流控)
HTTP/2 的支持
现在基本所有大型浏览器对提供了对于 HTTP/2 的支持,包括Firefox, Chrome 等。 (HTTP/2本身并不强制使用TLS,但是一些浏览器要求使用HTTP/2 必须使用 TLS) ,一些主要的Web 服务器也提供了支持,比如Nginx,Apache 等。
部署 HTTP/2 需要客户端和服务器同时支持,如果对于普通的Web 程序,浏览器支持就够了。
HTTP/2 性能比较一个例子
而 HTTP/1.1 同一时间是大约是5~6 个并发请求,所以对于这种100 个小图拼接的图像,HTTP/2 完败 HTTP/1.1
以上只是简单的总结,更加深入的介绍还需要对于 HTTP/2 规范等细致的通读一下。
阅读(610) | 评论(0) | 转发(0) |