APP應用 HTTP/1.0中keep-alive
阿新 • • 發佈:2018-12-03
在HTTP/1.0中keep-alive不是標準協議,客戶端必須傳送Connection:Keep-Alive來啟用keep-alive連線。 https://www.imooc.com/article/31231 HTTP協議是無狀態的協議,即每一次請求都是互相獨立的。因此它的最初實現是,每一個http請求都會開啟一個tcp socket連線,當互動完畢後會關閉這個連線。 HTTP協議是全雙工的協議,所以建立連線與斷開連線是要經過三次握手與四次揮手的。顯然在這種設計中,每次傳送Http請求都會消耗很多的額外資源,即連線的建立與銷燬。
從圖中可以看到:
- 在序列連線中,每次互動都要開啟關閉連線
- 在持久連線中,第一次互動會開啟連線,互動結束後連線並不關閉,下次互動就省去了建立連線的過程。
- 當有連線第一次使用的時候建立連線
- 結束時對應連線不關閉,歸還到池中
- 下次同個目的的連線可從池中獲取一個可用連線
- 定期清理過期連線 如下:
- HTTP協議通過持久連線的方式,減輕了早期設計中的過多連線問題
- 持久連線有兩種方式:HTTP/1.0+的Keep-Avlive與HTTP/1.1的預設持久連線
- HttpClient通過連線池來管理持久連線,連線池分為兩個,一個是總連線池,一個是每個route對應的連線池
- 預設連線重用策略與HTTP協議約束一致,根據response先判斷Connection:Close則關閉,在判斷Connection:Keep-Alive則開啟,最後版本大於1.0則開啟
- 只有在HttpClientBuilder中手動開啟了清理過期與空閒連線的開關後,才會清理連線池中的連線
- HttpClient4.4之後的版本通過一個死迴圈執行緒清理過期與空閒連線,該執行緒每次執行都sleep一會,以達到定期執行的效果