为什么 HTTP/2 多路复用 tcp 会做同样的事情?

2023-11-23

据我所知,TCP 将消息分成段。那么,为什么 HTTP2 又要进行多路复用呢?两次复用有什么好处?


TCP 不是多路复用的。 TCP 只是一个有保证的消息流(即,重新请求丢失的数据包,并且在发生这种情况时 TCP 流基本上暂时被阻止)。

TCP作为基于数据包的协议,can如果更高级别的应用程序协议(例如 HTTP)允许发送多个消息,则可用于多路复用连接。不幸的是,HTTP/1.1 不允许这样做:一旦发送了 HTTP/1.1 消息,就不能在该连接上发送其他消息,直到该消息完整返回(忽略不支持的管道概念)。这意味着 HTTP/1.1 基本上是同步的,如果未使用全部带宽且其他 HTTP 消息排队,则会浪费可用于底层 TCP 连接的任何额外容量。

为了解决这个问题,可以打开更多的 TCP 连接,这基本上允许 HTTP/1.1act就像(有限的)多路复用协议。如果网络带宽被充分利用,那么这些额外的连接不会增加任何好处——事实是存在容量并且其他 TCP 连接没有被充分利用,这意味着这是有道理的。

因此,HTTP/2 在协议中添加了多路复用,以允许单个 TCP 连接用于多个正在进行的 HTTP 请求。

它通过将基于文本的 HTTP/1.1 协议更改为基于数据包的二进制协议来实现此目的。这些可能看起来像 TCP 数据包,但这并不真正相关(就像说 TCP 类似于 IP 因为它基于数据包并不相关一样)。将消息拆分成数据包实际上是允许多个消息同时传输的唯一方法。

HTTP/2 还添加了流的概念,以便数据包可以属于不同的请求(TCP 没有这样的概念),这才是 HTTP/2 多路复用的真正原因。

事实上,因为 TCP 不允许单独的、独立的流(即多路复用),并且因为它是有保证的,所以这实际上引入了一个新问题,即单个丢弃的 TCP 数据包仍然存在all该连接上的 HTTP/2 流,尽管事实上只有一个流应该真正受到影响,而其他流应该能够继续运行。在某些情况下,这甚至会使 HTTP/2 变慢。 Google 正在尝试从 TCP 转向QUIC来解决这个问题。

