聊聊 HTTP/2 的多路复用

聊聊http2http3 HTTP/3 通过 QUIC 协议解决了 HTTP/2 的底层限制,尤其在高延迟、高丢包网络中表现更优,但需要网络基础设施的逐步适配。依赖 TCP 的可靠性和有序传输,但可能因 TCP 的队头阻塞(Head-of-Line Blocking)问题影响性能。:QUIC 将 TLS 握手与连接建立合并,首次连接仅需 1 RTT,重复连接可复用密钥实现 0-RTT。需要 TCP 三次握手 + TLS 握手(HTTPS 场景),通常需要 2-3 RTT(往返时间)。单个流的数据包丢失不会阻塞其他流。 阅读详情

大家好,我是前端西瓜哥。今天我们来聊聊 HTTP/2 的多路复用。

HTTP/1 下的请求,并不能很好地地利用带宽:一个 TCP 连接同时只能有一个 HTTP 请求和响应。如果正在发送一个 HTTP 请求,那其他的 HTTP 请求就得排队。

这种排队会产生一个请求队列,当队头的请求发生意外(比如丢包、服务器响应缓慢),导致比平时要慢得多,就会导致后面的请求被延迟。这种情况我们称为 队头阻塞(Head-of-line blocking)。

为了缓解这个问题,浏览器会对同一个域名建立多个 TCP 连接,来实现 HTTP 的并发。

但这也对服务器造成不小的负担,所以浏览器做了限制,同一个域名下 TCP 连接数最多会在 6 ~ 8 个左右。

如果网页一次性加载的资源太多,比如大量图片,6 个 TCP 连接数可能也会顶不住。为了解决一个问题,我们会使用 域名分片(Domain sharding) 的方法,就是将资源放到不同的域名下。

比如将图片放到专门的 static.xxx.com ,或者 CDN。因为域名不同,所以总的 TCP 连接数就能突破 6 的限制。达到 域名数 x 6

HTTP/1.1 有一个 pipeline 机制,意图解决不能并发的问题,但因为实现上的缺陷,实质上已经废弃。浏览器也默认关闭 pipeline。

为了解决这个问题,HTTP/2 使用了 多路复用

HTTP/2 引入了流(stream)和帧(frame)的概念。

帧是最小的数据单位,HTTP 报文不再是原来的明文的 ASCII 编码,而是会被拆分成一个个的二进制形式的帧。帧上面除了 HTTP 数据,还包含数据长度、流标识符、帧类型等信息。

流是一个建立连接后的双向的虚拟字节流,可以承载多个消息。帧通过自己的流 ID,确定自己属于哪个报文,就可以不按顺序进行请求响应了。

HTTP/2 会将所有 HTTP 请求打散成帧,在一个 TCP 连接上做并发请求,充分利用 TCP 带宽。现在浏览器对于 HTTP2,只会建立一个 TCP 连接,减轻了服务端不小压力。

例子

我们举个例子讲解 HTTP/1 升级为 HTTP/2 后利用多路复用带来的优势。

假设依次请求一个很大的 JS 文件,和一个很小的 CSS 文件。

在 HTTP/1 时,TCP 的发送的包是这样的(JS 用多个 1 表示,CSS 用多个 2 表示):

111111111111111111111111222

JS 很大,会让 CSS 延迟,我们可能希望比较小的 CSS 能早一点请求完,早一点做解析。而且 JS 一旦发生了意外发生阻塞,CSS 就更晚才能获取到了。

现在我们用 HTTP/2,就变成了下面这样:

121212111111111111111111111

因为并行的原因,CSS 不仅不用再担心 JS 导致的阻塞,还能更早请求并获取到资源。

结尾

HTTP/2 的多路复用能够解决 HTTP 队头阻塞问题,更充分地利用 TCP 带宽。

但因为还是在 TCP 上的协议,所以不能解决 TCP 队头阻塞问题,这个问题要交给 HTTP/3 通过 UDP 来解决了,期待一下。

我是前端西瓜哥,欢迎关注我,学习更多前端知识。

为什么叫 HTTP/2 ,而不是 HTTP/2.0 ? 大家好,我是Tom哥~今天跟大家聊聊HTTP协议,欢迎留言讨论互联网时代,足不出户,点点鼠标就可以轻松了解外面的世界变化,这一切得益于网络传输数据。我们都知道网络有7层模型,从底层到上层依次是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。越往上,越接近用户习惯,更容易被用户直观了解。今天讲的 HTTP 协议属于应用层协议,也是互联网广泛使用的基础协议之一。一、 HTTP/0.90.9 版本是HTTP最早的版本,诞生于 1991 年,比较简单。1、只支持 GET 请求,没有请求头。每次请求 阅读详情

相关推荐

前端性能优化(三)聊聊HTTP/2带来的加载优化

那些年,我们使用HTTP1.1,我们忍受着巨大的网络延时,而同时我们的网页变得越来越复杂,我们需要加载的资源越来越大越来越多。 HTTP1.1如何加载资源 建立HTTP链接,由于HTTP是基于TCP的,所以必然要经过TCP的三次握手。 发送请求,TCP有慢启动的问题。 接收响应。 如果连接被双方认可是keep-alive的,那么后续请求可复用该连接发送请求。 ...

小姜哥的技术博客 1178

Http2中的多路复用

简介 多路复用代替原来的序列和阻塞机制,所有就是请求的都是通过一个 TCP 连接并发完成。同时也很好的解决了浏览器限制同一个域名下的请求数量的问题。 在 HTTP/2 中,有了二进制分帧之后,HTTP/2 不再依赖 TCP 链接去实现多流并行了,在 HTTP/2 中: 同域名下所有通信都在单个连接上完成,同个域名只需要占用一个 TCP 连接,使用一个连接并行发送多个请求和响应。 单个连接可以承载任意数量的双向数据流,单个连接上可以并行交错的请求和响应,之间互不干扰。 数据流以消息的形式发送,而消息

Delicia_Lani的博客 8177

ComfyUI 的 LoRA 训练:秋叶 LoRA-scripts 参数设置与测试方法详解

秋叶 LoRA-scripts 的参数设置需结合理论(如模型原理、优化器机制)和硬件条件(显存、算力),新手可先按推荐值起步,再逐步调整。测试时,loss 值帮你判断训练是否正常,XYZ 图表法帮你找到最佳使用参数。掌握这些知识,你就能避开 LoRA 训练的常见坑,从 “盲目调参” 变为 “精准训练”。

2301_78150483的博客 2327

浅析HTTP/2多路复用

​本文转载自:浅析HTTP/2多路复用 http/2有三大特性:头部压缩、Server push、多路复用。 先来说说Keep-Alive 没有keep-alive之前,我们的每一个请求都是经过:发起请求、域名解析、http连接、服务器处理、返回到浏览器、文件解析和渲染。 如此一个一个的请求下去。。。 这样最大的问题就是:每次请求都要简历http连接,就是3次握手四次挥手。非常占用时间。 Keep-Alive解决的问题 有了keep-alive后,一定时间内,统一域名多次请求数据,只需要建.

weixin_36320950的博客 1147

理解HTTP/2多路复用

