HTTP概述
HTTP(超文本传输协议)是一个基于TCP的应用层协议
GET和POST的区别
- GET提交的数据放在URL中, 不适用一些私密数据的传输, POST提交的数据在header中,但是也无法保证安全性, 没有加密过
- GET提交的数据大小有限制(是因为浏览器对URL的长度有限制,GET本身没有限制),POST没有
HTTP1.0
- 引入了状态码
- 为了减轻服务器的压力,在 HTTP/1.0 中提供了Cache 机制,用来缓存已经下载过的数据
- 引入用户代理字段
HTTP1.1
- 持久连接, 一个TCP连接可以发送多个HTTP请求
- 浏览器为每个域名最多同时维护 6 个 TCP 持久连接;
- 使用 CDN 的实现域名分片机制。
- 不成熟的HTTP管线化(虽然持久连接可以发送多个HTTP请求, 但是它需要等待前面的请求返回之后,才能进行下一次请求。) (已放弃)
- 虚拟主机支持 HTTP/1.1 的请求头中增加了Host 字段,用来表示当前的域名地址,这样服务器就可以根据不同的 Host 值做不同的处理。
- 动态数据支持. HTTP/1.1 通过引入Chunk transfer 机制来解决这个问题,服务器会将数据分割成若干个任意大小的数据块,每个数据块发送时会附上上个数据块的长度,最后使用一个零长度的块作为发送数据完成的标志。
- 客户端 Cookie、安全机制
HTTP2
HTTP1.1问题
带宽利用率不高, 主要原因如下
- TCP慢启动
- 同时开启了多条 TCP 连接,那么这些连接会竞争固定的带宽
- HTTP/1.1 队头阻塞的问题. 所有请求公用一个TCP管道, 前面的请求会阻塞后面的请求
慢启动和 TCP 连接之间相互竞争带宽是由于 TCP 本身的机制导致的,而队头阻塞是由于 HTTP/1.1 的机制导致的。
引入HTTP2
HTTP/2 的思路就是一个域名只使用一个 TCP 长连接来传输数据,这样整个页面资源的下载过程只需要一次慢启动,同时也避免了多个 TCP 连接竞争带宽所带来的问题。
HTTP/2 需要实现资源的并行请求,也就是任何时候都可以将请求发送给服务器,而并不需要等待其他请求的完成,然后服务器也可以随时返回处理好的请求资源给浏览器。
HTTP/2 的解决方案可以总结为:一个域名只使用一个 TCP 长连接和消除队头阻塞问题。最重要的几个字就是多路复用机制
HTTP/2 使用了多路复用技术,可以将请求分成一帧一帧的数据去传输,这样带来了一个额外的好处,就是当收到一个优先级高的请求时,比如接收到 JavaScript 或者 CSS 关键资源的请求,服务器可以暂停之前的请求来优先处理关键资源的请求
HTTP2其他特性
- 可以设置请求的优先级
- 服务器推送
- 头部压缩
HTTP2的缺陷
- TCP 的队头阻塞 同一域名使用一个TCP连接造成的问题
- TCP 建立连接的延时
- TCP 协议僵化
- QUIC 协议
HTTPS
采用 对称加密 和 非对称加密 结合的方式来保护浏览器和服务端之间的通信安全
- 对称加密
通信双方使用同一个密钥进行加密和解密
- 非对称加密
简单说就是有两把密钥,通常一把叫做公钥、一把叫私钥,用公钥加密的内容必须用私钥才能解开,同样,私钥加密的内容只有公钥能解开。
对称加密和非对称加密结合
- 第一个是非对称加密的效率太低。这会严重影响到加解密数据的速度,进而影响到用户打开页面的速度。
- 第二个是无法保证服务器发送给浏览器的数据安全。虽然浏览器端可以使用公钥来加密,但是服务器端只能采用私钥来加密,私钥加密只有公钥能解密,但黑客也是可以获取得到公钥的,这样就不能保证服务器端数据的安全了。
所以采用了对称加密+非对称加密的方法
在传输数据阶段依然使用对称加密,但是对称加密的密钥我们采用非对称加密来传输
具体流程如下:
- 客户端向服务器端发起SSL连接请求;
- 服务器把公钥发送给客户端,并且服务器端保存着唯一的私钥;
- 客户端用公钥对双方通信的对称秘钥进行加密,并发送给服务器端;
- 服务器利用自己唯一的私钥对客户端发来的对称秘钥进行解密,在此过程中,中间方无法对其解密(即使是客户端也无法解密,因为只有服务器端拥有唯一的私钥),这样保证了对称秘钥在收发过程中的安全,此时,服务器端和客户端拥有了一套完全相同的对称秘钥。
- 进行数据传输,服务器和客户端双方用公有的相同的对称秘钥对数据进行加密解密,可以保证在数据收发过程中的安全,即是第三方获得数据包,也无法对其进行加密,解密和篡改。
添加证书
服务器端会向CA申请认证书,此证书包含了CA及服务器端的一些信息(可以理解为类似公章),这样,服务器端将证书发给客户端的过程中,中间方是无法伪造的,保证了,发给客户端的公钥是服务器端发送的。
- 通过数字证书向浏览器证明服务器的身份,
- 数字证书里面包含了服务器公钥。