有关 HTTP/2 下多路复用含义的更多详细信息(以及为什么它是一个很好的改进!),请参阅我的回答:HTTP/2 中的多路复用意味着什么

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 HTTP/2 多路复用 tcp 会做同样的事情? 的相关文章

  • Spring Boot 2.0中嵌入式Web容器(如Tomcat)对HTTP2的支持详解

    Spring Boot应用往往作为服务发布 xff0c 这里对HTTP2的支持 xff0c 主要是对通过嵌入式Web容器支持HTTP2 1 在最新的Spring Boot 2 0 3 RELEASE中 xff0c 集成的三种嵌入式Web容器
  • HTTP/2.0 相比1.0有哪些重大改进?

    https www zhihu com question 34074946 https www zhihu com question 34074946 https www zhihu com question 34074946 https
  • 反向代理背后的 HTTP/2

    到目前为止 所有教程都告诉我 我需要在服务器上启用 SSL 才能支持 HTTP 2 在给定的场景中 我们在后端 Tomcat Jetty 服务器前面有 nginx 尽管从性能角度考虑值得在后端启用 HTTP 2 但在那里也拥有 HTTPS
  • 为什么我的部分http请求不使用http2

    环境 Ubuntu 16 04 LTS Nginx 版本 nginx 1 10 3 Ubuntu OpenSSL 版本 OpenSSL 1 0 2g 2016 年 3 月 1 日 简单说明 我已将 nginx 配置为使用 http2 并且我
  • 尽管发送了“升级”标头,但浏览器不会升级到 h2 (HTTP/2)

    我正在尝试让 h2 HTTP 2 在我的网络服务器上工作 通过 ondrej 存储库安装了 Apache 2 4 20 我在 Debian 8 和 Ubuntu 14 04 服务器上进行了测试 但我不断遇到同样的问题 我正在运行 OpenS
  • IIS 10 和 HTTP/2 - 需要客户端证书

    目前我正在使用 HTTP 1 1 和 HTTP 2 在 IIS 10 上测试 Web 应用程序 我的测试应用程序有一个端点 api test 它仅返回 true 我有3张证书 根 CA 自签名 由根 CA 签名的服务器证书 由根 CA 签名
  • 为什么捆绑优化不再是 HTTP/2 中的一个问题

    我在 systemjs 文档的捆绑部分中读到HTTP 2 中不再需要捆绑优化 https github com systemjs systemjs blob master docs production workflows md depca
  • 将 HTTP/2 与 angularJS 结合使用

    当我偶然发现 HTTP 2 时 我正在尝试找出提高 Web 应用程序性能的方法 在阅读它时 我了解到它有很多可以提高网站性能的功能 说到它的实现部分 我发现您只需将浏览器升级到最新版本即可使用 由于我的浏览器已经是最新版本 我看到我的所有资
  • PERF_TYPE_HARDWARE 和 PERF_TYPE_HW_CACHE 并发监控

    我正在研究一个自定义实现perf event open系统调用 该实施旨在支持各种PERF TYPE HARDWARE PERF TYPE SOFTWARE and PERF TYPE HW CACHE活动为任何核心上的特定线程 In 英特
  • PubNub最佳实践:如何管理私人房间?

    我正在学习 pubnub 并阅读了他们的文档 但我只是找不到如何管理多房间聊天框 默认情况下 任何人都可以收听某个频道 订阅和发布都很容易 我想要的是拥有一个主要的公共房间 到目前为止一切都很好 但任何人都应该能够与其他人私下交谈 而不会有
  • 如何使用 django 服务器 HTTP/2 协议

    我计划使用 HTTP 2 协议部署 Django 应用程序 但我无法找到正确的解决方案 我如何使用 HTTP 2 为我的 Django Web 应用程序提供服务 我唯一发现的是hyper h2 https github com python
  • 将 Webpack 与 HTTP/2 结合使用有什么价值

    我正在开始一个新项目 并且我正在尝试前瞻性地思考它 我过去使用过 Browserify 对于我的新项目 我想使用 Webpack Rollup 或 SystemJS Webpack 看起来是迄今为止最成熟的 具有大量出色的功能 不过 我担心
  • 启用 mod_http2 并在conf文件中设置协议后,HTTP/2配置未运行[重复]

    这个问题在这里已经有答案了 在看似正确的安装之后 HTTP 2 似乎并未运行 我运行的是 CentOS 7 我安装了最新版本的 Apache 版本 httpd 2 4 35 5 el7 x86 64 并一直在尝试让 HTTP 2 正常工作
  • 在浏览器中访问 HTTP/2 预告片

    当前是否有任何浏览器支持在 HTTP 2 响应中访问预告片 例如 最新的 Fetch API 规范提到预告片是通过 Response trailer 公开的 有支持该功能的浏览器吗 您可以在以下位置找到测试用例http wpt fyi fe
  • 使用 Http/2 从 javascript 进行 api 调用

    我知道大多数浏览器支持 http 2 来加载页面 但这是否意味着我在使用 XmlHttpRequest 进行 api 调用时可以利用它 更具体地说 我的问题是 如果我使用 XmlHttpRequest 进行 2 次调用来获取数据 是否可以确
  • PHP:获取 HTTP 协议版本(HTTP/1.1 与 HTTP/2)

    到目前为止 我的 php 应用程序到处都采用 HTTP 1 1 所以我定义了所有标题 如下所示 header HTTP 1 1 500 Internal Server Error 但现在我的服务器也支持 HTTP 2 我想使用正确的 HTT
  • C++ UDP Socket端口复用

    如何在 C 中创建客户端 UDP 套接字 以便它可以侦听另一个应用程序正在侦听的端口 换句话说 如何在 C 中应用端口复用 我只想监听一个端口 您可以使用嗅探器来做到这一点 只需忽略来自不同端口的数据包即可 我可能需要阻止它发送一些特定的数
  • ffmpeg 用于屏幕捕获?

    所以我有一个小程序来捕获屏幕和计算机麦克风的声音 然后屏幕截图被编码为 ScreenVideo2 声音被编码为 AAC 如何使用 ffmpeg 逐帧混合 然后将混合输出发送到 wowza 媒体服务器 如果用ffmpeg无法完成 您能提供一些
  • 通过 AWS ALB 的 HTTP2 PING 帧(gRPC keepalive ping)

    我正在使用 AWS Application Load Balancer ALB 公开 ASP NET Core gRPC 服务 这些服务在 Fargate 容器中运行并公开不安全的 HTTP 端口 ALB 终止外部 TLS 连接 并根据路由
  • python 2.7 中的 HTTP 2 请求

    在 python 中向 HTTP 1 和 HTTP 2 发出请求有什么区别吗 我可以像这样在 python 中进行 HTTP 1 x 调用 url http someURL values param1 key param2 key2 dat

