關於keep-alive的幾點疑惑

一、http的keep-alive與tcp的keep-alive
http keep-alive:
在一次tcp連接中可以連續發送多次數據,即可以保持一段時間的tcp連接,在這個保持的通道上有多個request、多個response。而不用每發一次數據就要重新進行三次握手連接,發完一次數據就要立即進行四次揮手釋放連接。 這樣可以提高性能和吞吐率。

tcp keep-alive:
爲了檢測tcp的連接狀況。經過設定的時間之後,服務器會發出檢測包去確認tcp連接是否還在。如果出現了問題就關閉連接。

小結:http的keep-alive和tcp的keep-alive是完全不同的東西。

二、request header中的http keep-alive與tcp連接
在http1.1版本之後都會默認設置connection爲keep-alive,如果想要關閉這條設置,需要在頭信息中更改connection爲close。

但是在實際使用中,http頭部有了keep-alive這個值並不代表一定會使用長連接,客戶端和服務器端都可以無視這個值,每一條TCP通道,只有一次GET,GET完之後,立即有TCP關閉的四次握手,這樣寫代碼更簡單。這時候雖然http頭有connection: keep-alive,但不能說是長連接。所以是否用了長連接,還是得用抓包工具分析tcp流。

小結:正常情況下客戶端瀏覽器、web服務端都有實現這個標準,因爲它們的文件又小又多,保持長連接減少重新開TCP連接的開銷很有價值。但是最終到底有沒有實現keep-alive還是得看tcp流的情況。

三、http keep-alive的tcp複用與websocket長連接
http keep-alive:
http keep-alive只是一種爲了達到複用tcp連接的“協商”行爲,雙方並沒有建立正真的連接會話,服務端也可以不認可,也可以隨時(在任何一次請求完成後)關閉掉。它是指在一次 TCP 連接中完成多個 http請求,但是對每個請求仍然要單獨發 header,所以除了真正的數據部分外,服務器和客戶端還要大量交換http header,信息交換效率很低,這樣建立的“長連接”都是僞長連接。

websocket:
websocket不同,它本身就規定了是正真的、雙工的長連接,兩邊都必須要維持住連接的狀態。

小結:http協議決定了瀏覽器端總是主動發起方,http的服務端總是被動的接受、響應請求。http提供的長連接服務器可以不接受。而websocket協議,在連接之後,客戶端、服務端是完全平等的。websocket是真正的長連接。

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