http
概念
http 是一个简单的请求-响应协议, 应用于应用层
HTTP 1.1
- 引入了持久连接(persistent connection),即 TCP 连接默认不关闭,可以被多个请求复用,不用在响应头声明Connection: keep-alive。长连接的连接时常
- 引入了管道机制(pipelining),即在同一个 TCP 连接里,客户端可以同时发送多个请求,进一步改进 HTTP 协议的效率
- HTTP 1.1 中新增加了 E-tag, If-Unmodified-Since, If-Match, If-None-Match 等缓存控制标头来控制缓存失效
- 支持断点续传,通过使用请求头中的
Range
来实现
- 使用了虚拟网络,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers), 并且它们共享一个 IP 地址
http 1.x 版本问题
- 在传输过程中,所有内容都是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性
- HTTP/1.1 版本默认允许 TCP 连接。但是在同一个 TCP 连接里,所有数据通信是按次序进行的,,服务器通常在处理完一个回应后,才会继续去处理下一个,这样子就会造成队头阻塞
HTTP 2.0
-
二进制分帧
这是一次彻底的二进制协议,头信息和数据体都是二进制,并且统称为帧
,头信息帧和数据帧
-
头部压缩
HTTP 1.1 版本会出现 「User-Agent、Cookie、Accept、Server、Range」 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用HPACK
算法进行压缩。
-
多路复用
复用 TCP 连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,这样子解决了队头阻塞的问题
-
服务器推送
允许服务器未经请求,主动向客户端发送资源,即服务器推送
-
请求优先级
可以设置数据帧的优先级,让服务端先处理重要资源,优化用户体验
多路复用
- HTTP 1.x 中,如果想并发多个请求,必须使用多个 TCP 连接,且浏览器为了控制资源,还会对单个域名有 6 ~ 8 个 TCP 俩节请求限制
HPACK 基本原理
HPACk 使用 2 个索引表(静态索引表和动态索引表)来把头部映射到索引值,并对不存在的头部使用 huffman 编码, 并动态缓存到索引,从而达到压缩头部的效果
Huffman(哈夫曼) 编码
原理:先将所有出现的字符建立一张索引表,然后让出现次数多的字符对应的索引尽可能短,传输的时候也是传输这样的索引序列
, 可以达到非常高的压缩率
对称加密
加密和解密用同一个密钥的加密方式叫做对称加密
非对称加密
- 采用 RSA 算法
- 有一对秘钥, 分为公钥和私钥
- 公钥加密的内容,只有私钥才能解开,私钥加密的内容,对应的公钥才能解开
- 公钥可以发送给所有的客户端,私钥只保存在服务器端
HTTPS 是对称加密还是非对称加密
HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段