1. 为什么需要HTTPS?
HTTPS 是安全版的 HTTP。
HTTP 协议在传输数据时采用的是明⽂方式传递,因此,⼀些敏感信息的传输就变得很不安全。
而 HTTPS 就是为了解决 HTTP 的不安全⽽产⽣的。
2. HTTPS是如何保证安全的?
HTTPS 在传输数据的过程中会对数据进行加密处理,保证安全性。
那HTTPS采用的什么样的加密方式呢?我们来了解下一些加密的基本概念。
目前常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法。
2.1 什么是对称加密?
简单来说:通信的双⽅都使⽤同⼀个秘钥进⾏加解密。⽐如,两个人事先约定的暗号,就属于对称加密。
对称加密的特点是:
-
优点:
计算量小、加密速度快、加密效率高。
-
缺点:
在数据传送前,发送方和接收方必须商定好秘钥,然后双方保存好秘钥。 如果一方的秘钥被泄露,那么加密信息也就不安全了
使用场景:本地数据加密、https通信、网络传输等
常见算法:AES、DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6
2.1 什么是⾮对称加密?
通信的双方使用不同的秘钥进行加密解密,也就是两把密钥,即秘钥对(私钥 + 公钥)。
特征: 私钥可以解密公钥加密的内容, 公钥可以解密私钥加密的内容,他是对称和非对称的结合
非对称加密的特点是:
- 优点:非对称加密与对称加密相比其安全性更好
- 缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
使用场景:https会话前期、CA数字证书、信息加密、登录认证等
常见算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
2.1 什么是⾮对称加密?
3 HTTPS 加密解决⽅案
结合了两种加密⽅式:
- 将
对称加密的密钥⽤非对称加密的公钥, 进⾏加密并发送出去,接收⽅使⽤私钥解密得到对称加密密钥 - 双⽅沟通时使⽤
对称加密密钥进⾏
可以看到,只有在发送秘钥阶段才使用非对称加密,而后续的通信都使用对称加密,这样解决了性能问题。
HTTPS 目前所使用的 TLS或SSL协议, 就是目前采用的加密通道的规范协议
它利用对称加密、(公私钥)非对称加密, 以及其密钥交换算法,可完成可信任的信息传输
4 数字证书
4.1 数字证书的由来
-
为了安全性, 一般还需要签发数字证书! 客户端 和 服务器端要初步互通消息时, 客户端发送请求可以拿到公开的公钥信息, 进而进行非对称加密, 使用公钥, 加密
对称加密密钥, 传递给服务器, 后续通信都使用对称加密! -
问题是: 初步互通消息时, 如果请求拿到的公钥信息, 就是假的, 或者不安全的! 那么后续的所有操作, 都将是不安全的!
4.2 数字证书的的作用
所以, 就需要有数字证书(CA证书), 一般是CA机构颁发的, 证明这个公钥是安全可靠的!, CA证书中心会对你网站的公钥, 网站的域名地址, 证书到期时间, 等一些相关信息一起加密签发数字证书, 保证你网站的安全性
5 数字签名
-
但这还是有问题:如果证书被篡改了怎么办?,这时就需要用⼀个技术:数字签名。 (根据证书内容, 生成的一个唯一标识)
-
数字签名就是先⽤ CA ⾃带的 Hash 算法来计算出证书内容的⼀个摘要,然后使⽤ CA 私钥进行加密,组成数字签名。
-
当别⼈把他的证书发过来时,接收方⽤同样的算法再次⽣成摘要,⽤ CA 公钥解密后得到CA生成的摘要,两者进行对⽐后,
-
就能确定中间是否被⼈篡改。这样就能最⼤程度的保证通信的安全了。
总结:
-
为什么需要https?,是因为http是明文传输的数据的,不安全,而https是对内存加密的
-
https的加密策略是什么?
- 先用非对称加密,传递对称加密的密钥(保证了密钥传输的安全),后续使用对称加密,进行交流(保证了数据传输数据安全)
3、就算是第一次交流用非对称加密,公钥也是要在网络中传输的,如何证明公钥是可靠的,如何证明网站是可靠的?(CA机构认证,网站需要申请数字证书,请求时,网站就会将数字证书给到浏览器,浏览器默认就会检测证书的可靠性)
4、主要检测证书的
- 是否是权威机构发布的
- 看证书中记录的地址和当前访问的网站地址是否一致,只有一致,才可靠
- 看证书是否过期
4、为了保证证书不被篡改,产生了一个叫数组签名,可以根据证书的所有的内容,生成一个唯一的标识!,(Hash加密算法),一旦内容如果被修改了,再次生成唯一标识时,和之前生成的唯一标识就不一样!,检测是否被修改!。
6 HTTP2和HTTP1.x比,有什么优势和特点?
1 、从体验点来说
https2的升级,对应用户来说,是跨时代的,基于http2(他充分利用带宽)用户访问网页的速度会非常快
2、从技术点来说
- HTTP/2 采⽤
⼆进制格式来传输数据,⽽⾮ HTTP 1.x 的⽂本格式,⼆进制协议解析起来更⾼效 - HTTP/2 采用一些
头部压缩技术,减少在请求和响应头中重复携带的数据,降低网络负担 - HTTP/2 采⽤
服务器推送方式,主动向客户端推送资源,提高页面加载效率 - HTTP/2 采⽤
多路复用机制,减少需要创建的连接数量,降低资源占用和性能消耗
3总结
hppt1.X同一时间,只能并发建立6-8个TCP连接,一个连接同时只能一个请求(虽然可以keep-alive复用,但也得一个个来)同时建立的连接的成本比较高,不让一次性建立太多连接,而新版本http2.X建立一次连接,就可以并发多个请求,所以http2的升级,大大提高了页面加载的效率。
7. http缓存控制
Web 服务缓存 大致可以分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN 服务器缓存)、浏览器缓存。
浏览器缓存 也包含很多内容: HTTP 缓存、indexDB、cookie、localstorage 等等。这里我们只讨论 HTTP 缓存相关内容。
HTTP缓存:
- 强缓存
- 协商缓存
7.2 强缓存 (可以想象成食品过期时间判断)
(进行判断, 是否资源过期, 如果未过期, 直接用缓存)
强缓存,命中强缓存时,浏览器并不会将请求发送给服务器。 强缓存是利用http的返回的响应头中的Expires或者Cache-Control (优先级更高) 两个字段来控制的,用来表示资源的缓存时间。
- Expires: 指定一个具体时间(2020年12月12日 17:00), 到了这个时间了, 缓存过期了, 在时间内, 都是有效的, 可以直接读,但是这种方式有一个明显的缺点,由于失效时间是一个
绝对时间,所以当 **服务器与 - Cache-Control : 指定一个过期时间 (3600s),他是一个相对时间,并且都是与客户端时间比较,所以服务器与客户端时间偏差也不会导致问题, 这个资源你加载到后, 可以用 3600s 总结:如果命中强缓存,在有效期内,使用了本地浏览器的缓存,请求该资源是不会向服务器发送请求的。
7.3协商缓存(可以想象成找供货商专家协商)
1、协商缓存的概念
看看过期时间, 食品没过期, 直接吃 (直接读缓存, 不发请求) 强缓存
食品过期时间过了, 能不能吃呢? 问问专家(服务器), 专家瞅了一眼, 没过期 (响应304, 不返回内容) , 直接吃 (协商缓存)
如果问过专家(服务器), 专家瞅了一眼, 呀真过期了, 原来的不要了, 我重新给你发一个 (响应200, 并返回内容)
2、 协商缓存的实现技术 Last-Modify/If-Modify-Since或Etag/If-None-Match`
若未命中强缓存(强缓存过期了),则浏览器会将请求发送至服务器。
服务器根据http头信息中的Last-Modify/If-Modify-Since或Etag/If-None-Match来判断是否命中协商缓存。如果命中,则http返回码为304 (你本地之前加载的资源是有效的),浏览器从缓存中加载资源`。
3总结:
-
强缓存:检查过期事件,判断缓存是否失效,如果不失效,直接用,不发请求 大大的减少了服务器的请求次数,在过期时间内,直接从客户端内存中读取、
-
协商缓存:强缓存命中失效了,超过过期时间了,拿着标识(最后的修改时间,唯一标识etag),问服务器,是否真的过期了,如果验证通过,服务器会直接响应304,且不会返回资源
-
场景:1、不会经常变换的资源,如图片,就非常适合应用强缓存(过期时间也可以设置的很长) 2、如果是一些很可能会变的资源,同时也希望能缓存,过期时间设置短一些,一旦过期,就可以用协商缓存,强缓存和协商缓存两个在实际工作中都是互相配合的来使用,并不是单独的使用哪一个。
8.TCP协议
1 、概念
TCP协议(Transmission Control Protocol传输控制协议)是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议,TCP使用校验,确认和重传机制来保证可靠传输,而前面说到的HTTP协议就是建立在TCP/IP协议之上的一种应用。
9 什么是DNS 解析
- DNS解析, 将域名 转化为 ip地址
10. 一次完整的HTTP服务过程是什么(以访问百度网页为例)
-
输入www.baidu.com, 回车后, 需要先进行DNS解析, 得到IP地址 可以在cmd中ping www.baidu.com 112.80.248.75
-
根据IP地址, 找到服务器, 开始建立TCP连接, 三次握手
-
浏览器端发送 http请求, 服务器端进行响应 index.html
-
浏览器解析 index.html, 加载 index.html 中需要加载的其他一些资源(图片, css, js) ...
-
浏览器完成页面的解析渲染
-
http服务完成, 释放关闭TCP连接, 四次挥手
11 什么是三次握手?
- 建立连接 => 三次握手 (双方确认)
- (1) 服务器啊, 我是浏览器, 我要和你建立连接(第一次握手发送请求)
- (2) 服务器看到了, 好的, 那么建立连接吧, 我准备好了, 你确定吗?(第二次握手确定请求)
- (3) 浏览器: 是的, 我确定!(第三次握手双方达成共识)
- 连接就建立成功
- 三次握手 = 连接的发起 + 双方的确认
把三次握手想象成这样一个场景
男生(客户端)要追一个女生(服务器),这时候男生(客户端)就给女生(服务器)发了一条“我爱你”的表白消息,但这个时候呢女生(服务器,可能因为是网络延迟等各种的原因)去做饭去了,可能很晚才看到消息,然后就回了男生(客户端)一句我愿意,你确定爱我吗,但是呢这时候男生(客户端)以为一直没有回复他,早就走了,而这个时候女生(服务器)一直在等待男生(客户端)的确定,**这时候会造成一个很大的问题,服务器一直在等待客户端的确定(造成服务器的空间浪费以及端口消耗),但客户端一直没有反应,这就造成了服务器的资源上很大的浪费。**
总结:为什么要3次握手
所以三次握手第一次发送请求,第二次双方确定连接,第三次建立连接关系,但凡中间一次没有满足,建立关系取消,防止服务器开启后因各种原因导致的资源浪费。
12 .什么是四次挥手
以员工跟老板申请下班为场景来帮助理解
(a:客户端 b:服务端) 1、一开始a工作完了想要下班离开,但是呢?怕B还有事情要交代,那么呢?只好向B打招呼,我要走了(第一次挥手),请求停止交谈(此时,a到B的连接没有断开,依旧可以进行通信); 2、同意A的请求,说好的,但是我这里可能还有一些话(数据)没说完。我检查看看, 你等等, 等我说完你再走(第二次挥手)。 3、B确实没啥要补充的了,就告知你可以走了(第四次挥手) 4、A说好的,知道了,拜拜(第四次挥手);(B得知A走开了,关闭了自己的连接 )
总结:为什么要4次挥手
- 第一次挥手:客户端提出断开请求,
- 第二次挥手:服务器同意请求断开的连接,让客户端等一等,等我检查一下数据是否传输完毕,
- 第三挥手:服务器检查完数据已经传递完,服务器确定可以断开了,服务器确定可以断开了,
- 第四次挥手,客户端等待一会后,跟服务器断开了连接 防止在客户端和服务器之间通信或者数据传输时,断开连接的时候有数据没有传递完。