0%

2019-02-17-http2.0、https(1)

http2.0

HTTP/2,即超文本传输协议 2.0,是下一代 HTTP 协议。是互联网工程任务组的 httpbis 小组开发进行。在开放互联网上 HTTP 2.0 将只用于 https://网址,而 http:// 网址将继续使用 HTTP/1,目的是在开放互联网上增加使用加密技术,以提供强有力的保护去遏制主动攻击。DANE RFC6698 允许域名管理员不通过第三方 CA 自行发行证书

就是 http 的下一代规范

http2.0 和 http1.1 的不同之处

  • http1.1 中,每次请求资源都需要开启一个 tcp/ip 请求,因为 tcp/ip 有并发数炼制,所以当资源一多,就会影响页面加载速度。
  • http2.0,一个 tcp/ip 请求可请求多个资源,提高效率
  • http2.0 采用二进制而非文本格式,将所有的信息分割为更小的消息和帧,提高请求速度,降低延迟。
  • http2.0 使用报头压缩
  • http2.0 可以让服务端对客户端的一个请求,响应多次,主动推送到客户端缓存中
  • 请求优先级,当所有资源都并发请求的时候,可以对特定的资源进行优先传输。

https

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的 HTTP 通道。即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。

如果需要将网站升级为 https,需要后端去申请证书(SSL)等,同时 http 请求的时候所传输的信息更大,建议 htpp2.0+https。

SSL

Secure Sockets Layer,安全套接层,一种安全协议,为 TCP/IP 于各种应用层协议之间,为数据通讯提供安全支持。

TLS

Transport Layer Security,及其前身安全套接层(Secure Sockets Layer,缩写作 SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。该协议由两层组成:TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshak)

SSL/TLS 的 握手流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
1.浏览器请求建立SSL连接,并向服务端发送一个随机数-Client random和客户端支持的加密方法,比如RSA加密,此时是明文传输。
2.服务端从中选出一组加密算法与HAash算法,回复一个随机数-Server random,并将自己的身份信息以证书的形式发回给客户端(证书中包含了网站地址,非对称加密的公钥,以及证书颁发机构等信息)
3.浏览器收到服务器端的证书后
1)验证证书的合法性(颁发机构是否合法,证书中包含的网址是否和正在访问的一样),如果证书信任,则浏览器会显示一个小锁,否则会有提示
2)用户接收证书后(不管信不信任),浏览器会生成一个新的随机数-Premaster Secret,然后证书中的公钥以及制定的加密方法加密「Premaster secret」,发送给服务器端
3)利用Client random、Server random以及Premaster secret通过一定的算法生成HTTP链接数据传输的对称加密key-「seesion key」。
4)使用约定好的Hash算法计算握手消息,并使用生成的「session key」对消息进行加密,最后将之前生成的所有信息发送给服务端。
4.服务端收到浏览器的回复
1)利用已知的加解密方式与自己的私钥进行解密,获取「Premaster secret」
2)和浏览器相同规则生成「seesion key」
3)使用「session key」解密浏览器发送的握手消息,并验证Hash是否和浏览器发送的一致
4)使用「seesion key」加密一段握手消息,发送给浏览器
5.浏览器解密并计算握手消息的Hash,如果与服务器端发来的Hash一样,此时握手流程结束。

SLL/TLS 握手规则示意图

写了五六遍,勉强能写出像样的示意图,请见谅

iamges

http 的缓存

前后端的 http 交互中,使用缓存能很大程度上的提升效率,而且对有性能有要求的前端项目都是必用缓存的

强缓存与弱缓存

缓存可以分为两种类型:

  • 强缓存(200 from cache)
  • 协商缓存 (304)

区别:

  • 强缓存时,浏览器如果判断本地缓存未过期就会直接使用,无需发起 http 请求
  • 协商缓存时,浏览器会向服务端发起 http 请求,然后服务端告诉浏览器「文件为改变」,让浏览器使用本地缓存

对于协商缓存,使用 ctrl + F5 强制刷新可以是协商缓存失效

但是对于强缓存,在未过期是,必须更新资源路径才能发起新的请求

缓存头部

如何区分强缓存和协商缓存

常用强缓存:

  • Cache-Control/Max-age (http1.1)
  • Pragma/Expires (http1.0)

常用协商缓存:

  • If-None-Match/E-tag (http1.1)
  • If-Modified-Since/last-Modified (http1.0)

使用「meta」标签可以控制缓存方案-Pragma

1
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

Pragma 方案,支持情况不佳,缓存代理服务器不支持