Goverse / BohemianRhapsody

Mama, life had just begun
0 stars 0 forks source link

Http1.0,Http1.1,Http2.0对比? #22

Open Goverse opened 3 years ago

Goverse commented 3 years ago

HTTP1.0 和 HTTP1.1 区别

HTTP1.0 最早在网页中使用是在 1996 年, 那个时候只是使用一些较为简单的网页上和网络 请求上, 而 HTTP1.1 则在 1999 年才开始广泛应用于现在的各大浏览器网络请求中, 同时 HTTP1.1 也是当前使用最为广泛的 HTTP 协议。 主要区别主要体现在:

  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.x 和 HTTP2.0 区别

  1. 新的二进制格式(Binary Format) , HTTP1.x 的解析是基于文本。 基于文本协议的 格式解析存在天然缺陷, 文本的表现形式有多样性, 要做到健壮性考虑的场景必然 很多, 二进制则不同, 只认 0 和 1 的组合。 基于这种考虑 HTTP2.0 的协议解析决定 采用二进制格式, 实现方便且健壮。
  2. 多路复用(MultiPlexing) , 即连接共享, 即每一个 request 都是是用作连接共享机 制的。 一个 request 对应一个 id, 这样一个连接上可以有多个 request, 每个连接的 request 可以随机的混杂在一起, 接收方可以根据 request 的 id 将 request 再归属 到各自不同的服务端请求里面。
  3. header 压缩, 如上文中所言, 对前面提到过 HTTP1.x 的 header 带有大量信息, 而 且每次都要重复发送, HTTP2.0 使用 encoder 来减少需要传输的 header 大小, 通讯 双方各自 cache 一份 header fields 表, 既避免了重复 header 的传输, 又减小了需 要传输的大小。
  4. 服务端推送(server push) , 同 SPDY 一样, HTTP2.0 也具有 server push 功能。