对于网站而言,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/