http
HTTP(HyperText Transfer Protocol),超文本传输协议,是一个基于TCP实现的应用层协议。
缓存策略
-
强缓存
采用过期时长来控制缓存,对应的字段是max-age
Cache-Control:max-age=3600
-
协商缓存
强缓存失效之后,浏览器在请求头中携带相应的
缓存tag
来向服务器发请求,由服务器根据这个tag,来决定是否使用缓存,这就是协商缓存。缓存tag有两个
-
Last-Modified(最后修改时间)
如果请求头中的这个值小于最后修改时间,说明是时候更新了
-
ETag(文件标识 修改会导致标识变动)
浏览器接收到
ETag
的值,会在下次请求时,将这个值作为If-None-Match这个字段的内容,并放到请求头中,然后发给服务器。如果两者不一样,说明要更新了
如果根据tag标记要更新 则正常http请求流程,否则返回304,告诉浏览器用缓存。
-
-
代理缓存
让
代理服务器
接管一部分的服务端HTTP缓存,客户端缓存过期后就近到代理缓存中获取,代理缓存过期了才请求源服务器,这样流量巨大的时候能明显降低源服务器的压力。具体操作更具Cache-Control字段里相关字段来处理。
缺点
-
明文传输
报文采用明文传输,个人隐私暴露 ----- 可用https解决
-
队头阻塞
http 长连接时 共用一个tcp连接,请求时间过长则导致其它请求阻塞
-
tcp连接耗时
http 1.1
-
长连接 keep-alive
-
缓解队头阻塞
并发TCP连接,对于同一个域名,浏览器允许同时开6-8个TCP连接
https
HTTPS = HTTP + SSL/TLS。
-
多路复用 解决队头阻塞问题
采用2进制分帧的的方式解决,即传输 header+body 不再采用明文的方式传输,而是采用二进制的方式,服务器不再接受完整的http请求报文,而是一堆乱序的二进制帧。
通信双方都可以给对方发送二进制帧,即Stream
更具每个Stream的id再组装数据
-
服务器推送
HTTPS为什么让数据传输更安全?
会对传输内容加密处理,不再是http的明文方式。其加密方式结合非对称加密和对称加密的方式。
简化版加解密过程
- 浏览器会给服务器发送一个随机数
client_random
和一个自己支持加密的方法列表 - 服务器接收后给浏览器返回另一个随机数
server_random
和加密方法。 - 浏览器接收,接着生成另一个随机数pre_random, 并且用公钥加密,传给服务器。
- 服务器用私钥钥解密这个被加密后的
pre_random
- 然后两者用相同的加密方法混合这三个随机数,生成最终的
密钥
- 浏览器和服务器用一样的密钥进行通信,即使用
对称加密
此过程还是有问题的,浏览器不知道发送者的真实身份,其可能是进行DNS劫持,替换了服务地址伪造的公钥私钥。所以
需要一个可靠的中间人。 ----------- 即数字证书认证
CA证书包括:
- 网站域名
- 证书持有者
- 证书有效期
- 证书颁发机构
- 服务器公钥
- 签名时用的hash算法
- 签名
- …
签名:hash算法计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名
证书验证过程
CA机构也是用非对称加密。CA公钥负责验证、CA私钥负责加密
- 客户端 向服务器 S 发出请求时, 返回证书文件
- 客户端 读取证书中的相关的明文信息,采用证书的hash算法计算得到信息摘要
- 利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,
- 如果一致,则可以确认证书的合法性,即公钥合法