HTTP/1.1管线化和HTTP/2多路复用有什么区别?

44

是不是因为HTTP1.1要求响应按照请求的顺序返回给客户端,导致了先到先服务阻塞问题?

如果每个请求需要的时间完全相同,那么就不会有先到先服务阻塞的问题,而HTTP1.1流水线技术则可以与HTTP/2多路复用实现相同的性能表现?

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


3个回答

81

没有管线化的HTTP/1.1:在TCP连接上每个HTTP请求必须在下一个请求发出之前得到响应。

有管线化的HTTP/1.1:在TCP连接上可以立即发出每个HTTP请求,而不必等待上一个请求的响应返回。响应将以相同的顺序返回。

HTTP/2多路复用:在TCP连接上可以立即发出每个HTTP请求,而不必等待上一个响应返回。响应可能以任何顺序返回。


8
当你阅读关于HTTP v2并试图理解多路复用和流水线技术的区别时,这非常有用。谢谢! - Combine
太棒了,很高兴它能帮到你!它也帮助了我! - Elijah Lynn
1
所以响应将以任意顺序返回,而不是相同的顺序。这就是区别所在。 - Konrad
我不明白的一件事是为什么响应必须按照相同的顺序返回?“按照相同的顺序返回”是什么意思?这是否意味着只有在服务器发送完第一个请求的所有数据包并且客户端确认了服务器后,服务器才能开始发送第二个响应? - Vimniky Luo

47

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


解释了所有的事实。谢谢 :) - prasun
2
我想补充一下,大多数服务器不支持HTTP管线化,因为它很难实现,并且存在一些非常危险的安全问题。例如,通过篡改请求的Content-Length头并将多个请求放入单个请求中,可以进行HTTP走私,并使代理服务器错误地返回另一个用户的响应给您(因为请求顺序必须保持,而您只是将2个请求放入单个请求中)。这种攻击需要良好的时机,但当然不是不可能的.. 无论如何 :) - yakya
@sotn请详细说明。这是真的吗?谁在篡改? - Tuntable
@Tuntable https://i.blackhat.com/USA-19/Wednesday/us-19-Kettle-HTTP-Desync-Attacks-Smashing-Into-The-Cell-Next-Door.pdf - Amey

2
我认为,要详细说明一下,两者都提供类似的性能改进。
然而,流水线(或双缓冲)受到错误的代理和有时错误的服务器的阻碍。因此,浏览器停止支持它。
解决方案是使用全新的协议HTTP/2。这个协议有一些额外的特性,如乱序返回、头部压缩和服务器推送,但不清楚它们提供了多少改进。关键问题是错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接