我很难理解当多个请求并行发送(获取响应之前)时HTTP如何工作。有两种情况:在获得响应之前发出多个请求
1)与Connection: Keep-Alive
。
根据HTTP spec:
支持持久连接可以“管道”,其 请求(即,发送多个请求,而无需等待每个响应 )的客户端。一个服务器必须发送它的响应到这些请求的 相同的顺序,收到请求。
这种方式似乎很难实施和维护。服务器必须跟踪请求的顺序,并且必须以正确的顺序响应。不仅实现起来可能并不容易,而且还会带来性能上的提升:快速请求必须等到处理缓慢的请求时才会处理,如果这些请求稍后发出的话。
另外,如果我们正在讨论负载平衡器,那么代理必须跟踪哪个请求被发送到哪个服务器,所以当他们回来时它可以将它们放入队列并按顺序响应。那么为什么不首先这样做呢?即听起来更自然也更容易,客户端放置(例如)ID
标题,服务器处理请求并响应相同的ID
标题,以便客户端可以将请求与响应匹配。这实现起来更容易,并且不会引起排队请求的问题(如果需要的话,由客户端来跟踪请求的顺序)。
所以问题是:指定流水线的原因是什么?
2)没有Connection: Keep-Alive
。
我找不到任何有关该案例的信息。假设客户端发出两个请求A和B.如果没有保持活动状态,服务器将在处理请求后关闭连接。这显然引入了竞争条件。那么它应该如何表现?它应该放弃第二个请求吗?
感谢您的回复。 ** 1)**但在HTTP1.1中正式添加了keep-alive。 1999年不是吗?协议的设计者应该已经意识到异步服务器。但我可能是错的。 ** 2)**如果客户端打开单独的连接,则您有单独的连接。当客户通过同一连接发出两个请求时,我正在谈论一种不正常的情况。应该如何处理? – freakish
我对时间表不太确定,但1999年对于非阻塞服务器来说似乎相当早。我为2)添加了一些细节, –
这听起来很合理。我会接受这个答案。 :) – freakish