關於HTTP協議中的KeepAlive屬性


首先就看一下KeepAlive出現的原因吧:

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

KeepAlive的工作原理:
在HTTP1.0和HTTP1.1協議中都有對KeepAlive的支持。其中HTTP1.0需要在request中增加“Connection: keep-alive” header才能夠支持,而HTTP1.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”就認爲是一個長連接請求,其將在response的header中也增加“Connection: keep-alive”。同是不會關閉已建立的tcp連接。
c)Client收到Web Server的response中包含“Connection: keep-alive”,就認爲是一個長連接,不close tcp連接。並用該tcp連接再發送request。(跳轉到a))
HTTP1.1 KeepAlive支持的數據交互流程如下:
a)Client發出request,其中該request的HTTP版本號爲1.1。
b)Web Server收到request中的HTTP協議爲1.1就認爲是一個長連接請求,其將在response的header中也增加“Connection: keep-alive”。同是不會關閉已建立的tcp連接。
c)Client收到Web Server的response中包含“Connection: keep-alive”,就認爲是一個長連接,不close tcp連接。並用該tcp連接再發送request。(跳轉到a))

關於KeepAlive的分析:
現在的一些服務器都可以設置KeepAlive是否開啓,以及KeepAlive的超時時間,服務器支持的KeepAlive數量(數量一般不會很大,否則會對服務器產生很大的壓力)。
那麼我們考慮3種情況:
  1、用戶瀏覽一個網頁時,除了網頁本身外,還引用了多個 javascript 文件,多個 css 文件,多個圖片文件,並且這些文件都在同一個 HTTP 服務器上。
  2、用戶瀏覽一個網頁時,除了網頁本身外,還引用一個 javascript 文件,一個圖片文件。
  3、用戶瀏覽的是一個動態網頁,由程序即時生成內容,並且不引用其他內容。
對於上面3中情況,1 最適合打開 KeepAlive ,2 隨意,3 最適合關閉 KeepAlive
打 開 KeepAlive 後,意味着每次用戶完成全部訪問後,都要保持一定時間後才關閉會關閉 TCP 連接,那麼在關閉連接之前,必然會有一個服務器進程對應於該用戶而不能處理其他用戶,假設 KeepAlive 的超時時間爲 10 秒種,服務器每秒處理 50 個獨立用戶訪問,那麼系統中 Apache 的總進程數就是 10 * 50 = 500 個,如果一個進程佔用 4M 內存,那麼總共會消耗 2G 內存,所以可以看出,在這種配置中,相當消耗內存,但好處是系統只處理了 50次 TCP 的握手和關閉操作。

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

原文鏈接:http://hi.baidu.com/marktian/item/45a40647ed519b36fa8960c7?qq-pf-to=pcqq.group

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