1. 程式人生 > >http的keep-alive和tcp的keepalive區別

http的keep-alive和tcp的keepalive區別

1、HTTP Keep-Alive
在http早期,每個http請求都要求開啟一個tpc socket連線,並且使用一次之後就斷開這個tcp連線。
使用keep-alive可以改善這種狀態,即在一次TCP連線中可以持續傳送多份資料而不會斷開連線。通過使用keep-alive機制,可以減少tcp連線建立次數,也意味著可以減少TIME_WAIT狀態連線,以此提高效能和提高httpd伺服器的吞吐率(更少的tcp連線意味著更少的系統核心呼叫,socket的accept()和close()呼叫)。
但是,keep-alive並不是免費的午餐,長時間的tcp連線容易導致系統資源無效佔用。配置不當的keep-alive,有時比重複利用連線帶來的損失還更大。所以,正確地設定keep-alive timeout時間非常重要。
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連線。
2、TCP KEEPALIVE

連結建立之後,如果應用程式或者上層協議一直不傳送資料,或者隔很長時間才傳送一次資料,當連結很久沒有資料報文傳輸時如何去確定對方還線上,到底是掉線了還是確實沒有資料傳輸,連結還需不需要保持,這種情況在TCP協議設計中是需要考慮到的。
TCP協議通過一種巧妙的方式去解決這個問題,當超過一段時間之後,TCP自動傳送一個數據為空的報文給對方,如果對方迴應了這個報文,說明對方還線上,連結可以繼續保持,如果對方沒有報文返回,並且重試了多次之後則認為連結丟失,沒有必要保持連結。
3、http keep-alive與tcp keep-alive
http keep-alive與tcp keep-alive,不是同一回事,意圖不一樣。http keep-alive是為了讓tcp活得更久一點,以便在同一個連線上傳送多個http,提高socket的效率。而tcp keep-alive是TCP的一種檢測TCP連線狀況的保鮮機制。tcp keep-alive保鮮定時器,支援三個系統核心配置引數:
1 echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
2 echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl
3 echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
keepalive是TCP保鮮定時器,當網路兩端建立了TCP連線之後,閒置idle(雙方沒有任何資料流傳送往來)了tcp_keepalive_time後,伺服器核心就會嘗試向客戶端傳送偵測包,來判斷TCP連線狀況(有可能客戶端崩潰、強制關閉了應用、主機不可達等等)。如果沒有收到對方的回答(ack包),則會在 tcp_keepalive_intvl後再次嘗試傳送偵測包,直到收到對對方的ack,如果一直沒有收到對方的ack,一共會嘗試 tcp_keepalive_probes次,每次的間隔時間在這裡分別是15s, 30s, 45s, 60s, 75s。如果嘗試tcp_keepalive_probes,依然沒有收到對方的ack包,則會丟棄該TCP連線。TCP連線預設閒置時間是2小時,一般設定為30分鐘足夠了。

也就是說,僅當nginx的keepalive_timeout值設定高於tcp_keepalive_time,並且距此tcp連線傳輸的最後一個http響應,經過了tcp_keepalive_time時間之後,作業系統才會傳送偵測包來決定是否要丟棄這個TCP連線。一般不會出現這種情況,除非你需要這樣做。

4、圖解http的keep-alive


參考連結地址:http://www.bubuko.com/infodetail-260176.html

                           http://www.nowamagic.net/academy/detail/23350305