HTTP/2 下载速度比使用 HttpClient 的 HTTP/1.1 慢很多

Posted

技术标签:

【中文标题】HTTP/2 下载速度比使用 HttpClient 的 HTTP/1.1 慢很多【英文标题】:HTTP/2 download speed is much slower than HTTP/1.1 with HttpClient 【发布时间】:2020-12-28 08:13:56 【问题描述】:

当我以 HTTP/2 下载文件时,速度被锁定为 16 mbps。 HTTP/1.1 - 90 mbps 的速度。代码很简单:

var url = "https://firebasestorage.googleapis.com/v0/b/xxxxxxxxxx/o/xxx.xxx?alt=media&token=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx";
using var client = new HttpClient()  DefaultRequestVersion = new Version(2, 0) ;
using var response = await client.GetAsync(url);

我在我的 PC 和笔记本电脑(均为 Windows 10)上使用不同的 ISP 和支持 HTTP/2 的其他来源对其进行了测试 - 行为相同。

如果我通过任何浏览器下载此文件 - HTTP/2 速度与 HTTP/1.1 速度相同。虽然 Edge 显示“http/2.0+quic/46”协议。

另外我把这个代码给了我在另一个城市的朋友,他没有这样的问题。

这个问题的原因是什么? ISP 能否以某种方式减慢 HTTP/2 流量?

UPD:.NET Core 3.1 和 .NET 5 存在同样的问题

【问题讨论】:

你用其他网站测试过吗?或者它是特定于这个的? 两个 HTTP 版本的二进制文件下载速度必须相同。 ISP 在技术上可以使用 ALG 来限制速度,但我不知道它为什么会这样做。尝试不同的 Web 服务器。顺便说一句,如果您将response 读作Stream,请考虑HttpCompletionOption.ResponseHeadersReadConfigureAwait(false)。如果是常规(非二进制文件)HTTP 流量,请设置 GZip Accept-Encoding 支持。出于测试目的,您可以设置类似于 Web 浏览器的请求标头。 @mjwills 是的,我尝试了其他网站以及 GCE 上使用 nginx 的自己的网站 @aepot HttpCompletionOption.ResponseHeadersRead 和阅读为Stream 也没有帮助。是的,我尝试设置浏览器在请求中发送的所有标头(包括 Accept-Encoding) - 没有 Also I gave this code to my friend in another city and he doesn't have such problem.那很可能和你的ISP有关。 【参考方案1】:

我遇到了同样的问题并被定向到this issue。

这似乎是罪魁祸首。没有修复,但看起来他们是tracking this for .NET 6 later this year。

最好的解决方法似乎是对大于 64 KB 的下载使用单独的 HTTP/1.1 客户端实例。

【讨论】:

以上是关于HTTP/2 下载速度比使用 HttpClient 的 HTTP/1.1 慢很多的主要内容,如果未能解决你的问题,请参考以下文章

使用 HttpClient、Jame 的 Mime4j 和 HttpPost 发布方法的上传速度慢

HTTP/2:如何提升网络速度?

是否可以使用 Apache HTTPClient 4.2.5 发出 HTTP/2 请求?

与 HTTP/1.1 相比,HTTP/2 如何提供更快的浏览速度?

Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)

如何使 .net HttpClient 使用 http 2.0?