2011-09-05 49 views
9

我使用Firefox,但我想知道瀏覽器如何決定這一般。在什麼情況下,我的瀏覽器會嘗試重複使用TCP連接來處理多個請求?

看來,當我兩次訪問同一URL在很短的時間量,我的瀏覽器嘗試重新使用這兩個請求的TCP相同的連接(這就是所謂的保活)。然而,當我訪問兩個不同的網址(但仍由同一個服務器提供服務),瀏覽器有時決定開闢爲每個請求一個新的連接。顯然,瀏覽器不使用每URL連接策略。

我問這個,因爲我想實現使用長輪詢的Web服務。我可以想象,用戶可能想要在同一瀏覽器的多個選項卡中打開此服務。但是,保持活動狀態下,第二個長輪詢請求不會被髮送,直到第一個長輪詢請求完成(至少在Firefox中),因爲瀏覽器正試圖將它們都推入同一個套接字中,而當我設計了這項服務。即使瀏覽器實現管道,我也無法在迴應第一個請求之前響應第二個請求,因爲HTTP要求我按順序完成響應。

回答

6

使用HTTP/1.1時,默認情況下,TCP連接保持打開狀態以供重用。這比爲每個請求啓動一個新連接的性能要好。連接可以重複使用但是連接可以隨時由任何一方關閉。

你應該閱讀HTTP1.1和持久連接的部分。

在你的情況下,它甚至沒有使用HTTP流水線(不廣泛支持),因爲下一個請求發送後第一個響應。

瀏覽器有一個連接池,並按照主機名重新使用它。一般來說,瀏覽器不應該爲多個主機名重複使用單個連接,即使這些主機名實際上解析爲相同的IP地址。

大多數瀏覽器允許用戶配置或覆蓋每個服務器的持久連接的數量;大多數現代瀏覽器默認爲六個。如果Firefox真的是阻止第二個請求,因爲已經有連接處於活動狀態,這是Firefox中的一個錯誤,應該在他們的錯誤跟蹤系統中提交。但是如果存在這樣的錯誤,我認爲你會看到很多網站被破壞。

+0

雖然我告訴Firefox來的請求發送到服務器第二次,我相信它,因爲它要等待第一個請求的完成,以便它可以重新使用該連接實際上並沒有發出一個請求。這是一個功能,而不是錯誤,對嗎? – Mark

+0

也許對於相同的URL,它會嘗試使用相同的連接,但對於URL,它會嘗試在池中選擇另一個連接? – Mark

+0

如果您的測試是向同一個URL發送2個「併發」HTTP請求,您可以將其看作「序列化」或通過2個不同的TCP連接發送。但是你並沒有看到它們流水線化。會發生什麼,現在是執行dependend.E.g。瀏覽器可能會選擇重用池中的連接,或通過新連接發送第二個請求。兩種方法都是正確的,因爲HTTP是一種「無狀態」協議。如果您的實現取決於這些細節,那麼恕我直言,有一個缺陷在你的設計中。可能你應該寫更多關於你想要達到的目標。 – Cratylus

相關問題