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 資源。
————————————————
版權聲明:本文為CSDN博主「H-G-Y」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/go_to_learn/article/details/8147673
網站無須三方授權 · 安全穩定、維護方便