持久性HTTP客户端一次可以发送多个请求吗?

时间:2011-11-06 16:05:24

标签: http sockets connection

我正在编写HTTP代理服务器,我注意到许多客户端使用“Connection:Keep-Alive”标头来保持持久连接。客户端是否有可能在服务器处理第一个HTTP请求之前发送另一个HTTP请求?

例如,客户端发送“GET / HTTP / 1.1”,但在服务器有机会响应之前,客户端发送“GET /favicon.ico HTTP / 1.1”。那可能吗?或者客户端会在发送第二个请求之前暂停响应吗?

此外,在使用持久连接时,是否可以安全地假设通过该连接的所有请求都具有相同的“Host:”标头?

3 个答案:

答案 0 :(得分:5)

“另外,当使用持久连接时,假设通过该连接的所有请求都具有相同的”Host:“标题是否安全?”

我不这么认为,请参阅HTTPbis P1, Section 2.2

  

收件人必须孤立地考虑连接中的每条消息;因为HTTP是无状态协议,所以不能假设同一连接上的两个请求来自同一客户端或共享任何其他公共属性。特别是,中介可能会将来自不同客户端的请求混合到一个服务器连接中。请注意,某些现有的HTTP扩展(例如,[RFC4559])违反了此要求,从而可能导致互操作性和安全性问题。

答案 1 :(得分:4)

是的,客户端可以管道请求。 (见http://en.wikipedia.org/wiki/HTTP_pipelining)。

转动您的上一个问题...客户端假设单个管道将为多个主机提供请求是不安全的。可能没有直接在Host:标题上解决您的问题的规范,但可以肯定它们将是相同的。

答案 2 :(得分:1)

关于第一个问题:

  

客户端是否有可能在服务器处理第一个HTTP请求之前发送另一个HTTP请求?

我相信是的,它是可能的(也许我错了,我记得几年前已经阅读过;最终的答案是在HTTP协议规范中)。但我不明白你为什么这么问。此外,客户端可以同时打开几个TCP连接到同一个HTTP服务器。当然,你有许多同时发生的客户。

关于第二个问题

  

此外,在使用持久连接时,是否可以安全地假设通过该连接的所有请求都具有相同的“Host:”标头?

我相信情况通常如此,但我不认为这是肯定的。我可以想象一些聪明的HTTP客户端,认识到两个具有不同Host:头的URL共享相同的IP,可以重用相同的连接。

但我不明白你为什么这么问。已经发明了持久的HTTP连接以最小化TCP连接,这是非常昂贵的,并且您要问的两个问题是极端的。也许很少有HTTP客户端正在执行您今天所描述的内容。

你应该严格对待你所发送的内容(w.r.t。标准一致性),但对你接受的内容有灵活性。