我认为简而言之,您的问题的答案是“是”。
HTTP 1.1 并没有禁止打开到同一个服务器的多个 TCP 连接(实际上它建议两个),并且所有现代浏览器都这样做(事实上,大多数都这样做六个或更多)。请参阅浏览器中的最大并行 http 连接数?. 请求-响应周期可以在这些连接中的每一个上进行,并且由于各种原因,某些请求-响应周期可能比其他周期快得多。网络拥塞、请求的复杂性、处理您的请求的特定“工作人员”的速度和负载等。这意味着稍后开始的请求的请求-响应周期可能比开始的请求周期更早完成早些时候。
“服务器必须以与接收请求相同的顺序发送对请求的响应”。
该语句仅适用于流水线化多个 http 请求,即通过一个 TCP 连接发送多个请求,而不等待每个请求的响应。它不适用于打开到同一服务器的多个 TCP 连接。
通常,每个 tcp 连接同时进行的只有一个请求。客户端等待响应,当它得到响应时,可能会重用连接以获取新请求。因此,就常规(非流水线)http 而言,甚至没有“响应顺序”的概念,因为 TCP 连接上只有一个请求-响应周期。
使用流水线,可以在一个 TCP 连接上触发多个 http 请求。让响应按顺序返回很重要,因为这是响应与原始请求匹配的方式。(对请求的匹配响应可能会以不同的方式完成,例如通过在每个响应左右提供完整请求的哈希值,但这不是重点)。
此外,很高兴知道(默认)对 HTTP 管道的支持并不广泛。Chromium 项目不愿意启用它:https ://insouciant.org/tech/status-of-http-pipelining-in-chromium/ 。Firefox 仍然没有启用它。https://bugzilla.mozilla.org/show_bug.cgi?id=264354
另一方面,Apple 已经在 IOS5 的 safari 中启用了对它的支持,可能是因为移动设备上的请求-响应延迟是一个更大的问题。http://www.guypo.com/mobile/ios5-top10-performance-changes/
Android 股票浏览器也是如此。至少是 Chrome 之前的版本。http://www.guypo.com/mobile/http-pipelining-big-in-mobile/
Alex Maccaw 在您引用的关于 Spine 的帖子中写道:
对此的解决方案是将 Ajax 请求流水线化,以串行方式传输它们。
我认为在这种情况下,术语管道有点令人困惑。首先,Spine 所做的“流水线”与 HTTP 中的流水线请求完全不同。其次,我认为我将这个特殊的特性称为 Spine 请求队列。Spine 对请求进行排队,并按添加顺序处理队列中的项目。
一般来说,我认为术语“流水线”最适合用于故意使事情变得更快,而“排队”最适合用于故意使事情变慢(以防止竞争条件,或减轻排队项目处理器的负载, 例如)。