推荐阅读:HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比
比较 HTTP1.0 、HTTP1.1、 HTTP2.0
共同点:
- 都是应用层协议,基于 TCP/IP 协议。
- 无状态
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 中,服务器可以额外向客户端推送资源。
核心总结比较:
- Http1.0 中,一个请求就要一个 HTTP,每个 HTTP 就要建立一个 TCP 连接。
- Http1.1 中,多个请求共用一个 HTTP,每个 HTTP 就要建立一个 TCP 连接。
- 此多个请求实现了按请求FIFO的管道化发送和接收。
- Http2.0 中,多个请求共用一个 HTTP,多个 HTTP 也可以共用一个 TCP 连接。
- 请求的数据流分多帧,帧头部的 stream id 标识所属。
- 在 TCP 连接中,允许双向不同属的帧随机混杂,接收方负责按 stream id 将帧归属到不同的请求中去。
HTTPS 流程
client 向 server 发送请求:
- client 访问 Https://…;
- server 返回数字证书(包括 server 的公钥);
- client 使用预置的 CA 列表验证证书,如果有问题,则提示风险;(是为了避免中间人劫持,正常传输 server 的公钥)
- client 生成随机的对称密钥,用 server 的公钥加密;
- server 用自己的私钥解密,得到对称密钥;
- 自此,双方都知道对称密钥,可以进行加密传输。
第 13 步是为了安全传输 server 的公钥;6 步是为了安全传输对称密钥。
第 4
数字证书 = 数字签名 + (server 的公钥 & server 的个人信息)。
- 其中(server 的公钥 & server 的个人信息)可以使用 Hash 算法得到消息摘要。
消息摘要使用 CA 的私钥可以得到数字签名。
- 其中(server 的公钥 & server 的个人信息)可以使用 Hash 算法得到消息摘要。
client 验证证书的过程:
- 取出证书中的(server 的公钥 & server 的个人信息),使用相同的 Hash 算法得到消息摘要1;
- 取出证书中的数字签名,使用 CA 的公钥解密,得到消息摘要2;
- 比较两份消息摘要,如果不同,说明可能遭到了篡改。
推荐阅读《码农翻身》第 199~207 页。