2016-11-26 118 views
0

我目前正在研究支持保持连接的多线程代理服务器。在处理来自Firefox浏览器的请求时,我看到一些奇怪的问题。我使用localhost:10001/http://url连接到本地代理,并且可以访问此主机上的所有链接。过程如下。 1.创建一个套接字绑定到端口10001 2.接受连接,并且如果客户端连接fork() 3.继续处理客户端请求作为持久连接。HTTP代理服务器保持活动连接支持

现在的问题是,当我在Firefox中打开一个新的标签具有不同的主机访问第二URL使用本地主机:10001/http://url2,奇怪的是,该请求到达第一次连接期间创建了客户端套接字连接。我最初认为这可能是由于我的代码,但后来我试图用telnet做同样的事情,所有的新连接都会创建一个单独的进程。是否有任何具体的设置,使Firefox浏览器做到这一点?

回答

1

HTTP keep-alive是一种为多个请求重新使用底层TCP连接的方式,因此可以跳过始终创建新TCP连接的开销。由于连接的目标始终与您的情况相同,因此浏览器重用相同的TCP连接是有意义的。与telnet的比较存在缺陷,因为在telnet中,您始终都会进行新的TCP连接。

如果使用HTTP保持连接状态由HTTP版本的连接标头以及服务器和客户端的行为来指定。服务器和客户端都可以决定在请求完成后随时关闭闲置连接,即在请求完成后不需要保持打开状态。此外,他们可以通过使用Connection: keep-alive HTTP标头表示他们希望打开连接,或者希望在Connection: close的请求后关闭连接。这些头文件具有取决于HTTP版本的默认值,即,除非明确指定,否则在HTTP/1.1关闭时使用HTTP/1.1保持活动状态。

除此之外,“代理”您正在使用像http://proxy/real-url使用的URL的实施是不是一个真正的HTTP代理。一个真正的HTTP代理将在浏览器中被配置为代理,并且您使用的URL将保持不变,这也意味着代理不需要重写URL。更糟糕的是,你的代理想法有效地合并了同一来源内的所有主机(即,源代码是代理),因此有效地禁用了浏览器的主要安全概念:same-origin policy。这意味着,例如,一些流氓广告服务器将与您共享的实现与eBay的来源,从而可以得到访问eBay的饼干并劫持了会议,并滥用其身份被盗

+0

感谢。但是我的代理需要同时为多个连接提供服务。我为一个请求使用HTTP/1.1保持活动状态,并且它仍在处理中,但现在我也想要支持一个也是持久化的新请求。是否有解决方法,我可以阻止浏览器使用现有的TCP连接并创建一个新的.. –

+0

@Embed_Programmer:浏览器通常只会重用现有的连接,如果它是空闲的,即这个连接的请求是完成。在任何其他情况下,它将打开新的连接或等待任何现有的闲置。如果您发现浏览器发送新的请求,而您认为现有的请求没有完成,那么可能您的代码确定请求结束是错误的。也可能是浏览器使用HTTP流水线技术,它允许同时打开同一连接上的多个请求。您可以通过仅发送HTTP/1.0响应来解决此问题。 –

+0

Thanks.You是正确的我通过URL使用代理是不正确的。我现在在浏览器中配置了代理服务器,并且一些困扰我的错误已经得到纠正。谢谢你的帮助 –

0

HTTP persistent connection也与代理一起使用,不仅与目的地。

对于Firefox,您可以尝试通过将network.http.proxy.version设置为1.0来改变代理的行为。但是你必须增强你的代理(并且可能重新思考它的内部工作)才能够处理这些重用的连接。我相信它不仅限于Firefox。

另外请确保您的代理不会用HTTP/1.1回答,因为它不是。