http1.0与http1.1的区别
主要区别主要体现在:
缓存处理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
带宽优化及网络连接的使用
HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
错误通知的管理
在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
Host头处理
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
长连接
HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
分块编码
这里我们先了解一下什么是分块编码。
简单来说分块编码就是把数据拆分成一个个的数据块。
然而,为什么会有这种情况呢?
通常情况下,http响应消息以message body
的形式作为整包发送给客户端的,用content-length
表示消息体的长度,这个长度对于客户端来说非常重要,因为持久连接不会马上结束,而是可以发送多次请求/响应,客户端需要知道哪个位置才是响应消息的结束,以及后续响应的开始,因此这个content-length就显得尤为重要,服务端必须精确地告诉客户端这个值,如果content-length比实际长度短,就会出现截断,如果比实际长度长,就可能出现一直处于pending状态。
在这种情况下,在复杂页面中可能就会出现这样的情况,如果是要把消息完全创建好之后再计算出其content-length,这时候客户端就会有一段等待时间,页面越复杂数据越复杂计算时间越长,可能用户就会受不了。
分块传输编码就是针对这个情况作出的一种解决方案。它将数据分解成一系列数据块,并以多个块发送给客户端,服务器发送数据时不再需要预先告诉客户端发送内容的总大小,只需在响应头里添加Transfer-Encoding:chunk
就可以不用告诉客户端发送内容的长度了
HTTP2.0
http2.0的主要目的是改进传输性能,实现低延迟和高吞吐量。
为什么会需要http2.0?
在http1.1中出现了很多优化措施,但是,当我们想要进行这些措施时,就会发现,其实其中包含了很多限制。HTTP1.x只能串行地返回响应,他不允许一个连接上的多个响应数据交错到达(多路复用),因而一个响应必须完全响应返回之后,下一个响应才回开始传输。
而http2.0就是通过支持请求与响应的多路复用来减少延迟,通过压缩HTTP首部字段来将协议开销降至最低,同时增加对请求优先级和服务器推送的支持
http2.0的实现
二进制分帧层
HTTP 2.0 性能增强的核心,全在于新增的二进制分帧层(图 12-1),它定义了如何
封装 HTTP 消息并在客户端与服务器之间传输。
在http1.x中,如果客户端想发送多个并行的请求以改进性能,那么必须使用多个tcp连接,该模型会保证每次连接只交付一个响应,更糟糕的是,这种情况下也会造成队首阻塞,从而造成底层tcp连接的效率低下。
http2.0中新的二进制分层突破了这种限制,实现了多向请求和响应,客户端和服务器可以把http消息分解为互不依赖的帧,然后乱序发送,最后再另一端然后再根据每个帧首部的流标识符重新组装。
首部压缩
http的每次通信会携带一组首部,用于描述传输额资源及其属性。在http1.x中,这些元数据以文本的形式发送,通常会给每个请求增加500-800字节的负荷。如果算上cookie,可能就会出现上千字节的负荷。为减少开销并提升性能,http2.0会压缩首部元数据
- http2.0在客户端和服务端通过“首部表”跟踪和存储之前发送的键值对,对于相同的键值对,不再每次请求和响应发送
- 首部表在http2.0的连续存储期内始终存在,由客户端和服务器共同渐进地更新
- 每个新的首部键值对要么被追加到当前表的末尾,要么替换表中的值