HTTP/1.1 流水线和 HTTP/2 多路复用有啥区别?

Posted

技术标签:

【中文标题】HTTP/1.1 流水线和 HTTP/2 多路复用有啥区别?【英文标题】:What is the difference between HTTP/1.1 pipelining and HTTP/2 multiplexing?HTTP/1.1 流水线和 HTTP/2 多路复用有什么区别? 【发布时间】:2016-04-01 10:39:00 【问题描述】:

是不是因为它要求按照请求的顺序向客户端做出响应,导致 HTTP 1.1 中的行头阻塞问题?

如果每个请求所用的时间完全相同,那么就不会有首行阻塞和 HTTP 1.1 流水线,并且会像 HTTP/2 多路复用一样执行?

(假设 HTTP/2 请求中没有请求优先级,忽略 HTTP/2 的其他变化,例如标头压缩、二进制等)

【问题讨论】:

另见How does HTTP2 solve Head of Line blocking (HOL) issue和What does multiplexing mean in HTTP/2 【参考方案1】:

HTTP/1.1 流水线仍需要按照请求的顺序完整返回请求。

HTTP/2 允许将请求响应拆分为块并以混合方式返回,从而避免行头阻塞。

此外,HTTP/1.1 管道从未真正起飞,浏览器和服务器支持有限(请参阅:https://en.m.wikipedia.org/wiki/HTTP_pipelining)。

但是是的,理论上它们是相似的,因此具有相似的性能优势。 HTTP/2 只是它的一个更好、功能更全、受支持程度更高的版本 - 以及您提到的其他好处。

有关 HTTP/2 多路复用的更深入讨论,另请参阅我的回答:What does multiplexing mean in HTTP/2

【讨论】:

解释所有事实。谢谢:) 我想补充一点,大多数服务器不支持 HTTP 管道,因为它很难实现,并且存在一些非常危险的安全问题。例如,http 走私可以通过篡改请求的 Content-Length 头并将多个请求放在一个请求中,并通过让代理服务器返回另一个用户的响应来使代理服务器行为错误(因为要保持请求顺序)并且您只需将 2 个请求放在一个请求中)。这种攻击虽然需要很好的时机,但当然不是不可能的......无论如何:) @sotn 请详细说明。这是真的吗?谁在篡改? @Tuntable i.blackhat.com/USA-19/Wednesday/…【参考方案2】:

没有流水线的 HTTP/1.1: 必须先响应 TCP 连接上的每个 HTTP 请求,然后才能发出下一个请求。

带有管道的 HTTP/1.1: 每个通过 TCP 连接的 HTTP 请求都可以立即发出,而无需等待前一个请求的响应返回。响应将以相同的顺序返回。

HTTP/2 多路复用: 通过 TCP 连接的每个 HTTP 请求都可以立即发出,而无需等待先前的响应返回。响应可以按任何顺序返回。

【讨论】:

当您阅读有关 HTTP v2 并尝试了解多路复用和流水线之间的区别时,这非常有用。谢谢大佬! 太棒了,很高兴它帮助了你!它也帮助了我! 因此响应将以任何顺序而不是相同的顺序返回。这就是区别。 我不明白的一件事是为什么响应必须以相同的顺序返回? “以相同的顺序回来”是什么意思。是不是意味着只有在服务器发送了第一个请求的所有数据包并且客户端确认服务器之后,服务器才能开始发送第二个响应?【参考方案3】:

我想详细说明一下,两者都提供了类似的性能改进。

但是,流水线(或双缓冲)受到有问题的代理和有时有问题的服务器的阻碍。所以浏览器停止支持它。

解决方案是使用全新的协议 HTTP/2。这有一些额外的功能,例如乱序返回、标头压缩和服务器推送,但尚不清楚它们提供了多少改进。关键问题是错误。

【讨论】:

以上是关于HTTP/1.1 流水线和 HTTP/2 多路复用有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OkHttp 上进行多路复用?

HTTP 2 vs HTTP 1.1

hdl 中的管道多路复用器

http/2.0与http/1.1的区别

HTTP/2和HTTP/1.1的比较

为啥我的 HTTP/2 流比 HTTP/1.1 和 HTTPS 慢