Http1.0
Http1.0是一种无状态、无连接的应用层协议。
HTTP1.0规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。
Http1.0的导致的问题
- 无复用连接
每发送一次网络请求都要进行一次TCP连接;而TCP得连接和释放又比较耗费时间(每次都需要三次握手和四次挥手);这种无连接的特性会使得网络的利用率非常低。
- 队头阻塞
HTTP1.0规定下一个请求必须在前一个请求响应到达之后才能发送。假设前一个请求响应一直不到达,那么下一个请求就不发送,同样的后面的请求也给阻塞了。
Http1.1
为了解决Http1.0的一些问题,Http1.1出现了;
对于 HTTP/1.1,不仅继承了 HTTP1.0简单的特点,还克服了诸多 HTTP1.0性能上的问题。
Http1.1的新增特点
- 持久化连接
通过设置 Connection:keep-alive 来实现持久化连接(长连接),即多个请求和响应可以利用同一个 TCP 连接,而不是每一次请求响应都要新建一个TCP连接。 - 增加管道机制
管道化使得请求能够“并行”传输。而‘响应’依旧是一个一个返回。并没有真正意义上的解决队头阻塞问题;
但是,当出现队头阻塞时,浏览器会建立多个TCP连接;
分块传输
在 HTTP/1.1 版本中,可以不必等待数据完全处理完毕再返回,服务器产生部分数据,那么就发送部分数据,很明此种方式更加优秀一些,可以节省很多等待时间。增加 host 字段
使得一个服务器能够用来创建多个 Web 站点。错误提示
HTTP/1.1 引入了一个 Warning 头域,增加对错误或警告信息的描述,此外,在 HTTP/1.1 中新增了24个状态响应码(100,101,203,205,206,301,305… )。带宽优化
HTTP1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,客户端接收到100才开始把请求body发送到服务器;如果返回401,客户端就可以不用发送请求body了节约了带宽。缓存处理
HTTP1.1
还加入了缓存处理(强缓存和协商缓存[传送门])新的字段如cache-control
Http2.0
HTTP 2.0的目标:改进传输性能
HTTP 2.0 的主要目标是改进传输性能,实现低延迟和高吞吐量。从另一方面看,HTTP 的高层协议语义并不会因为这次版本升级而受影响。所有HTTP 首部、值,以及它们的使用场景都不会变。
Http2.0新增特点
1. 多路复用(连接共享)
多路复用的一些概念:
- 流(stream):已建立连接上的双向字节流。
- 消息:与逻辑消息对应的完整的一系列数据帧。
- 帧(frame):HTTP2.0通信的最小单位,每个帧包含帧头部,至少也会标识出当前帧所属的流(stream id)。
一次Http请求响应对应会建立一个双向字节流;每一流有自己的 Stream ID
每个数据流以消息的形式发送,而消息由一或多个帧组成。这些帧可以乱序发送,然后再根据每个帧头部的流标识符(stream id)重新组装。
所有的HTTP2.0通信都在一个TCP连接上完成,这个连接可以承载任意数量的双向数据流。
另外,多路复用(连接共享)可能会导致关键请求被阻塞。HTTP2.0里每个数据流都可以设置优先级和依赖,优先级高的数据流会被服务器优先处理和返回给客户端,数据流还可以依赖其他的子数据流。
2. 头部压缩
HTTP1.1 不支持 header 数据的压缩,HTTP/2.0 使用 HPACK 算法对 header 的数据进行压缩,这样数据体积小了,在网络上传输就会更快。高效的压缩算法可以很大的压缩 header ,减少发送包的数量从而降低延迟。
3. 服务器推送
在 HTTP/2 中,服务器可以对客户端的一个请求发送多个响应,即服务器可以额外的向客户端推送资源,而无需客户端明确的请求。
总结
HTTP1.1
- 持久连接
- 请求管道化
- 增加缓存处理(新的字段如cache-control)
- 增加Host字段、支持断点传输等
HTTP2.0
- 多路复用(或连接共享)(基于二进制分帧)
- 头部压缩
- 服务器推送