在http早期,每一個http請求都要求打開一個tpc socket鏈接,而且使用一次以後就斷開這個tcp鏈接。nginx
使用keep-alive能夠改善這種狀態,即在一次TCP鏈接中能夠持續發送多份數據而不會斷開鏈接。經過使用keep-alive機制,它減小了tcp鏈接創建次數,也意味着能夠減小Time_Wait狀態鏈接,所以提升性能和提升httpd服務器的吞吐率。瀏覽器
可是,keep-alive它不是免費的午飯,長時間的tcp鏈接很容易致使系統資源無效的佔用。配置不當的keep-alive,會比重複利用鏈接帶來的損失更大。因此,正確地設置keep-alive timeout時間很是重要。服務器
二、tcp keepalive網絡
連接創建以後,若是應用程序與或者上層協議一直不發送數據,或者間隔很長時間才發一次數據,當連接好久沒有數據報文傳輸時如何去肯定對方還在線,究竟是掉線仍是確實沒有數據傳輸,連接還需不須要保持,這種狀況下在TCP協議設計中是須要考慮到的。socket
TCP協議經過一種特別巧妙的方式來解決這個問題,當超過一段時間以後,TCP自動發送一個數據爲空的報文給對方,若是對方迴應了這個報文,說明對方還在線,連接能夠繼續保持,若是對方沒有報文返回,而且重試了屢次以後則認爲連接丟失,沒有必要保持連接。tcp
三、keepalvie timeout性能
Httpd守護進程,通常都提供了keep-alive timeout時間設置參數。好比nginx的keepalive_timeout,和Apache的KeepAliveTimeout。這個keepalive_timout時間值意味着:一個http產生的tcp鏈接在傳送完最後一個響應後,還須要hold住keepalive_timeout秒後,纔開始關閉這個鏈接。spa
httpd守護進程發送完一個響應後,理應立刻主動關閉相應的tcp鏈接,設置 keepalive_timeout後,httpd守護進程會想說:」等一下瀏覽器吧,看看有沒有請求過來」,這一等,即是keepalive_timeout時間。若是守護進程在這個等待的時間裏,一直沒有收到瀏覽發過來http請求,則關閉這個http鏈接。設計
HTTP的Keepalive,顧名思義,目的在於延長鏈接的時間,以便在同一條鏈接中傳輸多個HTTP請求。HTTP服務器通常會提供Keepalive Timeout參數,用來決定鏈接保持多久,何時關閉鏈接。當鏈接使用了Keepalive功能時,對於客戶端發送過來的一個請求,服務器端會發送一個響應,而後開始計時,若是通過Timeout時間後,客戶端沒有再發送請求過來,服務器端就把鏈接關了,再也不保持鏈接了。進程
TCP的Keepalive,是掛羊頭賣狗肉的,目的在於看看對方有沒有發生異常,若是有異常就及時關閉鏈接。當傳輸雙方不主動關閉鏈接時,就算雙方沒有交換任何數據,鏈接也是一直有效的。若是這個時候對端、中間網絡出現異常而致使鏈接不可用,本端如何得知這一信息呢?答案就是保活定時器。它每隔一段時間會超時,超時後會檢查鏈接是否空閒過久了,若是空閒的時間超過了設置時間,就會發送探測報文。而後經過對端是否響應、響應是否符合預期,來判斷對端是否正常,若是不正常,就主動關閉鏈接,而不用等待HTTP層的關閉了。當服務器發送探測報文時,客戶端可能處於4種不一樣的狀況:仍然正常運行、已經崩潰、已經崩潰並重啓了、因爲中間鏈路問題不可達。在不一樣的狀況下,服務器會獲得不同的反饋。
五、http keep-alive與tcp keep-alive
http keep-alive與tcp keep-alive,不是同一回事,意圖也同樣。http keep-alive是爲了讓tcp活得更久一點,以便在同一個鏈接上傳送多個http,提升socket的效率。而tcp keep-alive是TCP的一種檢測TCP鏈接情況的保鮮機制。