许久未见,最近饱受工作折磨,更新很慢,好在爱学习的我又回来了!!今天是http系列,文中包含HTTP的发展史,与https的区别,以及对称加密-非对称加密,对称加密、非对称加密等~,你准备好了嘛?
http发展史
(一)http协议
http: 超文本传输协议 ,应用层协议。主要用于 Web 上传输超媒体文本的底层协议,经常在浏览器和服务器之间传递数据。通信就是以纯文本的形式进行。
1、无状态: 是 http 协议对客户端请求状态没有进行存储,比如每次请求都需要重新登录
2、无连接:无连接主要是限制每次连接只处理一个请求。每次请求都是客户发起请求,服务端响应请求,然后就断开连接。这期间就是· 通过三次握手建立连接,四次挥手断开连接。每次请求即便是多次请求并请求同一个资源,服务端都无法判断是否是相同请求,都需要重新响应请求。
3、HTTP 的其他特点是简单快速,只需传送方法和路径就可以向服务端进行请求;还有支持传输任意类型的数据对象。
(二)http1 http1.1 http管道 http2 http3
http1
由 HTTP/0.9演变来的(HTTP 的发展 - HTTP | MDN (mozilla.org))
http1的问题
1、每次都需要等待上次一连接完成,才可以继续发送请求,简单来说就是HTTP/1.1 的模式是一问一答。网络利用率不高。
2、无法在一条连接上实现多路复用,也就是说在一个http请求中插入另一个http请求,它是无法分辨请求来源。
3、请求头部和响应头部都会重复发很多次,也无法压缩,比如请求头中的cookie。
http1.1
- 于是在http1.1中,优化了connection Keep-Alive, 默认使用长连接,保持连接一段时间,而不是像http1中使用完就销毁,使用了持久连接模型。采用管道化的方式,
http1.1 使用管道
http1.1 允许在持久连接上可选的使用请求管道。这是相对于keep-alive连接的又一性能优化。可以将多条请求放入队列,当第一条请求发往服务器的时候,第二第三条请求也可以开始发送了,在高延时网络条件下,这样做可以降低网络的环回时间,提高性能。但是队头阻塞问题依旧影响性能。
http1.1 管道为什么会有队头阻塞问题呢? 因为http请求和响应并没有序号标识,无法将乱序的响应与请求关联起来,所以要求管道化要求服务端按照请求发送的顺序返回响应(FIFO),如图,它不知道是谁发的请求,没有标识。
http1.1中管道化导致的队头阻塞的解决方案:
-
一种缓解方法是使用并发TCP连接,对于同一个域名,浏览器允许同时开6-8个TCP连接,因为每个TCP连接独立,所以某个TCP中的http请求阻塞,不影响其它TCP连接,所以虽然队头阻塞仍然存在,但因为存在多个独立的TCP连接,所以队头阻塞问题得到一定程度的缓解。
-
另一种方法是使用域名分片技术,即多开几个域名,这些域名都指向同一台服务器,这样实际长连接的数量就又上去了
-
使用http2解决
http管线化的其他问题
http管线化只能用于 GET 和 HEAD 请求,而 POST 请求则有所限制。
http2
- Http2 使用帧(frame)和流(stream)等概念来实现多路复用,将多个请求拆分到帧中,可以标识到数据包是哪个请求。在一个 TCP 连接上,HTTP/2 可以同时传输多个请求和响应,避免了 HTTP/1.x 中的队头阻塞问题,提高了网络传输效率。
http2中的新特性以及缺点
- 使用新的
二进制协议
,不再是纯文本,避免文本歧义,缩小了请求体积 多路复用
,同域名下所有通信都是在单链接(双向数据流)完成,提高连接的复用率,在拥塞控制方面有更好的能力提升,- 使用
HPACK算法将头部压缩
,用哈夫曼编码
建立索表,传送索引大大节约了带宽 - 允许
服务端主动推送
数据给客户端 - 增加了安全性,使用HTTP 2.0,要求必须至少TLS 1.2
- 使用虚拟的流传输消息,解决了应用层的队头阻塞问题
另外: 在 HTTP/2 中,有了二进制分帧之后,HTTP /2 不再依赖 TCP 链接去实现多流并行了,在 HTTP/2中:
- 同域名下所有通信都在单个连接上完成。
- 单个连接可以承载任意数量的双向数据流。
- 数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装。
http2的缺点
- http2采用tcp连接,tcp需要和服务器进行三次握手,即消耗完 1.5 个 RTT 之后才能进行数据传输。
TLS 连接有两个版本—— TLS1.2 和 TLS1.3,每个版本建立连接所花的时间不同,大致需要 1~2 个 RTT。
RTT(Round-Trip Time):
往返时延。表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。
- 虽然 HTTP/2 解决了很多之前旧版本的问题,但是它还是存在一个巨大的问题,主要是底层支撑的 TCP 协议造成的。 上面提到 HTTP/2 使用了多路复用,一般来说同一域名下只需要使用一个 TCP 连接。但当这个连接中出现了丢包的情况,那就会导致 HTTP/2 的表现情况反倒不如 HTTP/1 了。因为在出现丢包的情况下,整个 TCP 都要开始等待重传,也就导致了后面的所有数据都被阻塞了。但是对于 HTTP/1.1 来说,可以开启多个 TCP 连接,出现这种情况反到只会影响其中一个连接,剩余的 TCP 连接还可以正常传输数据。
http3
基于上述问题,就出现了http3:
-
HTTP3 是 HTTP 协议的第三个主要版本,它使用了一种与 http3 同时开发的传输技术,称为 QUIC。与 http1.1 和 http2 相比,http3 和 QUIC 有许多优点,包括更快的首次请求响应时间,因为 QUIC 和 http3 在客户端和服务器之间进行连接协商所需的往返次数更少。此外,http3 还支持在网络切换时进行过渡,这对移动设备非常有用,因为移动设备在更改位置时经常在 WIFI 和蜂窝网络之间切换。
-
http3,配合QUIC,实现了首次连接1RTT,后续0RTT
-
QUIC(Quick UDP Internet Connections)是一种基于 UDP 的传输层协议,由谷歌提出。它实现了 TCP + HTTPS + HTTP/2 的功能,目的是保证可靠性的同时降低网络延迟。QUIC 的特点包括无队头阻塞,灵活性、安全性和减少延迟,以及适用性和可管理性
http与https
1、 http
开头讲过,不再赘述~额外补充一个知识点:因为http是无状态的, 所以HTTP 协议对客户端请求状态没有进行存储,为了解决客户端和服务端保持会话连接,通过 cookie 和 session 来记录 http 状态。
2、https
HTTPS = http+ SSL/TLS(加密方式为非对称加密+对称加密)
SSL 是安全层,TLS 是传输层安全,是SSL 的继承。使用SSL或TLS 可确保传输数据的安全性。
3、加密
分为对称加密和非对称加密
对称加密
使用同一个密钥来进行加密和解密,经典的对称加密算法有 AES 等,对称加密只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换(可能在发送数据之前就被黑客截获),常用的有 AES 和 ChaCha20
非对称加密
非对称加密也叫做公钥加密。非对称加密与对称加密相比,安全性更好。对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对密钥,即公钥和私钥,且二者成对出现。私钥被自己保存,不能对外泄露。公钥指的是公共的密钥,任何人都可以获得该密钥。私钥只有在发送方自己拥有。
由于加密和解密使用了两个不同的密钥,这就是非对称加密“非对称”的原因。非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
https的加密
采用了对称+非对称加密的方式进行加密:
由于非对称机密性能不是很好,如果一概采用非对称加密的话,会严重影响 HTTPS 的性能,因此传输的数据的加密方式应该采用对称加密,而对称加密的密钥在通讯两端同步的时候容易被截获,因此,HTTPS 采用非对称加密的方式来对该对称密钥进行传输。通过这两种加密方式的结合,HTTPS 有效地避免性能损耗的同时,也让数据传输安全性得到了保障。非对称加密的算法:RSA ECC(常见)
大致过程如下:
-
client 端发送网络请求
-
server 返回一个CA证书 + 公钥
-
client 用机构认证的公钥认证sever的签名是否正确
-
client生成一个密钥R,用服务端公钥对密钥进行加密,server 通过服务器的私钥去破解获得密钥R
-
后续通讯用密钥R加密
通俗解释,使用对称加密算法沟通得到对称加密中所需要的密钥,然后在后续的网络通信中使用对称加密进行沟通。
5、http 与 https 区别
-
加密: https 是 http 协议的更加安全的版本,通过使用SSL/TLS进行加密传输的数据
-
连接方式: http(三次握手)和 https (三次握手+数字证书)连接方式不一样
-
端口: http 默认的端口是 80和 https 默认端口是 443
使用文献:特此感谢 一文读懂HTTP/2及HTTP/3特性 - Fundebug - 博客园 (cnblogs.com)