我目前正在开发支持保持连接的多线程代理服务器。我在处理来自firefox浏览器的请求时看到了一些奇怪的问题。我使用localhost:10001 / http://url连接到我的本地代理,我可以访问该主机上的所有链接。过程如下。 1.创建一个套接字将其绑定到端口10001 2.接受连接并且如果客户端连接了fork() 3.继续将客户端请求作为持久连接进行处理。
现在的问题是,当我在firefox中打开一个新选项卡以使用localhost:10001 / http://url2访问具有不同主机的第二个URL时,奇怪的是该请求转到我创建的客户端套接字连接在第一次连接时。我最初认为这可能是由于我的代码,但后来我尝试使用telnet做同样的事情,所有新的连接将创建一个单独的进程。是否有任何特定设置使firefox浏览器执行此操作?
答案 0 :(得分:1)
HTTP keep-alive是一种为多个请求重用底层TCP连接的方法,这样一来就可以省去创建新TCP连接的开销。由于在您的情况下连接的目标始终相同,因此浏览器重用相同的TCP连接是有意义的。与telnet的比较是有缺陷的,因为使用telnet你会一直进行新的TCP连接。
如果使用HTTP keep-alive,则由HTTP版本的Connection标头以及服务器和客户端的行为指定。服务器和客户端都可以在请求完成后随时决定关闭空闲连接,即在请求完成后不要求它们保持打开状态。此外,他们可以通过使用Connection: keep-alive
HTTP标头或他们希望在Connection: close
请求后关闭来表示他们希望打开连接。这些标头具有默认值,具体取决于HTTP版本,即,除非明确指定,否则使用HTTP / 1.1时保持活动状态为HTTP / 1.1。
除了"代理"您使用URL实现http://proxy/real-url
并不是真正的HTTP代理。真正的HTTP代理将被配置为浏览器内的代理,并且您使用的URL将保持不变,这也意味着代理不需要进行URL重写。更糟糕的是,您对代理的想法有效地合并了同一源内的所有主机(即源是代理),从而有效地禁用了浏览器的主要安全概念:same-origin policy。这意味着,例如,某些流氓广告服务器将与您的实施共享ebay的来源,因此可以访问ebay cookie并劫持会话并滥用它进行身份盗窃
答案 1 :(得分:0)
HTTP persistent connection也与代理一起使用,不仅与目的地一起使用。
对于Firefox,您可以尝试通过将network.http.proxy.version设置为1.0
来改变代理的行为。但是你必须增强代理(并且可能完全重新思考其内部工作)以便能够处理这些重用的连接。我确信它不仅限于Firefox。
还要确保您的代理不会使用HTTP / 1.1回答,因为它不是。