HTTP1.1、HTTP2
HTTP1.1 与 HTTP2
HTTP1.1 的缺陷
由于队头堵塞的高延迟
无状态特性阻碍交互
明文传输不安全
不支持服务端推送
什么是对头阻塞?
对头阻塞是指当顺序发送请求序列中的一个请求因为某种原因被阻塞时,后面排队的所有请求也一并被阻塞,进而可能会导致客户端迟迟收不到数据。
SPDY协议
是由谷歌推出的改进版本的HTTP
它的特点:
- 多路复用(解决队头阻塞)
允许在一个连接上
无限制并发流(就是不限制请求个数)。因为请求在一个通道上TCP效率更高(一个连接数)。更少的网络连接发出更密集的包
- 头部压缩(解决巨大的HTTP头部)
使用专门的 HPACK 算法,每次请求和响应都只发送差异头部,一般可以达到50%~90%的高压缩率
- 请求优先级(先获取重要数据)
虽然无限的并发流解决了队头阻塞的问题,但如果带宽受限,客户端可能会因防止阻塞通道而阻止请求。在网络被非关键资源阻塞时,高优先级的请求会被优先处理。
- 服务端推送(填补空缺)
可以让服务端主动地将资源发送给客户端,当然客户端也有权利选择是否接受。
举个例子,当客户端请求根目录的时候,服务端会将style.css
和example.png
一同发送给客户端。
- 提高安全性
使用 HTTPS 进行加密传输
HTTP2
HTTP2 基于 SPDY,专注于性能,最大的目标是在网站和用户之间只用一个连接
。
新增特性:
- 二进制分帧
是 HTTP2 性能增强的核心
首先,HTTP2 没有改变 HTTP 的语义,只是在应用层使用二进制分帧的方式进行传输。因此引入了新的通信单位:帧、消息、流。
**分帧有什么好处? **
服务器单位时间内接受的请求数变多,这样提高了并发数量,最重要的是为多路复用提供了底层支持。
- 多路复用
解决串行的文件传输和连接数过多
一个域名对应一个连接,一个流
代表了一个完整的请求-响应
的过程。帧
是最小的数据单位,每个帧
会标识出该帧属于哪个流
,流
也就是由多个帧组成的数据流。那么,多路复用就是在一个 TCP 连接里可以存在多个数据流,HTTP1.1无多路复用 对比 HTTP2多路复用。
HTTP2 的缺陷
- **TCP 以及 TCP+TLS 建立连接的延时 **
TCP 连接需要跟服务器三次握手,即消耗完 1.5 个 RTT 之后才能进行数据传输。TLS 连接有两个版本,TLS1.2 和 TLS1.3,每个版本建立连接所花的时间不同,大致需要 1~2 个 RTT。
RTT:往返时延。表示从发送端发送数据开始,到发送端收到来自接收端的确认,总共经历的时延。
- TCP 的队头阻塞并没有彻底解决
TCP 为了保证可靠传输,有一个超时重传机制,丢失的包必须等待重传确认,HTTP2 出现丢包时,整个 TCP 都要等待重传,那么就会阻塞该 TCP 连接中的所有请求
- 多路复用导致服务器压力上升
多路复用没有限制同时请求数。请求的平均数量与往常相同,但实际会有许多请求短暂爆发,压力过大,导致瞬时 QPS(最大吞吐能力)暴增
实际生产中要做负载均衡来减轻服务器压力(单节点负载过高),如果整个集群都负载过高就要考虑增加机器
- 多路复用容易 timeout
大批量的请求同时发送,由于 HTTP2 连接内 存在多个并行的流(并行的请求),而网络带宽和服务器资源有限,每个流的资源会被稀释,由于几乎同时来的请求,所以他们开始时间相差非常短短,这都意味着他们有可能超时。
即使是使用 Nginx 这样的负载均衡器,想正确进行节流也可能很棘手。其次,就算你向应用程序引入或调整排队机制,但一次处理的连接也是有限的。如果对请求进行排队,还要注意响应超时后丢弃请求