KeepAlive出現(xiàn)的原因:
當(dāng)一個客戶端向服務(wù)器發(fā)送http請求時,兩者之間會建立一個tcp連接,然后服務(wù)器發(fā)回響應(yīng)信息同時關(guān)閉連接。如果請求的的頁面中含有別的資源連接,比如圖片、flsah等,就會再次創(chuàng)建連接。KeepAlive的作用就是在第一次創(chuàng)建連接時,服務(wù)器會把這個tcp連接保持一段時間(服務(wù)器端會有一個keepaliveTime的最大時間,超過時間就斷開連接)。這樣就不會頻繁的去建立tcp連接,同一次請求中的信息傳遞都可以使用同一個tcp連接。
KeepAlive的工作原理:
在HTTP1.0和HTTP1.1協(xié)議中都有對KeepAlive的支持。其中HTTP1.0需要在request中增加“Connection: keep-alive” header才能夠支持,而HTTP1.1默認(rèn)支持。

HTTP1.0 KeepAlive支持的數(shù)據(jù)交互流程如下:
a)Client發(fā)出request,其中該request的HTTP版本號為1.0。同是在request中包含一個header:“Connection: keep-alive”。
b)Web Server收到request中的HTTP協(xié)議為1.0及“Connection: keep-alive”就認(rèn)為是一個長連接請求,其將在response的header中也增加“Connection: keep-alive”。同是不會關(guān)閉已建立的tcp連接。
c)Client收到Web Server的response中包含“Connection: keep-alive”,就認(rèn)為是一個長連接,不close tcp連接。并用該tcp連接再發(fā)送request。(跳轉(zhuǎn)到a))
HTTP1.1 KeepAlive支持的數(shù)據(jù)交互流程如下:
a)Client發(fā)出request,其中該request的HTTP版本號為1.1。
b)Web Server收到request中的HTTP協(xié)議為1.1就認(rèn)為是一個長連接請求,其將在response的header中也增加“Connection: keep-alive”。同是不會關(guān)閉已建立的tcp連接。
c)Client收到Web Server的response中包含“Connection: keep-alive”,就認(rèn)為是一個長連接,不close tcp連接。并用該tcp連接再發(fā)送request。(跳轉(zhuǎn)到a))
關(guān)于KeepAlive的分析:
現(xiàn)在的一些服務(wù)器都可以設(shè)置KeepAlive是否開啟,以及KeepAlive的超時時間,服務(wù)器支持的KeepAlive數(shù)量(數(shù)量一般不會很大,否則會對服務(wù)器產(chǎn)生很大的壓力)。
那么我們考慮3種情況:
1、用戶瀏覽一個網(wǎng)頁時,除了網(wǎng)頁本身外,還引用了多個 javascript 文件,多個 css 文件,多個圖片文件,并且這些文件都在同一個 HTTP 服務(wù)器上。
2、用戶瀏覽一個網(wǎng)頁時,除了網(wǎng)頁本身外,還引用一個 javascript 文件,一個圖片文件。
3、用戶瀏覽的是一個動態(tài)網(wǎng)頁,由程序即時生成內(nèi)容,并且不引用其他內(nèi)容。
對于上面3中情況,1 最適合打開 KeepAlive ,2 隨意,3 最適合關(guān)閉 KeepAlive
打 開 KeepAlive 后,意味著每次用戶完成全部訪問后,都要保持一定時間后才關(guān)閉會關(guān)閉 TCP 連接,那么在關(guān)閉連接之前,必然會有一個服務(wù)器進(jìn)程對應(yīng)于該用戶而不能處理其他用戶,假設(shè) KeepAlive 的超時時間為 10 秒種,服務(wù)器每秒處理 50 個獨(dú)立用戶訪問,那么系統(tǒng)中 Apache 的總進(jìn)程數(shù)就是 10 * 50 = 500 個,如果一個進(jìn)程占用 4M 內(nèi)存,那么總共會消耗 2G 內(nèi)存,所以可以看出,在這種配置中,相當(dāng)消耗內(nèi)存,但好處是系統(tǒng)只處理了 50次 TCP 的握手和關(guān)閉操作。
如果關(guān)閉 KeepAlive,如果還是每秒50個用戶訪問,如果用戶每次連續(xù)的請求數(shù)為3個,那么 Apache 的總進(jìn)程數(shù)就是 50 * 3 = 150 個,如果還是每個進(jìn)程占用 4M 內(nèi)存,那么總的內(nèi)存消耗為 600M,這種配置能節(jié)省大量內(nèi)存,但是,系統(tǒng)處理了 150 次 TCP 的握手和關(guān)閉的操作,因此又會多消耗一些 CPU 資源。
————————————————
版權(quán)聲明:本文為CSDN博主「H-G-Y」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/go_to_learn/article/details/8147673
網(wǎng)站無須三方授權(quán) · 安全穩(wěn)定、維護(hù)方便