江苏头排苏酒队(http+队头阻塞和多路复用的区别)

图片授权基于 www.pixabay.com 相关协议

HTTP 报文是一发一收的,你连续发 3 个请求,那就是 1-2-3,按顺序排好,服务器也会按顺序「排队处理」。如果你第一个请求就花费了 3 秒钟,那不好意思,后面的 2 和 3 的请求也会被相应的延迟处理,这就是队头阻塞。

那怎样解决这个问题呢?

在 HTTP/1.1 里缓解方案是:
1、并发连接:我建立多个长连接(什么是长连接)去请求数据,我连接多了,数据就被平均化了。随后,大部分客户端把连接数量提高到 6-8 个。
2、域名分片:我多开几个域名,不同的数据我用不同的二级域名去请求,那也可以啊。如:一个域名的连接是 6 个,3个域名就是 18 个连接了。
这就是 HTTP/1.1 的表象上解决了「队头阻塞」,弊端显而易见,占用了大量的服务器资源。
过了些年,HTTP2 出世,把这个问题解决了。
HTTP2 改变了传输的数据格式,传输的数据不再是肉眼的 ASCII 码(当然在浏览器还是可以看见明文数据的),HTTP2 向下兼容做的很好,HTTP1.* 的URI 、状态码、请求方法都没有做改变。只不过 HTTP2 更接近于 TCP 层,它把传输的数据改成了二进制。

传输示意图
把原来的「Header 和 Body」报文都打散成小片的「帧」,这样报文结构就没有了,只剩下非常多的小片「帧」。
把请求和响应数据都变成了小片「帧」。那通过什么传输呢?
二进制的帧是通过「流」来传输的,这个流是个虚拟的,我自己理解成「通道、过道」的意思。
每个帧呢,都带有自己单独的「流 ID」唯一标识符。收发完帧的时候,可以根据「流 ID」来组装成数据。
流是一个通道,通道里面传输的是打散的二进制帧,每个帧都带有自己的唯一流 ID。
而流呢,是可以在一个 TCP 连接上创建多个的。客户端在一个连接里最多能发出 10 亿个请求。
整套传输流程也叫「多路复用」。多路指的是无数个流,复用指的是复用这一个 TCP 连接。
所以,队头阻塞的问题就被解决了,只需要建立一个 TCP 连接,并且可以多路复用去请求和响应数据。
我们在写页面的时候,早期会使用「雪碧图」来解决网站访问速度的问题「多个小图片合并在一起,一次性请求下来」,这是因为 HTTP 短连接,建立连接成本的原因,后面出现了长连接和 HTTP2 也就使「雪碧图」这种解决方案慢慢退出市场了。

内容和图片来源于:极客时间《透视 HTTP 协议》

原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34465.html

Like (0)
小道研究的头像小道研究
Previous 2024年4月17日
Next 2024年4月17日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注