HTTP流水线 - 每个连接的并发响应

时间:2014-02-26 10:53:38

标签: http http-pipelining

我只是在HTTP流水线上阅读此Wikipedia article,从图中可以看出,响应可以在一个连接上同时发送。我是否误解了图表或允许这样做?

Section 8.1.2.2 of RFC 2616州:

  

服务器必须以相同的顺序发送对这些请求的响应   请求已收到。

虽然没有明确排除并发响应,但它没有提到需要确保响应不仅必须以与请求相关的正确顺序开始,而且还要以正确的顺序完成。

我也无法想象处理并发响应的实用性 - 客户如何知道接收数据应用于哪个响应?

因此,我对RFC的解释是,虽然可以在处理对第一个请求的响应时进行其他请求,但客户端不允许发送并发请求或服务器在同一连接上发送并发响应。

这是对的吗?我附上了一张图表来说明我的解释。

它可以防止我提到的问题发生,但它似乎与维基百科中的图表完全一致。

HTTP pipelining

1 个答案:

答案 0 :(得分:5)

简短回答:是的,客户端和服务器可以同时发送请求和响应。

但是,服务器无法向一个请求发送多个响应,即请求响应模式仍然适用。 RFC 2616(以及您所引用的维基百科文章)只是声明客户端不需要等待服务器的响应在同一连接上发送附加请求。因此,图表中的请求看起来很好:)。

服务器不必等待其每个响应完成,然后才能开始传输下一个响应。它可以在收到客户端请求时将响应发送给客户端。 (这导致维基百科文章中显示的图表。)

客户如何知道响应适用于哪个请求?

好吧,让我们在这里忽略整个网络延迟一分钟,并假设流水线请求或响应消息一次到达,但只有在所有这些消息都被发送后才会到达。

  1. 客户端按特定顺序发送请求(无需等待请求之间的响应)。
  2. 服务器一次接收相同顺序的请求(TCP保证)。
  3. 服务器接收第一条请求消息,对其进行处理,并将响应存储在队列中。
  4. 服务器接收第二条请求消息,对其进行处理,并将响应存储在队列中。
  5. (你明白了......)
  6. 服务器将该队列的内容发送给客户端。响应按顺序存储,因此对第一个请求的响应位于该队列的开头,然后是对第二个请求的响应,依此类推......
  7. 客户端以相同的顺序接收响应(TCP保证)并将第一个响应与其发出的第一个请求相关联,等等。
  8. 即使我们不假设我们一次收到所有消息,这仍然有效,因为TCP保证以相同的顺序接收发送的数据。

    我们也可以完全忽略网络,只看一下在服务器和客户端之间传输的消息。

    客户 - >服务器

    GET /request1.html HTTP/1.1
    Host: example.com
    ...
    
    GET /request2.html HTTP/1.1
    Host: example.com
    ...
    
    GET /request3.html HTTP/1.1
    Host: example.com
    ...
    

    服务器 - >客户端

    HTTP/1.1 200 OK
    Content-Length: 234
    ...
    
    HTTP/1.1 200 OK
    Content-Length: 123
    ...
    
    HTTP/1.1 200 OK
    Content-Length: 345
    ...
    

    关于TCP的好处是,这个特定的消息流总是看起来是一样的。您可以先发送所有请求,然后再收到回复;您可以先发送请求1,接收第一个响应,发送剩余请求,然后接收剩余的响应;您可以发送第一个和第二个请求的一部分,接收第一个响应的一部分,发送剩余的请求,接收剩余的响应;因为TCP保证保持传输消息的顺序,我们总是可以将第一个请求与第一个响应相关联,依此类推。

    我希望这能回答你的问题...