http - 对于单个请求,http/2 相对于 http 的性能优势

标签 http networking http2

对于网站而言,http/2 比 http 好得多。如果您必须进行多个 http 调用,这将非常有用。但是单次调用有什么显着的好处吗?

最佳答案

有一般注意事项和特殊注意事项。

一般的考虑是 HTTP/2 作为一个二进制协议(protocol),比 HTTP/1.1 更容易实现并且极端情况更少。 例如,HTTP/1.1 headers 需要在事先不知道 header name 长度和 header value 长度的情况下进行解析。
再比如HTTP/1.1解析器是否需要支持obsolete line folding在标题中。
HTTP/1.1 header 解析中还有许多其他极端情况会增加 HTTP/1.1 解析器的额外复杂性,而这些情况在 HTTP/2 中是不存在的,因为它是二进制协议(protocol)并且依赖于 HPack。

至于具体的考虑,有两种情况:一种是同时触发连接打开的请求,另一种是在已经打开的连接上进行的请求。

在第一种情况下,HTTP/2 相对于 HTTP/1.1 有额外的处理。
TCP 连接打开和 TLS 握手不在画面中(它们对于 HTTP/1.1 和 HTTP/2 是相同的),HTTP/2 需要在第一个请求之前发送一个前言(服务器必须回复),这需要一个一点点额外的处理。
客户端序言和请求可以一起发送;否则请求会导致额外的往返延迟,等待序言回复。

在第一次请求连接时,HTTP/2 没有 HPack 状态,因此需要构建。 HTTP/1.1 每次都必须从头开始解析 header (逐个字符)。我没有数据,但我认为 HTTP/2 在这方面略有优势。

第二种情况,在已经打开的连接上发送请求,可能对 HTTP/2 有利,因为 HPack 现在已经“缓存”了很多 header ,因此它们的解析基本上减少为仅查找- 而对于 HTTP/1.1,必须对所有请求一遍又一遍地进行 header 解析。 这也意味着后续的 HTTP/2 请求比对应的 HTTP/1.1 请求小得多:约 400 字节的 HTTP/1.1 请求被压缩为约 10 字节的 HTTP/2 请求。
对于单个请求,这种减少不会起到重要作用,因为两个请求都适合单个 MTU;但是,当发送许多请求时,游戏可能会发生变化。

数据下载(从服务器到客户端)对 HTTP/2 有轻微的开销,因为每个 DATA 帧有 9 个八位字节的开销,这在 HTTP/1.1 中可能不存在(对于已知内容长度的下载) ).最小开销通常是超过 16 KiB 数据的 9 个字节(默认的 HTTP/2 最大帧大小)。 HTTP/2 中的数据下载也受流量控制,如果客户端不够智能/不够快,无法向服务器发送 WINDOW_UPDATE 帧,这可能会导致数据下载停止。

最后要考虑的是将数据上传到服务器的请求。 将服务器配置为扩大 session 和流流量控制窗口很重要,因为默认值非常小并且会严重损害数据上传性能。

总而言之,我不认为对于网络上的单个请求有“显着”的好处。
例如在 Jetty (免责声明,我是提交者)因此在 Java 中,请求处理在我的笔记本电脑上大约为 10s-100s 微秒。
也许 HTTP/1.1 或 HTTP/2 快或慢几微秒是不同的,但这将被网络延迟完全消除,因此您不会看到使用 HTTP/1.1 发出的请求与使用 HTTP/1.1 发出的请求之间有任何区别一个在响应时间方面使用 HTTP/2 制作的。

当您说“HTTP 请求”时,您可以拥有如此多的变量,您必须对特定请求进行基准测试才能获得答案,并且如果您改变请求,如果您改变请求的数量,该答案可能会有所不同,如果你改变请求是否有内容,如果你改变响应内容的长度等。

关于http - 对于单个请求,http/2 相对于 http 的性能优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42746364/

相关文章:

java - Jersey 使用 POST 接受文件参数和字符串

http - 在 Angular 2 中使用服务中的 Json 文件

node.js - 尝试在我的 PC 上公开部署 nodejs 应用程序

android - java.io.IOException : stream was reset: REFUSED_STREAM on several devices

nginx - 如何在 Nginx 中启用 h2c?

javascript - 如何对媒体片段的任何部分进行范围请求?

c 程序未写入与显示相同的结果

networking - JMeter 连接被拒绝

node.js - 连接到副本集时的“MongoError: no mongos proxy available”

php - 使用 PHP 发出 HTTP/2 请求