http協議下的keep alive

1.keep-alive

   linux內核配置有一項tcp_keepalive_time,即tcp的保活定時器。當網絡上兩個建立連接的進程都沒有數據向對方發送的時候,tcp會隔段時間發送一次保活數據,以保持連接,間隔時間就是tcp_keepalive_time設置的。默認是7200秒。在優化web服務器時,應該將數值設置的小一點,當客戶關機,崩潰的時候可以更快的發現,而沒必要等待2個小時才察覺,這樣可以更快的清理無效的連接。

   http的keepalive : 默認http服務器在完成一個http響應以後會關閉這個連接,設置此項以後會保活一段時間,繼續用此連接繼續接受客戶的請求。這樣有效的減少了系統建立tcp連接的開銷,但是保持連接也會佔用系統資源,使用的時候要權衡一下,一般小文件多的站應該用,大文件的下載沒必要。

2.keep-alive出現的原因:

當一個客戶端向服務器發送http請求時,兩者之間會建立一個tcp連接,然後服務器發回響應信息同時關閉連接。如果請求的的頁面中含有別的資源連接,比如圖片、flsah等,就會再次創建連接。keep-alive的作用就是在第一次創建連接時,服務器會把這個tcp連接保持一段時間(服務器端會有一個keepaliveTime的最大時間,超過時間就斷開連接)。這樣就不會頻繁的去建立tcp連接,同一次請求中的信息傳遞都可以使用同一個tcp連接。

   在HTTP1.0和HTTP1.1協議中都有對KeepAlive的支持。其中HTTP1.0需要在request中增加“Connection: keep-alive” header才能夠支持,而HTTP1.1默認支持。


  1>HTTP1.0 KeepAlive支持的數據交互流程如下:

    a)Client發出request,其中該request的HTTP版本號爲1.0。同是在request中包含一個header:“Connection: keep-alive”。

       b)Web Server收到request中的HTTP協議爲1.0及“Connection: keep-alive”就認爲是一個長連接請求,其將在responseheader中也增加“Connection: keep-alive”。同是不會關閉已建立的tcp連接。

       c)Client收到Web Serverresponse中包含“Connection: keep-alive”,就認爲是一個長連接,不close tcp連接。並用該tcp連接再發送request。(跳轉到a)

   2>HTTP1.1 KeepAlive支持的數據交互流程如下:

      a)Client發出request,其中該requestHTTP版本號爲1.1

      b)Web Server收到request中的HTTP協議爲1.1就認爲是一個長連接請求,其將在responseheader中也增加“Connection: keep-alive”。同是不會關閉已建立的tcp連接。

      c)Client收到Web Serverresponse中包含“Connection: keep-alive”,就認爲是一個長連接,不close tcp連接。並用該tcp連接再發送request。(跳轉到a)

 3.關於keep-alive的分析:

    現在的一些服務器都可以設置keep-alive是否開啓,以及keep-alive的超時時間,服務器支持的keep-alive數量(數量一般不會很大,否則會對服務器產生很大的壓力)。

那麼我們考慮3種情況:

  1、用戶瀏覽一個網頁時,除了網頁本身外,還引用了多個javascript 文件,多個css 文件,多個圖片文件,並且這些文件都在同一個HTTP 服務器上。

  2、用戶瀏覽一個網頁時,除了網頁本身外,還引用一個 javascript 文件,一個圖片文件。

  3、用戶瀏覽的是一個動態網頁,由程序即時生成內容,並且不引用其他內容。

  對於上面3種情況,最適合打開keep-alive 隨意,最適合關閉keep-alive

打開keep-alive 後,意味着每次用戶完成全部訪問後,都要保持一定時間後才關閉會關TCP 連接,那麼在關閉連接之前,必然會有一個服務器進程對應於該用戶而不能處理其他用戶,假設keep-alive 的超時時間爲10 秒種,服務器每秒處理50 個獨立用戶訪問,那麼系統Apache 的總進程數就是 10 * 50 = 500 個,如果一個進程佔用 4M 內存,那麼總共會消耗 2G 內存,所以可以看出,在這種配置中,相當消耗內存,但好處是系統只處理了50TCP 的握手和關閉操作。

     如果關閉 keep-alive,如果還是每秒50個用戶訪問,如果用戶每次連續的請求數爲3個,那麼Apache 的總進程數就是 50 * 3 = 150 個,如果還是每個進程佔用 4M 內存,那麼總的內存消耗爲 600M,這種配置能節省大量內存,但是,系統處理了150 TCP 的握手和關閉的操作,因此又會多消耗一些CPU 資源。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章