HTTP/2 和文件下载

2023-11-27

我们提供文件托管解决方案。我们的客户是最终用户,他们通过 HTTP 1.1 协议访问我们的服务器并下载文件。这些客户端基本上是软件系统或 CDN,它们使用软件库下载我们的文件。没有人类用户访问我们的系统。我们还提供使用 HTTP/1.1 范围标头等进行部分文件下载的选项。客户端系统还使用多个线程通过跨块分割来下载大文件。

我想检查一下如果我们向服务器开放 HTTP/2.0 协议是否会有真正的好处?由于我们的客户端系统已经能够使用多线程来下载文件,HTTP/2.0 多路复用会带来任何真正的好处吗?

Thanks


HTTP/2 文件下载比 HTTP/1.1 慢一点,主要原因有两个:帧开销和流量控制.

在 HTTP/1.1 中,如果您使用Content-Length分隔下载,下载的唯一字节是内容字节。 然而,在 HTTP/2 中,每个DATA帧携带 9 个额外字节作为帧头。对于 16384 字节的正常最大帧大小,这是一个很小的开销,但它确实存在。

可能导致速度变慢的更大因素是 HTTP/2 流量控制。 客户端必须确保扩大默认会话和流控制窗口,默认情况下均为 65535 字节。

HTTP/2 的工作方式是服务器保存一个send每个 HTTP/2 会话(连接)以及该会话中每个流的窗口。 当下载开始时,服务器有权为该流或该会话仅发送发送窗口允许的字节数,以先耗尽者为准。然后就必须等待客户端发送WINDOW_UPDATE帧,补充流和会话流控制窗口,告诉服务器客户端已准备好接收更多数据。

对于像默认窗口这样的小窗口,这种机制可能会由于客户端和服务器之间的网络延迟而降低下载性能,特别是如果它是简单实现的。 服务器大部分时间都会停止等待客户端发送数据WINDOW_UPDATE以便服务器可以发送更多数据。

多路复用起着双重作用。虽然它允许同时启动许多文件的下载(可能比 HTTP/1.1 更多的文件,这可能受到它只能打开较少数量的连接的限制),但为每个流下载的数据也是事实有助于减少会话发送窗口。每个流可能仍然有一个未耗尽的发送窗口(因此它可以发送更多数据),但会话窗口已耗尽,因此服务器必须停止。流相互竞争以消耗会话发送窗口。服务器实现也很重要,因为它必须正确地交错来自多个流的帧。

话虽如此,HTTP/2 仍然有可能实现与 HTTP/1.1 的同等水平,前提是您对客户端和服务器都有相当先进的实现,并且您有足够的调节旋钮来控制关键参数。

理想情况下,在客户端:

  • 控制会话和流初始流量控制窗口的能力
  • 一个好的实现发送WINDOW_UPDATE当服务器还在下载时向服务器发送帧,这样服务器就不会停止;这可能需要自调整功能,具体取决于带宽延迟积(类似于TCP的做法)

理想情况下,在服务器上:

  • 正确交错来自同一会话的多个流的帧的能力(例如,避免下载第一个流的所有帧,然后下载第二个流的所有帧等,而是先下载第一个流的一帧,然后下载第二个流的一帧)第二个流,然后是第一个流的一帧,等等)

[免责声明,我是 HTTP/2 的维护者Jetty]

Jetty 9.4.x 支持上述所有功能,因为我们与社区和客户合作以确保 HTTP/2 下载尽可能快。

我们在服务器和 Jetty 上实现了适当的交错HttpClient and HTTP2Client分别提供高层和低层API来处理HTTP和HTTP/2请求。流量控制是在BufferingFlowControlStrategy并允许调整何时WINDOW_UPDATE帧已发送(尽管尚未动态发送)。 客户端还可以选择配置初始流量控制窗口。 Jetty 中的所有内容都是可插拔的,因此您可以编写更高级的流量控制策略。

即使您不使用 Java 或 Jetty,也请确保剖析(或编写)您在客户端和服务器上使用的库,以便它们提供上述功能。

