### 有没有了解 http2,websocket,https,说一下你的理解以及你了解的特性
1. http2.0 和 http1.1 的区别
- 多路复用
多路复用允许单一的 http2 连接同时发起多重的请求-响应信息
http 性能优化的关键并不在于高带宽,而是低延迟,TCP 连接会随着时间进行自我调谐,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度,这种调谐则称之为 TCP 慢启动,由于这种原因,让原本就具有突发性和短时性的 http 连接变得十分低效
http2 通过让所有数据流共用同一个连接,可以更有效的使用 TCP 连接,让高带宽也能真正服务于 http 的性能提升
小总结:多路复用技术,单连接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大,由于减少 TCP 慢启动时间,提高传输的速度
因为所有的 http2 的请求都在一个 TCP 连接上,所以在 http1 中的自动化合并文件和 Sprite 合图等资源合并减少请求的优化手段对于 http2 来说是没有效果的
- 二进制分帧
http2 在应用层和传输层之间增加一个二进制分帧层,http2 会将所有传输的信息分割成更小的消息和帧,并对他们采用二进制格式的编码,其中 http1 的首部信息会被封装成 Headers 帧,而我们的 request body 则封装到 Data 帧里面
- 首部压缩
http 请求和响应都是由状态行,请求/响应头部,消息主题三部分组成,一般而言,消息主题都会经过 gzip 压缩,或者本身传输的就是压缩后的二进制文件,但状态行和头部却没有经过任何压缩,直接以纯文本传输,浪费流量资源
原理:头部压缩需要在支持 http2 的浏览器和服务端之间,维护一份相同的静态字典,包含常见的头部名称与值的组合,维护一份相同的动态字典,可以动态的添加内容,支持基于静态哈夫曼码表的哈夫曼编码
- http2 支持服务器推送
服务端推送是一种在客户端请求之前发送数据的机制,当代网页使用了许多资源:html,样式表,脚本等,在 http1.x 中这些资源每一个都必须明确的请求,这可能是一个很慢的过程,因为服务器必须等待浏览器做的每一个请求,网络经常是空闲和未充分使用的
为了改善延迟,http2 引入了 server push,它允许服务端推送资源给浏览器,在浏览器明确请求之前,一个服务器经常知道一个页面需要更多的附加资源,在他响应浏览器第一个请求时,可以开始推送这些资源,这允许服务端去完全充分利用一个可能空闲的网络,改善页面加载的时间
有了 http2 的服务端推送,http1 时代的内嵌资源的优化手段也变得没有意义了,使用服务端推送更高效,因为客户端可以缓存起来,甚至可以不同页面之间共享
- 并行双向字节流的请求和响应
在 http2 上,客户端和服务端可以把 http 消息分解成回不依赖的帧,然后乱序发送,最后再在另一端把她们重新组合起来,同一链接上可以有多个不同方向上的数据在传输,客户端可以一边乱序发送 stream,也可以一边接收着服务端的响应,在服务端同理
把 http 消息分解为独立的帧,交错发送,然后在另一端重新组装是 http2 最重要的一项增强,这个机制会在整个 web 技术栈中引发一系列的连锁反应,从而带来巨大的性能提升,因为
1. 可以并行交错的发送请求,请求之间互不影响
2. 可以并行交错的发送响应,响应之间互不干扰
3. 只使用同一个连接即可并行的发送多个请求和响应
4. 消除不必要的延迟,从而减少页面加载的时间
也就是说‘域名分区’的优化手段对于 http2 来说是无用的,因为资源都是并行交错发送,且没有限制,不需要额外的多域名并行下载
- http2 的请求优先级
每个 http2 流里面有个优先值,这个优先值确定着客户端和服务端处理不同的流采取不同的优先级策略,高优先级的流应该优先发送,但又不是绝对的准守,可能又会引入首队阻塞的问题,高优先级的请求慢导致阻塞其他文件的交付,分配处理资源和客户端与服务器间的带宽,不同优先级的混合是必须的
2. https
http 协议传输的数据都是未加密的,也就是明文的,因此使用 http 协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了 SSL 协议用于对 http 协议传输的数据进行加密,从而诞生了 https,现在的 https 使用的都是 TSL 协议
https 在传输数据之前需要客户端和服务端之间进行一次握手,在握手的过程中将确立双方加密传输数据的密码信息,TSL / SSL 协议不仅仅是一套加密传输的协议,TSL/SSL 中使用了非对称加密,对称加密以及 hash 算法
握手过程:
- 浏览器将自己支持的一套加密规则发送给网站
- 网站从中选出一组加密算法和 hash 算法,并将自己的身份信息以证书的形式发回给浏览器,证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息
- 获得网站证书后浏览器要做以下工作
1. 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致)如果证书受信任,则浏览器栏里会显示一个小锁头,否则会给出证书不受信的提示
2. 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密
3. 使用约定好的 hash 计算握手信息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站
- 网站接收浏览器发来的数据之后要做以下工作
1. 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手信息,并验证 hash 是否与浏览器发来的一致
2. 使用密码加密一段握手信息,发送给浏览器
- 浏览器解密并计算握手信息的 hash,如果与服务端发来的 hash 一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密
这里浏览器与网站互相发送加密的握手信息并验证,目的是为了保证双发都获得了一致的密码,并且可以正常的加密解密数据
其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而 hash 算法用于验证数据的完整性
由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其进行加密,非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏
TSL 握手的过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私数据的传输,正是由于 https 非常的安全,攻击者无法从中找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,从而获取明文信息
3. webSocket 概述
http 协议是一种无状态的协议,要实现有状态的会话必须借助一些外部机制如 session 和 cookie,这或多或少或带来一些不便,尤其是服务端和客户端需要实时交换数据的时候
webSocket 允许服务器和客户端进行全双工通信,传统的 http 是单工通信的,它只允许客户端向服务端发出请求,服务端被动返回数据,而不能主动向客户端传递数据
webSocket 的请求头部
```
Connection: Upgrade //通信协议提升
Upgrade: websocket //传输协议升级为 websocket
Sec-WebSocket-Key: ********** //握手协议密钥,base64 位编码的 16 字节的随机字符串
```
webSocket 的响应头部
```
Connection: Upgrade //通信协议提升
Upgrade: websocket //传输协议升级为 websocket
Sec-WebSocket-Accept: ********** //将客户上报的 Sec-WebSocket-Key 和一段 GUID(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)进行拼接,再将这个拼接的字符串做 SHA-1 hash 计算,然后再把得到的结果通过 base64 加密,最后再返回给客户端
```
WebSocket,ajax 轮询和 long poll
参考链接 [http2.0 协议你应该准备的面试题](
https://www.toutiao.com/i6491669443721036302/)
参考链接 [面试时如何优雅的谈论 http](
https://www.jianshu.com/p/52d86558ca57)
参考链接 [http2.0 的奇妙日常](
http://www.alloyteam.com/2015/03/http2-0-di-qi-miao-ri-chang/) 参考链接 [浅谈 WebSocket 协议及其实现](
http://geocld.github.io/2017/10/21/websocket/)