blog icon indicating copy to clipboard operation
blog copied to clipboard

HTTP1.x 与 HTTP2 简介与区别

Open eteplus opened this issue 6 years ago • 1 comments

1、浏览器与服务器通信过程

  • TCP 连接: 浏览器与服务器三次握手,建立 TCP 连接
  • 客户端请求: 建立 TCP 连接后,客户端就会向服务器发送一个 HTTP 请求信息(比如请求 HTML 资源,我们暂且就把这个称为“ HTML 请求”)
  • 服务器响应: 服务器接收到请求后进行处理并发回一个 HTTP 响应信息

2、HTTP/1.x 简介

  • 在HTTP1.0下, 每完成一次请求和响应,TCP连接就会断开,因为TCP连接会有RTT(Round Trip Time, 往返时间),每请求一个资源就要有一次RTT,所有需要加载资源比较多得网站会打开很慢

  • 在HTTP1.1下,TCP可以持久连接,一次TCP连接要等到同域名下的所有资源请求/相应完毕了连接才会断开,请求同域名下的n个资源就能节省(n-1)* RTT的时间,

HTTP/1.1 时请求一个 HTML 和一个 CSS 只需要经历一次 TCP 连接

http1 1

  • HTTP1.0 和 HTTP1.1 区别:

  1. 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
  2. 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
  3. 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
  4. Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
  5. 长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点

http1-http1 1

3、HTTP/1.x现在存在的一些问题

  • HTTP1.x 在传输数据时,每次都需要重新建立连接,增加了大量的延迟时间
  • HTTP1.x 在传输数据时,所有的传输内容都是明文的,客户端和服务端无法验证对方的身份,在一定程度上无法保证数据的安全性
  • HTTP1.x 在使用时,header里携带的内容过大,增加了传输的成本,在移动端增加用户流量
  • HTTP1.x 虽然支持了keep-alive, 来减少多次创建连接产生的延迟,但是keep-alive 使用多了也会给服务端带来大量的性能压力,并且对于单个文件被不断请求的服务,因为文件被请求之后还保持了不必要的连接时间,keep-alive可能会极大的影响服务器的性能
  • 虽然HTTP1.x可以让客户端向服务器并行发送多个请求,而且服务器也可以并行处理多个请求,但是HTTP/1.x 有严格的串行返回响应机制,通过 TCP 连接返回响应时,必须一个接一个,前一个响应没有完成,下一个响应就不能返回,如果第一个响应时间很长,那么后面的响应处理完了也无法发送,只能被缓存起来,占用服务器内存

4、 HTTP/2

  • 新特性:

  1. 二进制分帧层
  2. 多向请求与响应
  3. 优先级和依赖性
  4. 首部压缩
  5. 服务器推送
  • 好处:

  1. 多路复用(MultiPlexing):一次TCP握手,多个同域并行请求,请求和响应同时发送接受,然后再拼装组合,不阻塞;一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面 原理图: http2 0-multi

  2. header压缩 : HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小;

  3. 优先级和依赖性(Priority):可以请求的时候告知服务器端,资源分配权重,优先加载重要资源;

  4. 服务器推送(Server Push):根据客户端需求,服务端主动推送资源,减少请求耗时;

  • HTTP2和HTTP/1.x的区别:

http2 0-http1 1

5、Demo

Github: https://github.com/eteplus/http2-demo

eteplus avatar Aug 27 '17 12:08 eteplus