forked from NotFound9/interviewGuide
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathHTTP.md
72 lines (43 loc) · 5 KB
/
HTTP.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
(PS:扫描[首页里面的二维码](README.md)进群,分享我自己在看的技术资料给大家,希望和大家一起学习进步!)
#### [1.HTTPS建立连接的过程是怎么样的?](#HTTPS建立连接的过程是怎么样的?)
#### [2.HTTP的缓存策略是怎么样的?](#HTTP的缓存策略是怎么样的?)
### HTTPS建立连接的过程是怎么样的?
在发起连接之前,服务器会将自己的公钥发给CA证书机构,CA证书机构会用自己的私钥对服务器的公钥加密,生成CA证书给服务器,服务器存储后供之后建立安全连接使用。
1.客户端发起请求,TCP三次握手,跟服务器建立连接。
2.发送请求将随机数(时间戳+随机数),sessionID,支持的加密方式发送给服务器
3.服务器接受请求,将随机数,sessionID,挑选的加密方式,CA证书发给客户端,CA证书会包括发布机构,过期时间,公共密钥
4.客户端收到CA证书后,会将证书跟客户端内置的CA证书进行校验,CA证书中会有一个证书机构用自己的私钥对公钥,域名,有效期生成的hash值加密结果,也就是签名,客户端中内置的证书用公钥签名进行解密,看解密后得到的结果跟公钥,域名,有效期的hash值是否一样,这个如果是真实的,然后会看过期时间,域名是否匹配
5.客户端会随机生成一个对称加密的公钥,根据根据CA证书里面的公钥将它加密后发给服务器
6.服务器用自己的私钥解密,得到对称加密的公钥
7.之后就根据对称加密的公钥进行通信
假设没有CA,那么如果服务器返回的包含公钥的包被hack截取,然后hack也生成一对公私钥,他将自己的公钥发给客户端。hack得到客户端数据后,解密,然后再通过服务器的公钥加密发给服务器,这样数据就被hack获取。
有了CA后,客户端根据内置的CA根证书,很容易识别出hack的公钥不合法,或者说hack的证书不合法。
### HTTP的缓存策略是怎么样的?
HTTP 缓存主要分为强缓存和对比缓存两种,从优先级上看,强缓存大于对比缓存。
#### 强缓存

强缓缓存就是浏览器缓存数据库里有缓存数据就不再去向服务器发请求了
可以造成强制缓存的字段有Expires和Cache-Control两个:
Expires:该字段标识缓存到期时间,是一个绝对时间,也就是服务器时间+缓存有效时间。
缺点:如果客户端修改了本地时间,会造成缓存失效。如果本地时间与服务器时间不一致,也会导致缓存失效。
Cache-Control:该字段表示缓存最大有效时间,该时间是一个相对时间。
使用相对时间的话,即使本地时间与服务器时间不一致,也不会导致缓存失效。
下面列举一下Cache-Control的字段可以带的值:
> - max-age:即最大有效时间
> - no-cache:表示没有缓存,即告诉浏览器该资源并没有设置缓存
> - s-maxage:同max-age,但是仅用于共享缓存,如CDN缓存
> - public:多用户共享缓存,默认设置
> - private:不能够多用户共享,HTTP认证之后,字段会自动转换成private。
#### 对比缓存

对比缓存的实现原理时,先给给服务器发请求,并且带上缓存的资源文件的缓存标识,让服务端进行对比,如果资源文件没有更改,就只返回header部分,body为空,状态码是304,浏览器使用缓存的资源文件。如果数据有更改,就返回更新后的资源文件。
可以实现对比缓存的机制有Last-Modified/If-Modified-Since和Etag/If-None-Match两种:
##### Last-Modified/If-Modified-Since
就是 请求的response header中会返回Last-Modified字段,代表资源文件最近的修改时间,发请求时 request header中会带上If-Modified-Since字段,代表上次获取的资源文件的最近修改时间,服务器判断资源文件是否有更新,来决定返回最新的资源文件(返回200),还是让浏览器使用缓存(返回304)。
缺点:
1. Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间。
2. 如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存。
##### Etag/If-None-Match
就是 response header中会返回Etag,代表资源文件的版本号,发请求时 request header中会加上If-None-Match字段,值是上次请求的资源的文件的版本号,代表上次请求的资源文件的版本号,服务器判断资源文件是否有更新,来决定返回最新的资源文件(返回200),还是让浏览器使用缓存(返回304)。
##### 优先级
优先级方面排序是 强缓存(Cache-Control)> 强缓存(Expires)> 对比缓存(Etag/If-None-Match)> 对比缓存(Last-Modified/If-Modified-Since)