1、前言
只有光头才能变强html
HTTP博文回顾:java
本文力求简单讲清每一个知识点,但愿你们看完能有所收获git
2、HTTP协议的此生来世
最近在看博客的时候,发现有的面试题已经考HTTP/2了,因而我就顺着去了解一下。web
到如今为止,HTTP协议已经有三个版本了:面试
下面就简单聊聊他们三者的区别,以及整理一些必要的额外知识点。算法
2.1HTTP版本之间的区别
2.1.1HTTP1.0和HTTP1.1区别
HTTP1.0和HTTP1.1最主要的区别就是:segmentfault
在HTTP1.0默认是短链接:浏览器
简单来讲就是:每次与服务器交互,都须要新开一个链接!缓存
试想一下:请求一张图片,新开一个链接,请求一个CSS文件,新开一个链接,请求一个JS文件,新开一个链接。HTTP协议是基于TCP的,TCP每次都要通过三次握手,四次挥手,慢启动...这都须要去消耗咱们很是多的资源的!安全
在HTTP1.1中默认就使用持久化链接来解决:创建一次链接,屡次请求均由这个链接完成!(若是阻塞了,仍是会开新的TCP链接的)
相对于持久化链接还有另外比较重要的改动:
- HTTP 1.1增长host字段
- HTTP 1.1中引入了
Chunked transfer-coding
,范围请求,实现断点续传(实际上就是利用HTTP消息头使用分块传输编码,将实体主体分块传输)
- HTTP 1.1管线化(pipelining)理论,客户端能够同时发出多个HTTP请求,而不用一个个等待响应以后再请求
- 注意:这个pipelining仅仅是限于理论场景下,大部分桌面浏览器仍然会选择默认关闭HTTP pipelining!
- 因此如今使用HTTP1.1协议的应用,都是有可能会开多个TCP链接的!
参考资料:
2.1.2HTTP2基础
在说HTTP2以前,不如先直观比较一下HTTP2和HTTP1.1的区别:
上面也已经说了,HTTP 1.1提出了管线化(pipelining)理论,可是仅仅是限于理论的阶段上,这个功能默认仍是关闭了的。
管线化(pipelining)和非管线化的区别:
HTTP Pipelining实际上是把多个HTTP请求放到一个TCP链接中一一发送,而在发送过程当中不须要等待服务器对前一个请求的响应;只不过,客户端仍是要按照发送请求的顺序来接收响应!
就像在超市收银台或者银行柜台排队时同样,你并不知道前面的顾客是干脆利索的仍是会跟收银员/柜员磨蹭到世界末日(无论怎么说,服务器(即收银员/柜员)是要按照顺序处理请求的,若是前一个请求很是耗时(顾客磨蹭),那么后续请求都会受到影响。
- 在HTTP1.0中,发送一次请求时,须要等待服务端响应了才能够继续发送请求。
- 在HTTP1.1中,发送一次请求时,不须要等待服务端响应了就能够发送请求了,可是回送数据给客户端的时候,客户端仍是须要按照响应的顺序来一一接收
- 因此说,不管是HTTP1.0仍是HTTP1.1提出了Pipelining理论,仍是会出现阻塞的状况。从专业的名词上说这种状况,叫作线头阻塞(Head of line blocking)简称:HOLB
2.1.3HTTP1.1和HTTP2区别
HTTP2与HTTP1.1最重要的区别就是解决了线头阻塞的问题!其中最重要的改动是:多路复用 (Multiplexing)
- 多路复用意味着线头阻塞将不在是一个问题,容许同时经过单一的 HTTP/2 链接发起多重的请求-响应消息,合并多个请求为一个的优化将再也不适用。
- (咱们知道:HTTP1.1中的Pipelining是没有付诸于实际的),以前为了减小HTTP请求,有不少操做将多个请求合并,好比:Spriting(多个图片合成一个图片),内联Inlining(将图片的原始数据嵌入在CSS文件里面的URL里),拼接Concatenation(一个请求就将其下载完多个JS文件),分片Sharding(将请求分配到各个主机上)......
使用了HTTP2多是这样子的:
HTTP2全部性能加强的核心在于新的二进制分帧层(再也不以文本格式来传输了),它定义了如何封装http消息并在客户端与服务器之间传输。
看上去协议的格式和HTTP1.x彻底不一样了,实际上HTTP2并无改变HTTP1.x的语义,只是把原来HTTP1.x的header和body部分用frame从新封装了一层而已
HTTP2链接上传输的每一个帧都关联到一个“流”。流是一个独立的,双向的帧序列能够经过一个HTTP2的链接在服务端与客户端之间不断的交换数据。
实际上运输时:
HTTP2还有一些比较重要的改动:
- 使用HPACK对HTTP/2头部压缩
- 服务器推送
- 流量控制
- 针对传输中的流进行控制(TCP默认的粒度是针对链接)
- 流优先级(Stream Priority)它被用来告诉对端哪一个流更重要。
2.2HTTP2总结
HTTP1.1新改动:
- 持久链接
- 请求管道化
- 增长缓存处理(新的字段如cache-control)
- 增长Host字段、支持断点传输等
HTTP2新改动:
参考资料:
2.3HTTPS再次回顾
以前在面试的时候被问到了HTTPS,SSL这样的知识点,也没答上来,这里也简单整理一下。
首先仍是来解释一下基础的东东:
- 对称加密:
- 非对称加密:
- 加密用公开的密钥,解密用私钥
- (私钥只有本身知道,公开的密钥你们都知道)
- 数字签名:
- 验证传输的内容是对方发送的数据
- 发送的数据没有被篡改过
- 数字证书(Certificate Authority)简称CA
3y的通信之路:
- 远古时代:3y和女友聊天传输数据之间没有任何的加密,直接传输
- 上古时期:使用对称加密的方式来保证传输的数据只有两我的知道
- 此时有个问题:密钥不能经过网络传输(由于没有加密以前,都是不安全的),因此3y和女友先约见面一次,告诉对方密码是多少,再对话聊天。
- 中古时期:3y不仅仅要跟女友聊天,还要跟爸妈聊天的哇(一样不想泄漏了本身的通信信息)。那有那么多人,难道每一次都要约来见面一次吗?(说明维护多个对称密钥是麻烦的!)--->因此用到了非对称加密
- 3y本身保留一份密码,独一无二的(私钥)。告诉3y女友,爸妈一份密码(这份密码是公开的,谁均可以拿--->公钥)。让他们给我发消息以前,先用那份我告诉他们的密码加密一下,再发送给我。我收到信息以后,用本身独一无二的私钥解密就能够了!
- 近代:此时又出现一个问题:虽然别人不知道私钥是什么,拿不到你原始传输的数据,可是能够拿到加密后的数据,他们能够改掉某部分的数据再发送给服务器,这样服务器拿到的数据就不是完整的了。
- 3y女友给3y发了一条信息”3y我喜欢你“,而后用3y给的公钥加密,发给3y了。此时不怀好意的人截取到这条加密的信息,他破解不了原信息。可是他能够修改加密后的数据再传给3y。可能3y拿到收到的数据就是”3y你今晚跪键盘吧“
- 现代:拿到的数据可能被篡改了,咱们可使用数字签名来解决被篡改的问题。数字签名其实也能够看作是非对称加密的手段一种,具体是这样的:获得原信息hash值,用私钥对hash值加密,另外一端用公钥解密,最后比对hash值是否变了。若是变了就说明被篡改了。(一端用私钥加密,另外一端用公钥解密,也确保了来源)
- 目前如今:好像使用了数字签名就万无一失了,其实还有问题。咱们使用非对称加密的时候,是使用公钥进行加密的。若是公钥被伪造了,后面的数字签名其实就毫无心义了。讲到底:仍是可能会被中间人攻击~此时咱们就有了CA认证机构来确认公钥的真实性!
对于数字签名和CA认证仍是不太了解参考一下
回到咱们的HTTPS,HTTPS其实就是在HTTP协议下多加了一层SSL协议(ps:如今都用TLS协议了)
HTTPS采用的是混合方式加密:
过程是这样子的:
- 用户向web服务器发起一个安全链接的请求
- 服务器返回通过CA认证的数字证书,证书里面包含了服务器的public key(公钥)
- 用户拿到数字证书,用本身浏览器内置的CA证书解密获得服务器的public key
- 用户用服务器的public key加密一个用于接下来的对称加密算法的密钥,传给web服务器
- 由于只有服务器有private key能够解密,因此不用担忧中间人拦截这个加密的密钥
- 服务器拿到这个加密的密钥,解密获取密钥,再使用对称加密算法,和用户完成接下来的网络通讯
因此相比HTTP,HTTPS 传输更加安全
- (1) 全部信息都是加密传播,黑客没法窃听。
- (2) 具备校验机制,一旦被篡改,通讯双方会马上发现。
- (3) 配备身份证书,防止身份被冒充。
参考资料:
3、总结
我只是在学习的过程当中,把本身遇到的问题写出来,整理出来,但愿能够对你们有帮助。若是文章有错的地方,但愿你们能够在评论区指正,一块儿学习交流~
参考资料:
若是文章有错的地方欢迎指正,你们互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同窗,能够关注微信公众号:Java3y。
文章的目录导航: