好程序員分享http的keep-alive和tcp的keep-alive區別

1、HTTP Keep-Alive

  http早期,每個http請求都要求打開一個tpc socket連接,並且使用一次之後就斷開這個tcp連接。

  使用keep-alive可以改善這種狀態,即在一次TCP連接中可以持續發送多份數據而不會斷開連接。通過使用keep-alive機制,它減少了tcp連接建立次數,也意味着可以減少Time_Wait狀態連接,因此提高性能和提高httpd服務器的吞吐率。

  但是keep-alive不是免費的午餐,長時間的tcp連接容易導致系統資源無效佔用。配置不當的keep-alive,比重複利用連接帶來的損失更大。所以,正確地設置keep-alive timeout時間非常重要。

2、tcp keepalive

  鏈接建立之後,如果應用程序與或者上層協議一直不發送數據,或者間隔很長時間才發一次數據,當鏈接很久沒有數據報文傳輸時如何去確定對方還在線,到底是掉線還是確實沒有數據傳輸,鏈接還需不需要保持,這種情況下在TCP協議設計中是需要考慮到的。

  TCP協議通過一種特別巧妙的方式解決這個問題,當超過一段時間之後,TCP自動發送一個數據爲空的報文給對方,如果對方迴應了這個報文,說明對方還在線,鏈接可以繼續保持,如果對方沒有報文返回,並且重試了多次之後則認爲鏈接丟失,沒有必要保持鏈接。

3、keepalvie timeout

  Httpd守護進程,一般都提供了keep-alive timeout時間設置參數。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。這個keepalive_timout時間值意味着:一個http產生的tcp連接在傳送完最後一個響應後,還需要hold住keepalive_timeout秒後,纔開始關閉這個連接。

  httpd守護進程發送完一個響應後,理應馬上主動關閉相應的tcp連接,設置 keepalive_timeout後,httpd守護進程會想說:”等一下瀏覽器吧,看看有沒有請求過來”,這一等,便是keepalive_timeout時間。如果守護進程在這個等待的時間裏,一直沒有收到瀏覽發過來http請求,則關閉這個http連接。

4、tcp keepalive保鮮定時器

  HTTP的Keepalive,顧名思義,目的在於延長連接的時間,以便在同一條連接中傳輸多個HTTP請求。HTTP服務器一般會提供Keepalive Timeout參數,用來決定連接保持多久,什麼時候關閉連接。當連接使用了Keepalive功能時,對於客戶端發送過來的一個請求,服務器端會發送一個響應,然後開始計時,如果經過Timeout時間後,客戶端沒有再發送請求過來,服務器端就把連接關了,不再保持連接了。

  TCP的Keepalive,是掛羊頭賣狗肉的,目的在於看看對方有沒有發生異常,如果有異常就及時關閉連接。當傳輸雙方不主動關閉連接時,就算雙方沒有交換任何數據,連接也是一直有效的。如果這個時候對端、中間網絡出現異常而導致連接不可用,本端如何得知這一信息呢?答案就是保活定時器。它每隔一段時間會超時,超時後會檢查連接是否空閒太久了,如果空閒的時間超過了設置時間,就會發送探測報文。然後通過對端是否響應、響應是否符合預期,來判斷對端是否正常,如果不正常,就主動關閉連接,而不用等待HTTP層的關閉了。當服務器發送探測報文時,客戶端可能處於4種不同的情況:仍然正常運行、已經崩潰、已經崩潰並重啓了、由於中間鏈路問題不可達。在不同的情況下,服務器會得到不一樣的反饋。

5、http keep-alive與tcp keep-alive

  http keep-alive與tcp keep-alive,不是同一回事,意圖也一樣。http keep-alive是爲了讓tcp活得更久一點,以便在同一個連接上傳送多個http,提高socket的效率。而tcp keep-alive是TCP的一種檢測TCP連接狀況的保鮮機制。


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