HTTP协议缺省工作在TCP协议80端口,所有传输的内容都是明文。
HTTPS简单来说,是HTTP的安全版本,运行在SSL/TLS之上,SSL/TLS运行在TCP的443端口之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份。
HTTP2 在HTTP协议的语义、方法、状态码等核心概念不变的情况下,实现了性能优化
HTTPS
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
使用非对称加密算法保证对称加密密钥的安全传递,然后使用对称加密来保证数据传输过程中的安全性
它的传输过程:
* TCP 三次握手
* client将自己支持的一套加密规则发送给server
* server从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给client。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息(采用HTTPS服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己制作的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面)
* 传送证书(其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等)
* 客户端验证及解析服务器数字证书(验证公钥是否有效,比如颁发机构,过期时间等等),产生一个用于后面通讯的“对称密码”,并用证书中提供的公钥加密
* 发送加密后的对称秘钥
* server用私钥解密后,得到了客户端传过来的随机值,使用随机值对消息进行对称加密,发送给client
* client解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
HTTP现状
* HTTP1.1过于庞大,包含了太多细节和可选的部分
* 未能充分利用TCP
* 线头阻塞(Head of line blocking),导致带宽无法被充分利用,以及后续健康请求被阻塞
* 延迟
HTTP2
HTTP2的新特性
- 新的二进制格式
http1.x诞生的时候是明文协议,解析是基于文本,基于文本协议的格式解析存在天然缺陷,因为文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑http2.0的协议解析决定采用二进制格式,实现方便且健壮。
HTTP/2将所有传输的信息分割为更小的消息和帧- 帧(frame):HTTP/2通信的最小单位,每个帧包含帧首部,至少也会标识出当前帧所属的流。
- 消息(message):由一个或多个帧组合而成,例如请求和响应。
- 连接(connection):与 HTTP/1 相同,都是指对应的 TCP 连接;
- 流(stream):已建立的连接上的双向字节流。

http2.0的格式定义更接近tcp层的方式。length定义了整个frame的开始到结束,type定义frame的类型(一共10种),flags用bit位定义一些重要的参数,stream id用作流控制,剩下的payload就是request的正文了。http2.0并没有改变http1.x的语义,只是把原来http1.x的header和body部分用frame重新封装了一层而已.
在HTTP/2中,数据流以消息的形式发送,而消息由一个或多个帧组成,帧可以在数据流上乱序发送,然后再根据每个帧首部的流标识符重新组装
- 多路复用
HTTP1.x中,如果想并发多个请求,必须使用多个TCP链接,且浏览器为了控制资源,还会对单个域名有6-8的个数限制
HTTP2中,同域名下所有通信都在单个连接上完成。单个连接可以承载任意数量的双向数据流。
一个request对应一个stream并分配一个id,这样一个连接上可以有多个stream,每个stream的frame可以随机的混杂在一起,接收方可以根据stream id将frame再归属到各自不同的request里面。
即单个连接上可以并行交错的请求和响应,之间互不干扰。 - 流优先级
在HTTP/2中,每个请求都可以带一个31bit的优先值,0表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。 - 服务器推送
服务器推送的资源有自己独立的URL,可以被浏览器缓存,可以达到多页面共享。
资源推送遵守同源策略,服务器不可随便推送第三方资源给客户端。
客户端可以拒绝推送过来的资源。 - 头部压缩
http1.x的header由于cookie和user agent很容易膨胀,而且每次都要重复发送。http2.0使用encoder来减少需要传输的header大小,通讯双方各自渐进地更新一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。高效的压缩算法可以很大的压缩header,减少发送包的数量从而降低延迟。 - APLN
HTTP2.0使用了tls的拓展ALPN来做协议升级,除此之外加密这块还有一个改动,HTTP2.0对tls的安全性做了近一步加强,通过黑名单机制禁用了几百种不再安全的加密算法
HTTP2 与 web性能优化
- 资源加载
- 现有解决方案:资源内联、强缓存、localstorage、将重要资源内联在页面头部
- HTTP2中的Server Push,
- TCP 连接
- 连接数优化(并发连接 + Keep-Alive、静态资源做域名散列、异步接口合并、图片合并,雪碧图、CSS、JS 合并/内联、图片内联…)
- HTTP/2 的多路复用和头部压缩
参考:
https://www.gitbook.com/book/ye11ow/http2-explained
https://imququ.com/post/http2-resource.html
http://mrpeak.cn/blog/http2/