HTTP协议

  • 明文传输 -> 导致 内容会被篡改(中间人攻击)-> 解决方案:加密

加密方式

  • 对称加密:加密和解密使用的同一个密钥
  • 非对称加密: 公钥和私钥有个特别的单向性,虽然都可以用来加密解密,但公钥加密后只能用私钥解密,反过来,私钥加密后也只能用公钥解密。

结合这2种加密方式就能完成密钥互换 -> 破解方式: 中间人模拟服务器行为 -> HTTPS

简单流程如下:首先服务端将公钥公布出去,那么客户端也就知道公钥了。接下来客户端创建一个秘钥,然后通过公钥加密并发送给服务端,服务端接收到密文以后通过私钥解密出正确的秘钥,这时候两端就都知道秘钥是什么了。

HTTPS协议

中间人模拟服务器行为主要原因是 中间人不被信任,那么HTTPS有CA 认证体系

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 协议?

参考资料