HTTP管线化 - 每个连接的并发响应

3
我刚刚阅读了关于HTTP pipelining的维基百科文章,从图表中可以看出响应可以在一个连接上同时发送。我是否误解了图表或者这是被允许的? RFC 2616第8.1.2.2节声明:
“服务器必须按照请求接收的顺序发送其响应。”
虽然这没有明确排除并发响应,但它没有提到需要确保响应不仅与请求的顺序正确地开始,而且还正确地结束。
我也无法想象如何处理并发响应的实际情况 - 客户端如何知道接收到的数据适用于哪个响应?
因此,我的解释是,在处理第一个请求的响应时可以发出其他请求,但客户端不能在同一连接上发送并发请求,服务器也不能发送并发响应。
这样说是否正确? 我在下面附上了一张图表以说明我的解释。
它可以防止我提到的问题发生,但似乎与维基百科中的图表并不完全一致。

HTTP pipelining

1个回答

5
简短回答:是的,客户端和服务器可以同时发送请求和响应。
然而,一个服务器不能向一个请求发送多个响应,即请求-响应模式仍然适用。RFC 2616(和您所引用的维基百科文章)只是声明,客户端不需要等待服务器的响应即可在同一连接上发送其他请求。因此,您图表中的请求看起来很好 :)。
但是,服务器不必等待每个响应完成后才能开始传输下一个响应。它可以在收到客户端请求时立即向客户端发送响应。(这导致了维基百科文章中所示的图表。)
客户端如何知道哪个响应适用于哪个请求?
好吧,让我们先忽略整个网络延迟问题,并假设流水线请求或响应消息一次性到达,但只有在所有消息都发送后才到达。
1. 客户端按一定顺序发送其请求(在请求之间不等待响应)。 2. 服务器以相同的顺序接收请求(TCP保证这一点)。 3. 服务器获取第一个请求消息,处理它,并将响应存储在队列中。 4. 服务器获取第二个请求消息,处理它,并将响应存储在队列中。 5. (你懂的...) 6. 服务器向客户端发送该队列的内容。响应按顺序存储,因此第一个请求的响应位于该队列的开头,其次是第二个请求的响应,依此类推... 7. 客户端按相同的顺序接收响应(TCP保证这一点),并将第一个响应与其发出的第一个请求相关联,依此类推。
即使我们不假设一次接收所有消息,这仍然有效,因为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保证了传输消息的顺序,所以我们总是能将第一个请求与第一个响应等等联系起来。希望这回答了你的问题...

我明白了 - 这是一个视角的问题: 从应用程序的角度来看,响应不可以同时而非依次地发送到缓冲区。然而,在传输层面上,由于TCP是可靠且面向连接的,请求将以与从服务器的应用层发送相同的顺序到达客户端的应用层 - 尽管单个数据包可能以不同的顺序发送。 回答了我的问题,即响应不能从应用层同时发送 - 谢谢! - SlappyTheFish

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