Fork me on GitHub

HTTP-1-1

推荐阅读:HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比

比较 HTTP1.0 、HTTP1.1、 HTTP2.0

共同点:

  1. 都是应用层协议,基于 TCP/IP 协议。
  2. 无状态
HTTP1.0 HTTP1.1 HTTP2.0
特点 无连接、队头阻塞 长连接、管道化、缓存处理 二进制分帧、多路复用、头部压缩、服务器推送

HTTP1.0

  • 无连接:在 HTTP1.0 中,浏览器的每次请求都需要新建连接,服务器处理完毕后立即断开连接。
  • 队头阻塞:在 HTTP1.0 中,浏览器需要收到上一个请求的响应后,才能发送下一个请求,如果响应不到,那么之后的请求都将被阻塞。

HTTP1.1

  • 长连接:HTTP1.1 可以设置 keep-Alive 来保持 HTTP 连接不断开。如果浏览器想关闭 HTTP 连接,可以在请求头中携带 Connection:false 来告知服务器关闭请求。
  • 管道化: 使用管道,可以“并行”发送多个请求。但服务器仍必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。
    • 也就是说管道化,可以让 FIFO 队列从客户端(请求队列)迁移到服务端(响应队列)。
  • 缓存处理:增加了cache-control字段,支持断点传输、增加了 Host 字段(使得一个服务器能够用来创建多个Web站点)。

HTTP2.0

  • 二进制分帧:在 HTTP2.0 中,在应用层和传输层之间增加一个二进制分帧层,改进了传输性能。
  • 多路复用:在 HTTP2.0 中,一个 TCP 连接可以承载任意数量的双向数据流。
    • 一个请求是一个数据流,数据流以消息的方式发送,消息可以分成多个帧,帧头部记录着stream id来标识所属,所以不同属的帧可以在连接中随机混杂。接收方可以根据stream id再将帧归属到不同的请求当中去。
    • 实现了真正的并行传输。
  • 头部压缩:在 HTTP1.x 版本中,头部元数据太大。在 HTTP2.0 中,使用encoder来大幅度减少 header 的大小。通讯双方各自cache一份header fields表,header 会减小。
  • 服务器推送:在 HTTP2.0 中,服务器可以额外向客户端推送资源。

核心总结比较:

  1. Http1.0 中,一个请求就要一个 HTTP,每个 HTTP 就要建立一个 TCP 连接。
  2. Http1.1 中,多个请求共用一个 HTTP,每个 HTTP 就要建立一个 TCP 连接。
    1. 此多个请求实现了按请求FIFO的管道化发送和接收。
  3. Http2.0 中,多个请求共用一个 HTTP,多个 HTTP 也可以共用一个 TCP 连接。
    1. 请求的数据流分多帧,帧头部的 stream id 标识所属。
    2. 在 TCP 连接中,允许双向不同属的帧随机混杂,接收方负责按 stream id 将帧归属到不同的请求中去。

HTTPS 流程

client 向 server 发送请求:

  1. client 访问 Https://…;
  2. server 返回数字证书(包括 server 的公钥);
  3. client 使用预置的 CA 列表验证证书,如果有问题,则提示风险;(是为了避免中间人劫持,正常传输 server 的公钥)
  4. client 生成随机的对称密钥,用 server 的公钥加密;
  5. server 用自己的私钥解密,得到对称密钥;
  6. 自此,双方都知道对称密钥,可以进行加密传输。

第 1~3 步是为了安全传输 server 的公钥;
第 4~6 步是为了安全传输对称密钥。

  • 数字证书 = 数字签名 + (server 的公钥 & server 的个人信息)。

    • 其中(server 的公钥 & server 的个人信息)可以使用 Hash 算法得到消息摘要
      消息摘要使用 CA 的私钥可以得到数字签名
  • client 验证证书的过程:

    1. 取出证书中的(server 的公钥 & server 的个人信息),使用相同的 Hash 算法得到消息摘要1;
    2. 取出证书中的数字签名,使用 CA 的公钥解密,得到消息摘要2;
    3. 比较两份消息摘要,如果不同,说明可能遭到了篡改。

推荐阅读《码农翻身》第 199~207 页。

-------------The End-------------