2010-01-11 24 views
7

「keep-alive」在HTTP中存在。有人說應該使用它,但我無法得出任何結論。 所以請提供您的輸入/答案/意見,所以我可以得到一些理由,HTTP的keep-alive如何在AJAX應用程序中扮演角色

  1. 它做什麼?
  2. 應該和不應該完成的情景?
  3. 它如何使AJAX應用程序更好?
  4. 風險的DO和DONT的,如果有的話?

    謝謝大家的意見。

回答

12

首先,如果您的服務器連接使用HTTP/1.1,那麼您很可能已經使用「keep-alive」。

這是什麼?邏輯上HTTP是一種無連接協議。每個對服務器的請求/響應都會創建一個新的連接,執行其業務並刪除連接。但是在HTTP/1.1中,默認行爲是保持連接打開以供後續對服務器的請求使用。 「keep-alive」頭被添加到HTTP/1.0中以允許選擇此行爲,在HTTP/1.1中,服務器需要通過關閉連接本身和/或發送「連接關閉」頭來退出響應。

爲什麼它有益?創建連接尤其是需要認證的連接可能需要一些時間。通過重新使用現有連接,安裝和認證工作量大大減少。

它如何讓你的AJAX應用程序更好?你可能已經從中受益了。

有什麼風險?當通過共享設備建立連接時,可能代表客戶端與服務器建立連接,其他客戶端可能會重新使用該連接,但是這也可以讓其他客戶端使用服務器具有的連接爲不同的用戶進行身份驗證。

+0

它「能夠爲其他客戶使用服務器已經驗證了不同用戶的連接」 - 我不明白,一個。 HTTP是無狀態的,因此多個客戶端是否使用相同的TCP連接肯定無關緊要? – 2010-01-11 13:35:18

+0

HTTP是「邏輯上」無狀態的,但連接不是。在大多數情況下,連接是匿名的,並且不具有任何意義的狀態。然而,身份驗證通常是在連接級別完成的(例如IIS上的NTLM),一旦建立連接,多個請求將共享連接的相同身份驗證狀態。 – AnthonyWJones 2010-01-11 13:58:50

+0

**多個請求將共享連接的相同身份驗證狀態**並不意味着**使其他客戶端可以使用服務器針對不同用戶**進行身份驗證的連接,假設不同的用戶是不同的進程。連接是特定於進程的,並在操作系統級別保護。另一個進程不能**共享**已經針對不同進程進行身份驗證的相同連接。 – averasko 2014-12-21 16:59:56

1
  1. 它使TCP套接字客戶端開放的,所以你還沒有重新建立連接來發送另一個HTTP請求;
  2. Keep-alive在一行中有很多請求時提高http性能。但是,如果請求很少(如果在某段時間內沒有來自客戶端的更多請求,則服務器通常會關閉連接),但不應該使用它。
  3. 好吧,如果你的AJAX應用向服務器發送了很多請求,keep-alive會提高它的性能。
  4. 服務器端存在套接字耗盡的風險,所以服務器有權中斷保持連接的連接。
1

真的可以歸結爲性能和資源問題。

使用高(er)保持活動可減少請求的延遲。如果您在通過SSL進行連接時需要額外的握手來建立連接,則這尤其成爲一個問題。

OTOH,這將意味着有額外的服務器processes.threads坐等閒,等待後續請求或保持活動到期。這可能會佔用內存,因此會降低服務器的速度。

所以你真的需要玩弄一下,看看瀏覽器性能與服務器負載的關係。

認證(基於基本/摘要/會話)不相關 - 它是被認證的請求 - 不是套接字連接。

請注意,上次我做了一次全新的Apache安裝,它的默認設置爲5秒,以保持活躍狀態​​。對於非Ajax站點來說這是非常漫長的。

C.

相關問題