什么是 HTTP/2HTTP/2 就是超文本传输协议的第二个主要版本,是自1999年 HTTP 1.1 之后发布的首个更新,主要基于 SPDY 协议(是Google开发的基于TCP的应用层...

文摘资讯 1652

HTTP/2笔记之流和多路复用

前言 本部分将讲解HTTP/2协议中对流的定义和使用,其实就是在说HTTP/2是若何做到多路复用的。 流和多路复用的关系 1. 流的概念 流(Stream),服务器和客户端在HTTP/2连接内用于交换帧数据的独立双向序列,逻辑上可看做一个较为完整的交互处理单元,即表达一次完整的资源请求-响应数据交换流程;一个业务处理单元,在一个流内进行处理完毕,这个流生命周期完结。 特点如下: 一个HTTP/2...

稻草人技术博客 2313

HTTP/2 多路复用:为什么你的网站加载速度能快3倍?

想象一下,你在银行排队办业务。前面有个人在办理复杂的业务,需要很长时间,你只能干等着。这就是 HTTP/1.1 的队头阻塞问题。一个 TCP 连接只能同时处理一个请求如果某个请求处理慢,后面的请求都要排队浏览器最多只能开6-8个并发连接大量小文件请求时,性能急剧下降简单来说,多路复用就是"一个连接,多个请求"。就像高速公路上的多条车道,不同的车可以同时行驶,互不干扰。一个 TCP 连接可以同时处理多个请求请求和响应被分解成帧(Frame)每个帧都有独立的流(Stream)标识。

我爱娃哈哈的专栏 1261

聊聊HTTP2

花了两天时间读完HTTP2的RFC,揭开HTTP2的神秘面纱,驱散心中迷雾,它比HTTP1.1,到底改变了什么。 这是一篇什么样的文章 这是一篇化繁为简的文章,只pick HTTP2中最为关键的部分,忽略细节实现部分。毕竟,每个人读一个文档的目的是不一样的。像我只是想从原理上理解,以便之后使用时能够更加顺畅;而如果是为了实现一个支持HTTP2的库,则需要抠细节,当然花费的时间肯定也不一样,那会是一遍一遍又一遍。 同时我也受够了网上花花绿绿的文章,它们,十之八九,乃基于数篇至数百篇咀嚼过的N手知识,稀碎拼.

zou8944的博客 833

HTTP聊聊 http 的那些事

前言 http建立之初,是为了将超文本标记语言(html)文档从web服务器传送到客户端的浏览器。随着互联网的发展,html变得越来越复杂,不仅仅有文字和图片,同时还有了css,JavaScript等来丰富页面的展示。这使得我们不得不对 HTTP 进行深入理解并不断优化。 优化方向 影响一个 HTTP 网络请求的因素主要有两个:带宽和延迟。 带宽:如果说我们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响请求的问题,但是现在网络基础建设已经使得带宽得到极大的提升,我们不再会担心由带宽而影响网速,那么

yang553566463的博客 580

HTTP/2:让网络飞起来

本文详解了HTTP/2协议,它改善了HTTP/1.1的性能问题,引入了新特性如二进制帧、多路复用等,提高了网络性能。现代浏览器和服务器都支持HTTP/2,且部署简单。在HTTP/2的环境下,我们需要重新思考Web性能优化策略。

陆业聪 1506

HTTP协议进化史,从单行文本到高性能多路复用的完美蜕变

HTTP协议已经走过了30多年的进化历程。就像手机从大哥大进化到智能手机一样,HTTP也在不断升级换代,解决着Web世界日益复杂的性能挑战

ly853602的博客 951

HTTP/2 特点解析,从 HTTP/1.1 的痛点到新一代协议的进化

HTTP/2 解决 HTTP/1.1 队头阻塞、低效传输等痛点,通过多路复用、二进制帧、头部压缩等技术大幅提升加载速度,支持服务器推送与流优先级,优化用户体验。虽仍受制于 TCP 丢包问题,但已是当前主流高性能协议,为迈向 HTTP/3 奠定基础。

三两肉的博客 679

HTTP2.0多路复用

上篇文章介绍了http1.1相对于http2的一些不足,本篇文章来聊一聊http2的一些优点,但是http2的优点比较多,并且需要结合源码展示,所以关于htt2的一些特点,我打算拆分成多篇文章,本篇文章只讨论http2实现的多路复用功能。 回顾http1.1协议,我们了解到,虽然http1.1实现了tcp的长连接,在一个tcp链接通道中,我们可以连续处理多个http请求响应,但是这个处理过程是半双工模式,也就是同一时刻只能处理一个request的请求或者响应,后面的request必须等到前面的请求响应之后才

qq592567042的博客 4278

说说HTTP/2.0多路复用基本原理以及解决的问题

HTTP/2解决的问题,就是HTTP/1.1存在的问题: TCP慢启动: TCP连接建立后,会经历一个先慢后快的发送过程,就像汽车启动一般,如果我们的网页文件(HTML/JS/CSS/icon)都经过一次慢启动,对性能是不小的损耗。另外慢启动是TCP为了减少网络拥塞的一种策略,我们是没有办法改变的。 多条TCP连接竞争带宽: 如果同时建立多条TCP连接,当带宽不足时就会竞争带宽,影响关键资...

包磊磊的博客 3303

简单讲解一下http2多路复用

当请求a文件时,b文件只能等待,等待a连接到服务器服务器处理文件、服务器返回文件,这三个步骤。我们假设这三步用时都是1秒,那么a文件用时为3秒,b文件传输完成用时为6秒,依此类推。我们假设Apache设置了最大并发数为300,因为浏览器限制,浏览器发起的最大请求数为6,也就是服务器能承载的最高并发为50,当第51个人访问时,就需要等待前面某个请求处理完成。帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。在 HTTP/2 中,有两个非常重要的概念,分别是。

jialiang808的博客 148

HTTP2协议介绍

HTTP是现代互联网通信的基础协议之一,早在1991年,HTTP/0.9版本就诞生了,之后又陆续发布了HTTP/1.0和HTTP/1.1,为互联网应用提供了更高效和可靠的通信方式。随着时间的推移,互联网的规模和复杂性不断扩大,HTTP/1.1的一些限制也逐渐显现出来,例如串行的请求-响应机制、头部冗余和响应阻塞等。这些问题影响了网页加载速度、性能和用户体验。为了克服这些挑战并引领下一代Web协议的发展,HTTP22015年正式发布。

程序员小潘 1143

http2多路复用的简单介绍

HTTP/1 中,每次请求都会建立一次HTTP连接,也就是我们常说的3次握手4次挥手,这个过程在一次请求过程中占用了相当长的时间,即使开启了 Keep-Alive ,解决了多次连接的问题,但是依然有两个效率上的问题: 第一个:串行的文件传输。当请求a文件时,b文件只能等待,等待a连接到服务器服务器处理文件、服务器返回文件,这三个步骤。我们假设这三步用时都是1秒,那么a文件用时为3秒,b文件...

qq_36669347的博客 702

HTTP/2协议详细介绍

0 摘要 兼容HTTP1.1 头部压缩 二进制帧 并发传输 服务器主动推送资源 HTTP2的队头阻塞问题 1 兼容HTTP1.1 HTTP2的优点我们后面会一一列出,但是一个新的东西的升级必须要做到向前兼容才能快速推广,因为只有这样才能减少对用户的影响。 HTTP2HTTP1.1的兼容体现在哪些方面 协议名依然使用http,加密的依然使用https,浏览器和服务器只需要在幕后自动升级协议,用户并不会感知到协议的变化。 HTTP

Java搜索工程技术栈 4200

LIO-SAM编译ubuntu20.04 Noetic

一、下载二、编译&&解决报错报错如下。

Kenneth666888的博客 663

微信支付-商家转账到零钱

微信提现到零钱功能既是商户号中"商家转账到零钱"PHP项目微信提现功能代码

上一篇: 长列表优化:用 React 实现虚拟列表
下一篇: 如何用 Docker 安装运行 mysql?
前端西瓜哥
博客等级 码龄5年 206粉丝 178原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值