随机推荐

  • 列出 javascript 中所有内置函数?

    js 有没有办法列出所有内置函数及其参数列表上的一些信息 我真的找不到任何关于反射来做这类事情的东西 编辑 Math sin之类的函数其实就是我要列出的 实际上都是内置函数 也许是这样的 for var x in window if win
  • 确定文件是否正在 Windows 上的 Perl 中使用

    我正在编写一些 Perl 它获取 Windows Media Center 上录制的电视节目 并根据某些条件移动 重命名 删除它们 由于 Perl 运行相当频繁 我想清楚地确定该文件是否正在使用 换句话说 节目正在录制过程中 这样我就可以避
  • Python 3:UnboundLocalError:赋值之前引用的局部变量[重复]

    这个问题在这里已经有答案了 下面的代码给出了错误UnboundLocalError local variable Var1 referenced before assignment Var1 1 Var2 0 def function if
  • 如何使用 Perl 从文本文件中提取 IP 地址?

    如何从每行都有 IP 地址的文本文件中提取 IP 地址 我想提取 IP 然后在单独的文件中列出 IP 地址 包含 IP 的文本文件采用以下格式 主机 somehost com 192 168 1 1 已启动 0 20 秒延迟 主机 10 1
  • Java 8 默认方法作为特征:安全吗?

    使用安全做法吗默认方法是穷人版本的特质在 Java 8 中 有人声称这可能会让熊猫感到悲伤如果你只是为了使用它们 因为它很酷 但这不是我的意图 人们还经常提醒 引入默认方法是为了支持 API 演化和向后兼容性 这是事实 但这并不意味着将它们
  • 如何访问深度嵌套的 json 键和值

    我正在用 Go 编写一个 websocket 客户端 我从服务器收到以下 JSON args time 2013 05 21 16 57 17 name send time 我正在尝试访问time参数 但就是无法掌握如何深入到接口类型 pa
  • 如何在ubuntu上彻底清除并重新安装postgresql? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 如果您认为该问题与主题相关另一个 Stack Exchange 站点 您可以发表评论来解释问题可以在哪里得到解
  • Z 顺序曲线坐标

    我如何访问使用 Z 顺序以 O 1 时间复杂度存储在数组中的数据 我需要通过坐标快速访问每个元素 有没有比使用 while 移位位更快的方法来访问这些数据 一种方法是使用查找表 我有静态数据大小 EDIT 我现在的一个想法是使用 y SIZ
  • 如何从过滤器中自动选择范围而无需手动输入?

    我想知道是否有一种方法可以根据所选过滤器自动选择单元格范围 Example 在 H 列 中设置过滤器 自动选择从 A 列 A2000 开始的结果单元格数据 C 列 C5000 等 这就是我陷入困境的地方 我不知道如何编写以根据所选过滤器自动
  • MySQL 查询被杀死后不会消失

    我有一个 MySQL 查询 它将数据从一个表复制到另一个表进行处理 由于某种原因 这个通常需要几秒钟的查询被锁定了一夜并运行了几个小时 今天早上登录时 我试图终止该查询 但它仍然列在进程列表中 Id User Host db Command
  • 为什么 Assembly.GetTypes() 需要引用?

    我想从程序集中获取所有类型 但我没有引用 也不关心它们 查找接口类型与引用有什么关系 我有办法解决这个问题吗 Assembly assembly Assembly LoadFrom myAssemblyPath Type typeArray
  • MPAndroidChart:如何自定义条形值标签

    我在我的 Android 应用程序中使用 MPAndroidChart 我用一个BarChart由 组成的BarEntry 我还启用了 y 值显示在栏顶部的功能 我的问题是我希望条形顶部的值是整数 例如5 但目前这些值显示为5 00 那么我
  • iOS 键盘语言更改时是否有委托调用?

    我有一个场景 我希望有一个处理程序 当用户按下 iOS 键盘上的语言更改 地球图标 时 该处理程序会被触发 我怎样才能实现这一目标 Thanks 以下应该有效 您必须在代码中使用 UIKeyboard 通知 NSNotificationCe
  • 如何使用 thymeleaf 在 javascript 中使用 for 循环?

    我正在使用 thymeleaf 所以当我运行这个应用程序时 它给了我一个错误 for int i 0 i h1 R h1
  • 使用打包在 .jar 中的 Thymeleaf 使用 Spring Boot 解析模板时出错

    我有一个使用 Thymeleaf 作为模板解析器的 Spring Boot 应用程序 在从 NetBeans 进行调试时工作正常 但在运行其 jar 时出现此错误 解析模板 theme property 时出错 模板可能不存在或无法被任何配
  • 当选定的 ng-option 更改时获取值

    我的 html 页面中有一个下拉列表 落下
  • 绘制色带在零附近发散的栅格

    我正在尝试绘制具有正值和负值的地图 All positive values should have red color while negative should have blue color and zero should have w
  • image_picker 构建时抛出异常

    我现在正在与 image picker 解决问题两天 它是从昨天中午我尝试调试我的应用程序时开始的 之前它会调试得很好 据我记得当时我没有改变任何东西 它抛出了unexpected element
  • system.outofmemoryException 填充DataAdapter时?

    我必须拉150K来自数据库的记录 我在用da Fill ds Query 和它的投掷system outofmemoryexception Dim daGrid As New SqlDataAdapter sqlcmd q daGrid F
  • 为什么 HTTP/2 多路复用 tcp 会做同样的事情?

    据我所知 TCP 将消息分成段 那么 为什么 HTTP2 又要进行多路复用呢 两次复用有什么好处 TCP 不是多路复用的 TCP 只是一个有保证的消息流 即 重新请求丢失的数据包 并且在发生这种情况时 TCP 流基本上暂时被阻止 TCP作为