一、http1和http2的区别
1.1 http1.x
有线程阻塞的缺陷,在同一时间,同一域名的请求有一定数量限制,当超过限制数目的请求时,会被阻塞。
- http1.0(短连接)
缺陷:浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接(tcp连接的新建成本很高,因为需要客户端与服务器的三次握手),服务器完成请求处理后立即断开TCP连接,服务器也不跟踪每个客户和记录过去的请求。
解决方法:添加头信息 —— 非标准的Connection字段Connection:keep-alive
- http1.1(持久连接)
- 引入了持久连接:即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection:keep-alive(对于同一个域名,大多数浏览器允许同时建立6个持久连接);
- 管道机制: 在同一个TCP连接里面,客户端可以同时发送多个请求;
- 分块传输编码: 服务端没产生一块数据,就发送一块,采用“流模式”来取代了“缓存模式”;
- 新增请求方式:
PUT:请求服务器存储一个资源;
DELETE:请求服务器删除标识的资源;
OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求;
TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断;
CONNECT:保留将来使用。缺点: 虽然允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个请求,才会接着处理下一个请求;如果前面处理的的特别慢,后面就会有许多请求排队等着;会造成“队头堵塞”的情况。
解决方式:一是减少请求,二是同时多开持久连接。
1.2 http2.0
- 采用二进制格式而非文本格式;
- 完全多路复用,而非有序并阻塞的,只需一个TCP连接即可实现并行,解决了线头阻塞的问题,这也是与http1最重要的区别;
- 使用报头压缩,降低开销;
- 服务推送。
- 二进制协议
HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为”帧”:头信息帧和数据帧。
二进制协议解析起来更高效、“线上”更紧凑,更重要的是错误更少。
- 完全多路复用
HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了”队头堵塞”。
- 报头压缩
HTTP 协议是没有状态,导致每次请求都必须附上所有信息。所以,请求的很多头字段都是重复的,比如Cookie,一样的内容每次请求都必须附带,这会浪费很多带宽,也影响速度。
对于相同的头部,不必再通过请求发送,只需发送一次;
HTTP/2 对这一点做了优化,引入了头信息压缩机制;
一方面,头信息使用gzip或compress压缩后再发送;
另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,产生一个索引号,之后就不发送同样字段了,只需发送索引号。
- 服务器推送
HTTP协议通常承载于TCP协议之上,在HTTP和TCP之间添加一个安全协议层(SSL或TSL),这个时候,就成了我们常说的HTTPS.
二、https和http有什么区别
http是一种客户端和服务端无状态、明文传输的超文本传输协议,也因此使浏览器更加高效,是网络传输减少。
https是以安全为目标的HTTP通道,在HTTP下加入SSL层,使传输内容加密,身份验证,保证数据完整性。
主要区别:
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用;
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议;
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443;
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
三、https的实现原理
HTTPS实现过程简述:
客户端发起 HTTPS 请求,服务端返回证书,客户端对证书进行验证,验证通过后本地生成用于改造对称加密算法的随机数,通过证书中的公钥对随机数进行加密传输到服务端,服务端接收后通过私钥解密得到随机数,之后的数据交互通过对称加密算法进行加解密。
https实现原理:
- 浏览器把自己支持的加密规则(加密算法和哈希算法)发送给端口为443的服务器;
- 服务器从浏览器发送过来的加密规则中选用,将数字证书(证书包括有网站地址、加密公钥、证书有效期及颁发机构等信息)返回给浏览器;
- 浏览器验证数字证书的合法性:
- 浏览器验证证书的合法性,如果合法的话,取出公钥并用公钥解密得到证书的签名和内容;
- 再验证证书签名的合法性;
- 验证记录的网址是否与当前网址一致,这些都通过时,浏览器才可以安全地使用证书中的网站公钥。
- 浏览器接着生成一串随机数密码(R),然后用公钥进行加密
<这块走得是非对称加密>
;用约定好的hash算法生成握手消息的hash值,然后用密码对消息进行加密发送给服务器<这块走得是对称加密>
;
- 服务器用本地的私钥取出R,并以R为密钥对网页内容进行加密,再传输给浏览器;
- 浏览器以R为密钥,使用之前约定好的解密算法来获取网页内容。