最后,你需要尝试和衡量;通过正确的 HTTP/2 实现和配置,多路复用效果应该发挥作用,从而提高并行性并减少客户端和服务器上的资源利用率,这样您将比 HTTP/1.1 具有优势。

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

HTTP/2 和文件下载 的相关文章

  • CMake:将为 lib 构建的对象文件重用到另一个 lib 目标中

    我正在尝试将我的项目转移到CMake 同时对编译过程进行一些优化 这是交易 我有几个子目录 必须 每个子目录都编译成静态库 这有效 我想将每个子目录中的所有目标文件收集到另一个更大的 完整的静态库中 它看起来像这样 libBig a mad
  • 从文件中读取单词并放入列表中

    本质上 我有一个巨大的文件 所有文件包含每行多个单词 每个单词用空格分隔 有点像这样 WORD WORD WORD WORD ANOTHER WORD SCRABBLE BLAH YES NO 我想要做的是将文件中的所有单词放入一个巨大的列
  • 在文件中查找一行并将其删除

    我正在寻找一个小代码片段 它将在文件中找到一行并删除该行 不是内容而是行 但找不到 例如 我在以下文件中 我的文件 txt aaa bbb ccc ddd 需要有这样的功能 public void removeLine String lin
  • Javascript 将 CSV 文件加载到数组中

    我正在 WordPress 中开发一个网页 该网页需要有一个包含所有县的组合框 我有一个 csv 格式的数据集 其中包含所有这些县的约 10k 行 当用户在下拉列表中选择一个县时 我只想在网页中显示所选县的数据 这是我的要求 在 WordP
  • 多线程文件写入

    我正在尝试使用多个线程写入大文件的不同部分 就像分段文件下载器所做的那样 我的问题是 执行此操作的安全方法是什么 我是否打开文件进行写入 创建线程 将 Stream 对象传递给每个线程 我不希望发生错误 因为多个线程可能同时访问同一个对象
  • 如何在 Spring Boot 中从 resolurces 文件中读取文件夹,:从 Jar 运行时出现错误

    我正在尝试下面的代码 我在其中读取文件并从资源文件夹执行 File fileList new File getClass getResource jsonData toURI listFiles for File file fileList
  • 检测“文件下载”弹出窗口何时关闭

    我有一个网页 用 JSF 制作 其中一些链接允许用户获取 PDF 文件 当用户点击这样的链接时 会显示一个等待弹出窗口 它是一个模式面板 因为 PDF 的生成可能很长 并且一旦创建文件 IE 就会显示 文件下载 弹出窗口 建议 打开 保存
  • Mac 操作系统的 windows.h 替代品

    早上好 我正在使用 Codeblock c 程序进行编程 但是 我需要使用窗口 h and conio h MacBook 上没有这个头文件 拜托 你能帮我吗 不起作用的来源 void gotoxy int x int y COORD co
  • python 和回文

    我最近写了一个循环的方法 usr share dict words并使用我的返回回文列表ispalindrome x 方法 这是一些代码 有什么问题吗 它只会停止 10 分钟 然后返回文件中所有单词的列表 def reverse a ret
  • 从 Get-ChildItem -Path 返回对象数组

    从 powershell 开始 ls R txt将按目录递归列出文件 或者更好 PS gt Get ChildItem Path C Test Name logs anotherfile txt Command txt CreateTest
  • React 包的 CDN 链接以及在使用 React 时如何使用 CDN 中的脚本导入它

    我尝试在没有 NPM 和其他工具的情况下使用 React 而是通过添加 CDN 链接来使用它 但是如何导入依赖包 例如useState hook 如果它是通过另一个脚本标签添加的 那么它的 CDN 链接是什么 下面是我的代码
  • 将 PHP 变量保存到文本文件

    我想知道如何将 PHP 变量保存到 txt 文件 然后 再次检索它们 Example 有一个输入框 提交后写的东西 输入框将被保存到文本文件中 稍后需要结果 作为变量带回 假设变量是 text I 需要将其保存到文本文件并能够将其检索回来
  • Sharepoint 上的 WebPart 在本地下载文件 - 我需要将其发送到客户端

    请帮助我在使用 Sharepoint 站点的计算机上下载文件 而不是在具有 Sharepoint 服务器的计算机上 public class WebClientBL static WebClient client new WebClient
  • 如何读取 C# 字符串字典并将其写入文件?

    我有一个 Dictionary 对象 我想写入磁盘并能够从磁盘读取它 理想情况下 我会避免使用任何第三方库 有没有一种简单的方法可以使用常规 C 4 来做到这一点 答案已接受 Summary 选项 1 使用 JavaScriptSerial
  • 当我只能处理文件或文件路径时如何处理 SAF?

    背景 在 Android Q 之前 如果我们想获取有关 APK 文件的信息 我们可以使用写外部存储 https developer android com reference android Manifest permission html
  • 从 python 执行 C++ 代码

    我是 python 的初学者 我不知道这是否可行 我在 python 中有一个简单的循环 它为我提供当前目录中的所有文件 我想要做的是从 python 执行我之前在目录中的所有这些文件上编写的 C 代码 建议的 python 循环应该是这样
  • 读取FCS文件

    我正在研究流式细胞术 我想使用 python 解析 fcs 文件 我在互联网上研究过 有一个模块fcm但这是针对Linux操作系统的 我正在Windows上工作 我想知道如何使用 python 解析 Windows 中的 fcs 文件 如果
  • PHP将数据写入文件中间而不重写文件的最佳方法是什么

    我正在 php 1GB 中处理大型文本文件 我正在使用 file get contents file txt NULL NULL 100000000 100 要从文件中间获取数据 但如果我想将文件中的数据更改为与原始数据不同的更改 我将不得
  • c# - 如何列出硬盘上的所有文件和文件夹?

    我想列出我的程序有权访问的所有文件和文件夹并将它们写入文本文件 我如何获得该列表 我需要一种方法来捕获或不对不可访问的文件夹抛出 UnauthorizedAccessExceptions 请尝试使用代码 private static IEn
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht

