天天看點

大話keepalive大話keepalivetcp層的keepalivehttp層的keep-alive總結

我們說到keepalive的時候,需要先明确一點,這個keepalive說的是tcp的還是http的。

tcp的keepalive是側重在保持用戶端和服務端的連接配接,一方會不定期發送心跳包給另一方,當一方端掉的時候,沒有斷掉的定時發送幾次心跳包,如果間隔發送幾次,對方都傳回的是RST,而不是ACK,那麼就釋放目前連結。設想一下,如果tcp層沒有keepalive的機制,一旦一方斷開連接配接卻沒有發送FIN給另外一方的話,那麼另外一方會一直以為這個連接配接還是存活的,幾天,幾月。那麼這對伺服器資源的影響是很大的。

http的keep-alive一般我們都會帶上中間的橫杠,普通的http連接配接是用戶端連接配接上服務端,然後結束請求後,由用戶端或者服務端進行http連接配接的關閉。下次再發送請求的時候,用戶端再發起一個連接配接,傳送資料,關閉連接配接。這麼個流程反複。但是一旦用戶端發送connection:keep-alive頭給服務端,且服務端也接受這個keep-alive的話,兩邊對上暗号,這個連接配接就可以複用了,一個http處理完之後,另外一個http資料直接從這個連接配接走了。

tcp的keepalive就是為了檢測連結的可用性。主要調節的參數有三個:

tcp_keepalive_time // 距離上次傳送資料多少時間未收到判斷為開始檢測

tcp_keepalive_intvl // 檢測開始每多少時間發送心跳包

tcp_keepalive_probes // 發送幾次心跳包對方未響應則close連接配接

基本上的流程:

在用戶端和服務端進行完三次握手之後,用戶端和服務端都處在ESTABLISH狀态,這個時候進行正常的PSH和ACK互動,但是一旦一方服務中斷了,另一方在距離上次PSH時間tcp_keepalive_time發現對方未發送資料,則開始心跳檢測。心跳檢測實際就是發送一個PSH的空心跳包,這裡說的空心跳包就是包的資料為空,但是TCP包的頭部的資料和辨別和正常包一樣。如果這個包擷取到的是RST傳回的話,下面就會繼續每隔tcp_keepalive_intval的時長發送一個空心跳包,如果tcp_keepalive_probes次心跳包對方都是傳回RST而不是ACK,則心跳發起方就判斷這個連接配接已經失效,主動CLOST這個連接配接。

這三個參數可以每個TCP連接配接都不同,使用tcp設定變量的函數可以設定目前tcp連接配接的這三個對應的值。

這裡說的連接配接的一方是否斷了包含幾種情況:

連接配接一方服務中止

網絡不好導緻的服務長時間無響應

連接配接一方服務重新開機中

結合這三種方式就很好了解為什麼會有 tcp_keepalive_time, tcp_keepalive_intval, tcp_keepalive_probes三種的設定了。如果是對方伺服器進行重新開機的時候,我們不能根據一次的tcp傳回重置信号就判定這個連接配接失效。相反的,重新開機之後,這個心跳包一旦正常,這個連接配接仍然可以繼續使用。

這個往往在代理或者内網狀況下會使用到。一般NAT網絡為了資源,會和外網保持一定的資源連接配接數,而且采用的是淘汰機制,淘汰掉舊的,不用的連接配接,建立和使用新的連接配接。如果我們沒有心跳檢測機制,那麼我們的連接配接在一段時間沒有使用的時候,NAT對外的機制會判斷對應的對外網絡是無用的,淘汰掉舊的,即使這個時候用戶端和服務端都還正常服務着,隻是長時間未聯絡了而已。keepalive的機制由于有定時心跳包,自然就能解決這個問題了。

http層有個keep-alive, 它主要是用于用戶端告訴服務端,這個連接配接我還會繼續使用,在使用完之後不要關閉。

這個設定會影響web服務的哪幾個方面呢?

這個設定首先會在性能上對用戶端和伺服器端性能上有一定的提升。很好了解的是少了TCP的三次握手和四次揮手,第二次傳遞資料就可以通過前一個連接配接直接進行資料互動了。當然會提升服務性能了。

由于HTTP服務的發起方一般都是浏覽器,即用戶端。但是先執行完邏輯,傳輸完資料的一定是服務端。那麼一旦沒有keep-alive機制,服務端在傳送完資料之後會率先發起連接配接斷開的操作。由于TCP的四次揮手機制,先發起連接配接斷開的一方會在連接配接斷開之後進入到TIME_WAIT的狀态達到2MSL之久。設想,如果沒有開啟HTTP的keep-alive,那麼這個TIME_WAIT就會留在服務端,由于服務端資源是非常有限的,我們當然傾向于服務端不會同一時間hold住過多的連接配接,這種TIME_WAIT的狀态應該盡量在用戶端保持。那麼這個http的keep-alive機制就起到非常重要的作用了。

是以

基本上基于這兩個原因,現在的浏覽器發起web請求的時候,都會帶上connection:keep-alive的頭了。

TCP的keepalive機制和HTTP的keep-alive機制是說的完全不同的兩個東西,tcp的keepalive是在ESTABLISH狀态的時候,雙方如何檢測連接配接的可用行。而http的keep-alive說的是如何避免進行重複的TCP三向交握和四次揮手的環節。

本文轉自軒脈刃部落格園部落格,原文連結:http://www.cnblogs.com/yjf512/p/5354055.html,如需轉載請自行聯系原作者

繼續閱讀