1. http 和 https 的基本概念 ⭐⭐⭐⭐⭐
- http:是一个客户端和服务器端请求和应答的标准(TCP),用于从 WWW 服务器 传输 超文本 到 本地浏览器的 超文本传输协议。
- https:是以安全为目标的 HTTP 通道,即 HTTP 下 加入 SSL 层进行加密。
其作用是:建立一个信息安全通道,来确保数据的传输,确保网站的真实性。
2. http 和 https 的区别及优缺点?⭐⭐⭐⭐⭐
| 区别 | http | https |
|---|---|---|
| 默认端口 | 80端口 | 443端口 |
| 传输方式 | 超文本传输协议 明文传输 | 具有安全性的 ssl 加密传输(会保证数据的完整性) |
| 安全性 | 不安全(无状态无连接) | 安全(可以保证对方身份的真实性和) |
- http 的连接很简单,是无状态的。https 握手阶段比较
费时,会使页面加载时间延长 50%,增加 10%~20%的耗电。 - https
缓存不如 http 高效,会增加数据开销。 - https 协议需要 ca 证书,费用较高,功能越强大的
证书费用越高。 - SSL 证书需要绑定
IP,不能再同一个 IP 上绑定多个域名,IPV4 资源支持不了这种消耗。
3. http的状态码⭐⭐⭐⭐⭐
| 标题 | 状态码 | |
|---|---|---|
| 2开头的表示成功 | 200 | |
| 3开头的表示重定向 | 301 | 永久重定向 |
| 302 | 临时重定向 | |
| 304 | 表示可以在缓存中取数据(协商缓存) | |
| 4开头表示客户端错误 | 403 | 跨域(服务器理解客户的请求,但拒绝处理它) |
| 404 | 请求资源不存在 | |
| 412 | 表示“未满足前提条件”。如果服务器没有满足请求者在请求中设置的其中一个前提条件时就会返回此错误代码。 | |
| 5开头表示服务端错误 | 500 |
3. https 协议的工作原理⭐⭐⭐
客户端在使用 HTTPS 方式与 Web 服务器通信时有以下几个步骤:
简单版
- 客户端发出请求(ClientHello):客户端使用 https url 访问服务器,则要求 web 服务器
建立 ssl 链接。 - 服务器回应(SeverHello):web 服务器接收到客户端的请求之后,会
将网站的证书(证书中包含了公钥),传输给客户端。 - 客户端和 web 服务器端开始
协商 SSL 链接的安全等级,也就是加密等级。 - 客户端浏览器通过双方协商一致的安全等级,
建立会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站。 - web 服务器
通过 自己的私钥 解密出会话密钥。 - web 服务器
通过 会话密钥 加密与客户端之间的通信。
- https实现原理⭐⭐⭐
- 客户端发出请求(ClientHello)
- 首先客户端向服务端发送一个
随机值和一个客户端支持的加密算法,并连接到443端口。
- 首先客户端向服务端发送一个
- 服务器回应(SeverHello)
- 服务端收到以后,会返回另外一个随机值和一个协商好的加密算法,这个算法是刚才发送的那个算法的子集
- 随后服务端会再次发送一个 CA 证书,这个 CA 证书实际上就是一个公钥,包含了一些信息(比如颁发机构和有效时间等)
- 客户端回应
- 客户端收到以后会验证这个 CA 证书,比如验证是否过期,是否有效等等,如果验证未通过,会弹窗报错。
- 如果验证成功,会生成一个随机值作为预主密钥,客户端使用刚才两个随机值和这个预主密钥组装成会话密钥;再使用刚才服务端发来的公钥进行加密发送给服务端;这个过程是一个非对称加密(公钥加密,私钥解密) 会话秘钥=客户端随机值+服务端随机值+预主秘钥
- 服务器的最后回应
- 服务端收到以后使用私钥解密,随后得到那两个随机值和预主密钥,随后再组装成会话密钥。
- 客户端在向服务端发起一条信息,这条信息使用会话秘钥加密,用来验证服务端时候能收到加密的信息
- 服务端收到以后使用刚才的会话密钥解密,在返回一个会话密钥加密的信息,双方收到以后 SSL 建立完成;这个过程是对称加密(加密和解密是同一个) ( 图片)
- 客户端发出请求(ClientHello)
4. http1.0和http1.1,还有http2有什么区别?⭐⭐⭐⭐
- Http0.9 只支持 get请求
- http1.0请求方式变多了,增加了 POST、PUT,DELETE ,HEAD,OPTION,等
请求方式 作用 HEAD请求 和get请求差不多,但是没有body,用来检查资源是否有效,不需要消耗更多的带宽去请求这个url OPTION请求 预检请求,判断是否支持跨域(CORS) PUT请求 一般是用来更改资源 POST请求 一般是用来增加资源 - http1.1增加了长连接
keep-alive、增加了 host 域、更节约带宽了、还有缓存中的max-age(之前是 expire)- 长连接
keep-alive
Keep-Alive解决的核心问题是: 一定时间内(时间可以配置,不管用的是Apache还是nginx),同一域名多次请求数据,只建立一次 HTTP 请求,其他请求可复用每一次建立的连接通道,以达到提高请求效率的问题。 - 强缓存在 http1.0用的是Expire, 在1.1中用的是Max-age,为什么换了呢,因为 Expire 记录的是一个时间点,有可能服务端和客户端的时间不一致,后来直接改成了一个时长就完美解决问题了
- 长连接
- http2.0增加了服务器推送、多路复用、头部压缩、以及更接近二进制了
- http3.0增加了 QUIC 协议,是基于 udp 来完成建立连接的