【发布时间】:2017-08-02 10:47:44
【问题描述】:
http/2 对于网站来说比 http 好得多。如果您必须进行多个 http 调用,这将非常有帮助。但是一次调用有什么显着的好处吗?
【问题讨论】:
标签: http networking http2
http/2 对于网站来说比 http 好得多。如果您必须进行多个 http 调用,这将非常有帮助。但是一次调用有什么显着的好处吗?
【问题讨论】:
标签: http networking http2
我认为在单个请求的情况下不会有很大的不同,因为 HTTP/2 和 HTTP/1.1 都必须完成相同的工作:
因此,在这两种情况下,您都会有相同的延迟。
然而,HTTP/2 使用压缩的 HTTP 标头,如果标头数据很大,或者例如使用 POST 请求,这可能会增加一点优势。
HTTP/2 的主要优点之一是可以一起发送多个请求,从而减少甚至消除每个请求/响应之间的延迟(在同一连接上),因此在多个文件时有更大的增益(或其他数据)是必需的(例如加载页面,并检索 .css、.js 和图像文件)。
【讨论】:
有一般考虑和具体考虑。
一般的考虑是 HTTP/2 作为一个二进制协议,比 HTTP/1.1 更容易实现并且具有更少的极端情况。
例如,HTTP/1.1 标头需要在事先不知道标头名称长度和标头值长度的情况下进行解析。
另一个例子是 HTTP/1.1 解析器是否需要在 headers 中支持obsolete line folding。
在 HTTP/1.1 标头解析中还有许多其他极端情况,它们为 HTTP/1.1 解析器增加了额外的复杂性,而在 HTTP/2 中却没有,因为它是一个二进制协议并且依赖于 HPack。
至于具体的考虑,有两种情况:同时触发连接打开的请求,以及在已经打开的连接上发出的请求。
在第一种情况下,HTTP/2 对 HTTP/1.1 有额外的处理。
TCP 连接打开和 TLS 握手不在图片中(对于 HTTP/1.1 和 HTTP/2 它们是相同的),HTTP/2 需要在第一个请求之前发送一个前言(服务器必须回复),这需要一个一点点额外的处理。
客户端前言和请求可以一起发送;否则请求会产生额外的往返延迟,等待序言回复。
在连接上的第一个请求时,HTTP/2 没有 HPack 状态,因此需要构建。 HTTP/1.1 每次都必须从头开始解析标头(逐个字符)。我没有数据,但我认为 HTTP/2 在这里略有优势。
第二种情况,在已经打开的连接上发送请求,可能对 HTTP/2 有利,因为 HPack 现在已经“缓存”了很多标头,因此它们的解析基本上简化为只是查找- 而对于 HTTP/1.1,必须对所有请求反复进行标头解析。
这也意味着后续的 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 帧发送到服务器,这可能会停止数据下载。
最后一个考虑是关于将数据上传到服务器的请求。 将服务器配置为放大会话和流流控制窗口很重要,因为默认值非常小,并且会对数据上传性能造成很大影响。
总之,我认为网络上的单个请求不会有“显着”的好处。
例如,在Jetty(免责声明,我是提交者)中,因此在 Java 中,我的笔记本电脑上的请求处理时间约为 10s-100s 微秒。
也许 HTTP/1.1 或 HTTP/2 快或慢几微秒之间存在差异,但这将被网络延迟完全消除,因此您不会看到使用 HTTP/1.1 发出的请求和在响应时间方面使用 HTTP/2 制作的一种。
当您说“HTTP 请求”时,您可以有很多变量,您必须对特定请求进行基准测试才能获得答案,如果您改变请求,如果您改变请求的数量,那么答案可能会有所不同,如果你改变请求是否有内容,如果你改变响应内容长度等等。
【讨论】: