HTTP协议
- 明文传输 -> 导致 内容会被篡改(中间人攻击)-> 解决方案:加密
加密方式
- 对称加密:加密和解密使用的同一个密钥
- 非对称加密: 公钥和私钥有个特别的单向性,虽然都可以用来加密解密,但公钥加密后只能用私钥解密,反过来,私钥加密后也只能用公钥解密。
结合这2种加密方式就能完成密钥互换 -> 破解方式: 中间人模拟服务器行为 -> HTTPS
简单流程如下:首先服务端将公钥公布出去,那么客户端也就知道公钥了。接下来客户端创建一个秘钥,然后通过公钥加密并发送给服务端,服务端接收到密文以后通过私钥解密出正确的秘钥,这时候两端就都知道秘钥是什么了。
HTTPS协议
中间人模拟服务器行为主要原因是 中间人不被信任,那么HTTPS有CA 认证体系,
CA 签发证书的过程,如上图左边部分:
- ⾸先 CA 会把持有者的公钥、⽤途、颁发者、有效时间等信息打成⼀个包,然后对这些信息进⾏ Hash 计算,得到⼀个 Hash 值;
- 然后 CA 会使⽤⾃⼰的私钥将该 Hash 值加密,⽣成 Certificate Signature,也就是 CA 对证书做了签名;
- 最后将 Certificate Signature 添加在⽂件证书上,形成数字证书;
客户端校验服务端的数字证书的过程,如上图右边部分:
- ⾸先客户端会使⽤同样的 Hash 算法获取该证书的 Hash 值 H1;
- 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使⽤ CA 的公钥解密 Certificate
- Signature 内容,得到⼀个 Hash 值 H2 ;
- 最后⽐较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。
HTTPS抓包:
抓包出来都是加密的数据,抓包工具模拟中间人,伪造证书,客户端会提示证书不被信任,如果客户端同意,请求就会被抓包工具拦截,转发给服务端。
HTTP2
HTTP/1.1 协议的性能缺陷:
- 高延迟:页面访问速度下降 -> 主要由于队头阻塞
HTTP/1.1 版引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求,进一步改进了 HTTP 协议的效率
但这要求服务端必须按照请求发送的顺序返回响应,当顺序请求多个文件时,其中一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,这就是队头阻塞 (Head-Of-Line Blocking)
- 明文传输:不安全
- 无状态:头部巨大切重复
- 不支持服务器推送
HTTP/2 新特性
- 二进制传输
多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装
- Header 压缩(HPACK)
客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
- 多路复用
- 服务端 Push
- 提高安全性
HTTP2解决了HTTP1.X的队头阻塞,但是TCP的的队头阻塞仍然存在。如果出现TCP丢包,可能还更严重。
HTTP3
参考说一下 HTTP/3 新特性,为什么选择使用 UDP 协议?