细谈keep_alive
一、為什么要引入keep_alive
? ?? HTTP是一個請求+響應模式的典型范例,即客戶端向服務器發送一個請求信息,服務器來響應這個信息。在老版本的HTTP中,每個請求都將被創建一個新的客戶端到服務器的連接,在這個連接上發送請求,然后接收請求。
? ? ?優點:簡單,容易理解和編程實現;
? ? ?缺點:效率很低。
?????因此,Keep-Alive被提出用來解決效率低的問題。
二、HTTP中使用keep_alive的好處
?????HTTP是一個無狀態協議,這意味著每個請求都是獨立的,Keep-Alive也沒能改變這個結果。Keep-Alive也不能保證客戶端和服務器之間的連接一定是活躍的。唯一能保證的就是當連接被關閉時,能得到一個通知,所以不應該讓程序依賴于Keep-Alive的保持連接特性,否則會有意想不到的后果。
?????在HTTP/1.0版本中,并沒有官方的標準來規定Keep-Alive如何工作,實際上它是被附加到HTTP/1.0協議上,如果客戶端瀏覽器支持Keep-Alive,那么就在HTTP請求頭中添加一個字段Connection: Keep-Alive,當服務器收到附帶有Connection: Keep-Alive的請求時,它也會在響應頭中添加一個同樣的字段來使用Keep-Alive。這樣,客戶端和服務器之間的HTTP連接就會被保持,不會斷開(超過Keep-Alive規定的時間,意外斷電等情況除外),當客戶端發送另外一個請求時,就使用這條已經建立的連接。
?????使用keep-alive可以改善TIME_WAIT這種狀態,即在一次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的keep_alive_timeout。這個keepalive_timout時間值意味著:一個http產生的tcp連接在傳送完最后一個響應后,還需要hold住keepalive_timeout秒后,才開始關閉這個連接。
?????當httpd守護進程發送完一個響應后,理應馬上主動關閉相應的tcp連接,設置 keepalive_timeout后,httpd守護進程會想說:”再等等吧,看看瀏覽器還有沒有請求過來”,這便是keepalive_timeout時間。如果守護進程在這個等待的時間里,一直沒有收到瀏覽發過來http請求,則關閉這個http連接。
1. 當keepalive_timeout=0時(不啟用Keep-Alive)
?????在沒有設置 keepalive_timeout 情況下,一個socket資源從建立到真正釋放需要經過的時間是:建立tcp連接 + 傳送http請求 +數據傳輸 + 傳送http響應 + 關閉tcp連接 + 2MSL。
2. 當keepalive_timeout>0時(啟用Keep-Alive)
?????服務端httpd守護進程發完響應后,沒有立即主動關閉tcp連接。keepalive_timeout時間后,服務端主動關閉這個tcp連接。這個時間,是我們設置的keepalive_timeout的時間。
????所以,設置了keepalive_timout時間情況下,一個socket建立到釋放的時間多了keepalive_timeout時間。
3. 當keepalive_timeout>0,且在同一個tcp連接發送多個http響應
?????當設定了keepalive_timeout,一個socket由建立到釋放,需要時間是:tcp建立 + (最后一個響應時間 – 第一個請求時間) + tcp關閉 + 2MSL。
????注意:正在關閉或者TIME_WAIT狀態的tcp連接,不能傳輸http請求和響應。即,當一個連接結束keepalive_timeout計時,服務端守護進程發送第一個FIN標志ip包后,此時該連接不能再使用了。
四、http keep-alive與tcp keep-alive
? ?? http keep-alive為了讓tcp活得更久一點,以便在同一個連接上傳送多個http,提高socket的效率;
?????而tcp keep-alive是TCP的一種檢測TCP連接狀況的保鮮機制。tcp keep-alive保鮮定時器。
?????keepalive是TCP保鮮定時器,當網絡兩端建立了TCP連接之后,閑置(雙方無任何數據流發送往來)了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分鐘足夠了。
?????也就是說,僅當http_keepalive_timeout值設置高于tcp_keepalive_time,并且距此tcp連接傳輸的最后一個http響應,經過了tcp_keepalive_time時間,操作系統才會發送偵測包來決定是否要丟棄這個TCP連接。一般不會出現這種情況。
五、keep-alive與TIME_WAIT
?????使用http keep-alvie,可以減少服務端TIME_WAIT數量(因為由服務端httpd守護進程主動關閉連接)。啟用keep-alive,建立的tcp連接少了,自然要被關閉的tcp連接也相應少了。
轉載于:https://blog.51cto.com/green906/1787947
總結
以上是生活随笔為你收集整理的细谈keep_alive的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何xp计算机每天定时关机,xp定时关机
- 下一篇: 【2022/1/11】thinkphp源