一、什么是队头阻塞
队头阻塞,在网络模型中简单理解就是,对于队列型的请求模型,如HTTP的请求-响应模型、TCP的ACK确认机制,都依赖得到一个具体的响应包,如果收不到这个响应包,那下一个请求就不能发,从而导致网络连接的阻塞。
二、HTTP队头阻塞
上面说了HTTP的队头阻塞原因是1.1的请求-响应模型,同一个连接中,下一个请求需要等上一个响应回来才能发出去;
那就很容易想到两种方式,要么同时建立多个连接,同时多个连接发送请求;但这样会有一些问题:
- 导致资源浪费,包括套接字、内存、网络带宽等;
- 实现复杂,客户端和服务器都要维护多个连接的状态,防止断开。
所以浏览器一般都会限制最大连接数;因此,这个方法能一定程度上解决队头阻塞问题,但效果一般。
那既然多个连接行不通,那就想办法让多个请求在一个连接上进行,即多组请求-响应复用同一个连接,多路复用技术。
那怎么实现呢?在HTTP2中,是通过把请求格式改造成二进制帧的方式。

客户端和服务器通过约定streamID的方式,来把同一个连接中,多个请求的stream帧区分组合,得到有效的请求数据。
通过这种方式,不同请求之间就不存在依赖关系了,HTTP2的队头阻塞问题也就解决。
三、TCP队头阻塞
因为HTTP是基于TCP的,所以对于上面的Stream帧,无论是改变编码方式、包结构等等方法,对于TCP连接来说,它接收到的都是字节流(没错,就是TCP的特性之一,基于字节流传输)。
T

最低0.47元/天 解锁文章
3584

被折叠的 条评论
为什么被折叠?



