2016-11-26 200 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回答,因爲它不是。

相關問題