随机推荐

  • 如何建立 .NET 开发树? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 如何建立 NET 开发树 我使用这样的结构 projectname config where I put the configuration files doc where I put a
  • 当我输入“cd ~”时,“~”是什么目录?

    我刚开始使用 SSH 但是当我登录时 我最终会进入目录 通常与 FTP 进入时的目录相同 我仍然可以转到 但我不知道 是什么意思 家 它与 的关系在哪里 或者我怎样才能找到 是当前登录用户主目录的别名 要找出它到底在哪里 请输入pwd 代表
  • 两个文件包含 main() Visual Studio 的定义?

    我在 Visual Studio 2008 专业版中创建了一个项目 该项目为每个作业包含一个 cpp 文件 如下所示 Source Files 233 cpp test cpp 每个文件都包含 main 的定义 操作 CTRL F5 Err
  • 更新视图控制器之间的状态栏样式

    In my info plist 我有的文件View controller based status bar appearance set to YES 我有一个FirstViewController状态栏隐藏的地方 In my Secon
  • 如何从 lxml 获取原始 XML?

    我使用以下代码来定位 div parser etree HTMLParser tree etree parse StringIO page parser div tree xpath div class content 0 我唯一的问题是
  • clang 完成不起作用

    我为 vim 安装了 clang complete 但它不起作用 例如 当我输入std 在使用 vim 的 c 文件中 vim 窗口的底部显示 User defined completion U N P Pattern not found
  • java.lang.ClassNotFoundException:TopologyMain

    我正在尝试向本地风暴集群提交一个简单的字数统计拓扑 首先 我尝试使用 Maven 然后使用 Storm 命令行客户端 我使用 eclipse 创建了 JAR 文件 但是 它抛出主类未找到异常 谁能告诉我可能是什么问题 我在下面附上代码和异常
  • 如何在R中summary中获取群的众数

    我想比较两个不同索赔付款人的 CPT 代码的成本 两者都有平价和非平价提供商 我在用dplyr and modeest mlv 但它没有按预期工作 这是一些示例数据 source CPTCode ParNonPar Key net paid
  • 无法在 Firebase 控制台中创建新项目

    当我在 Firebase 控制台中创建项目时 收到错误 您已超出可以创建的免费 G oogle 项目的最大数量 请尝试在 Google API 控制台中删除未使用的项目或请求增加项目限制 我从 Firebase 控制台中删除了未使用的项目
  • 将点捕捉到一条线

    我有两个 GPS 坐标 它们连接在一起形成一条线 我还有一个 GPS 点 该点靠近该线 但从未完全在线上 我的问题是 如何找到沿线到给定点最近的点 游戏开发者对此有一个答案 它是用 C 编写的 但应该很容易移植 哪个CarlG has 好心
  • Malloc 和 scanf

    我对几种脚本语言相当有能力 但我最终强迫自己学习原始 C 我只是在玩一些基本的东西 现在是 I O 如何分配堆内存 在分配的内存中存储字符串 然后将其吐出 这就是我现在所拥有的 我怎样才能让它正常工作 include
  • 将嵌套的 JSON 解析为 R 中的数据帧

    我在处理非常讨厌的嵌套 JSON 时遇到了麻烦 格式是这样的 matches matchId 1 region BR participants participantId 0 teamId 200 stats winner true cha
  • Symfony2 - 仅限匿名用户而非用户访问登录和注册页面

    我有一个带有登录表单的网站 成功登录后 我被重定向到索引 但是当我单击后退按钮时 它仍然让我查看登录表单 这不太好 我希望只有匿名查看者才能访问登录表单 而已经登录的用户则无法访问 在 symfony2 中有一个简单的方法可以做到这一点吗
  • 没有可编译的体系结构(ONLY_ACTIVE_ARCH=YES,活动 arch=armv7,VALID_ARCHS=armv6 i386)

    我在构建 iOS 应用程序时遇到此错误 没有可供编译的架构 ONLY ACTIVE ARCH YES active arch armv7 VALID ARCHS armv6 i386 我在尝试使用 ACAccountTypeIdentifi
  • Java 枚举、JPA 和 Postgres 枚举 - 如何让它们一起工作?

    我们有一个带有 postgres 枚举的 postgres 数据库 我们开始将 JPA 构建到我们的应用程序中 我们还有 Java 枚举 它反映了 postgres 枚举 现在最大的问题是如何让 JPA 一方面理解 Java 枚举 另一方面
  • 多态性 - 只需两句话即可定义[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我看过其他定义和解释 但没有一个让我满意 我想看看是否有人可以在不使用任何代码或示例的情况下最多用两句话来定义多态性 我不想听到 所以你有一个人 汽车 开罐器 或者这个词是如何衍
  • 如何禁用 Android EditText 中的粘贴选项

    我有一个要求 在哪里EditText不允许粘贴 但应该允许复制 我试过setCustomSelectionActionModeCallback但它禁用了复制选项 EditText etxt EditText findViewById R i
  • 让你自己的班级具有“可比性”

    我遵循了教程 但未能成功Country class Comparable for my BST Main BinarySearchTree A new BinarySearchTree Country a new Country Roman
  • 通过curl命令在Keycloak上创建用户

    目前 我尝试通过 Keycloak 的 Admin REST API 从curl 命令创建用户 我可以将自己验证为管理员 我有一个很好的答案 但是当我想创建用户时 出现类似以下错误 404 未找到 这是我的curl命令 bin bash e
  • HTTP/2 和文件下载

    我们提供文件托管解决方案 我们的客户是最终用户 他们通过 HTTP 1 1 协议访问我们的服务器并下载文件 这些客户端基本上是软件系统或 CDN 它们使用软件库下载我们的文件 没有人类用户访问我们的系统 我们还提供使用 HTTP 1 1 范