对于一个HTTP请求来说,其影响因素主要主要分为两个部分:带宽和延时。
目前带宽随着网络基础设施的建设已经得到了极大的提升。影响延时的主要由以下三个因素:
- 浏览器阻塞。比如浏览器连接的限制。超过的连接请求只能阻塞等待
- DNS查询。需要知道目标服务器的ip地址才能建立连接。
- 建立连接。TCP需要经过三次握手的过程
HTTP 0.9
已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。不支持POST方法,因此客户端无法向服务器传递太多信息
HTTP 1.0
特点:
- 无状态:服务器不跟踪不记录请求的状态。可用过Cookie/Session来记录
无连接:每次请求都需要重新创建连接。缺点是每次都需要进行TCP的三次握手和四次挥手
HTTP 1.1
HTTP 1.1引入了以下特性:
长连接。增加了Connection字段,通过设置keep-alive来保持长连接。默认保持长连接
- 管道化。可以在一个连接器发送多个请求,但是返回顺序按照请求顺序来返回,因此效率并不高(会被某一个长的请求阻塞)
- 缓存处理。新增cache-control字段,当有缓存时,直接获取不再发起请求
- 断点续传。客户端通过Range字段,服务端通过content-range字段
HTTP 2.0
HTTP 2.0引入以下特性:
- 二进制协议。2.0中将头部信息和发送内容进行分帧,并对它们采用二进制编码
- 多路复用。可以在一个连接里面并发发起多个请求,不用顺序等待返回。每个请求以混合的顺序进行发送和接收,其中以requestId来识别每个请求
- 头部压缩。
- 服务端推送。让HTTP有了类似websocket的服务端推送能力
HTTP 3.0
HTTP 2.0仍然是基于TCP的,通过TCP来保证可靠传输,而3.0则改为使用基于UDP的QUIC协议进行实现,主要是解决TCP +TLS 建立连接的耗时问题。为什么要新建立QUIC协议,一个原因是TCP +TSL这一套用组合拳发展缓慢,另外就是在此基础上的改造成本也非常高
HTTPS
HTTP协议主要由以下几个弊端:
- 通信使用明文传输,内容可能被窃听
- 无法证明报文完整性,可能被篡改
- 不验证通信方的身份
而HTTPS相对HTTP,通过在TCP基础之上增加SSL/TSL层,具有以下的优势:
- 信息加密,使用对称加密算法对通信内容加密(使用非对称加密协商加密的秘钥)
- 数据完整性,对数据进行完整性校验(通过数字签名)
- 身份认识,第三方无法伪造服务端/客户端的身份(通过CA认证)
HTTPS主要解决了以下三个问题:加密、完整性校验和身份认证
HTTPS相比HTTP增加了SSL层,HTTPS主要依赖SSL/TSL协议。
SSL/TSL主要依赖散列函数、对称加密和非对称加密来保证,其中散列函数来保证完整性、非对称加密用来进行秘钥协商、对称加密来使用协商出的秘钥对数据进行加密
加密算法
加密分为对称加密和非对称加密,非对称加密使用公钥加密,私钥进行解密,对称加密的加密和解密都使用相同的秘钥
散列算法
常见的散列有MD5、SHA等,散列函数用来对发送信息生成数字摘要,然后接受方在接收到信息后利用相同的散列算法生成摘要,并与客户端的摘要进行对比,来验证信息的完整性。 其验证过程如下**
完整性校验的过程
完整性校验主要是通过对原文生成摘要,然后将摘要与原文一起发到服务端,由服务端通过原文生成新的摘要来与原摘要进行比对,并判断原文是否被串改的过程,摘要生成的过程一般不可逆
在发送方与接收方进行加密秘钥的过程中使用了服务端的公钥对该秘钥进行了加密,那么这个公钥又是从哪里来的呢?
该公钥被包含在数字证书中,数字证书通常是由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,证书中包含了一个秘钥对(公钥和私钥)和所有者的识别信息。数字证书被放在服务端,具有服务器身份验证和数据加密功能。
SSL建立连接过程
1.client首先发送一条握手信息给服务端,包含两个主要内容:一是随机数number1,二是协商一些加密算法(或者客户端支持的一些加密算法)
2.服务端接收到client发的握手信息后,会返回给客户端一条信息,包含两个主要内容:一是随机数number2,二是匹配好的协商加密算法
3.在进行第二步之后,会随之发送客户端一个证书
4.客户端会对证书进行校验,主要包含两点:一是客户端要验证服务端传过来的证书的数字摘要和服务端证书解密之后的内容是否一致,来确定是否篡改,二是证书链,逐级判断证书一直到根证书是否在操作系统中的可信任证书列表中。(根证书默认是会被植入到浏览器或者操作系统中)
5.组装会话秘钥:客户端依据number1、number2及预主秘钥去组装会话秘钥,客户端会把预主秘钥通过服务端传过来的证书中的公钥进行加密后传给服务端
6.服务端拿到加密之后的预主秘钥,然后用服务端私钥去解密,并结合number1、number2和预主秘钥组装会话秘钥
7.客户端使用组装的会话秘钥加密消息发送给服务端,来验证服务端是否能正常接收客户端的加密消息
8.服务端也会给客户端发送一条加密后的消息,来验证客户端能否接收加密后的消息,如果都验证成功则ssl连接建立成功