Connection: Keep-Alive


上午在實驗室看書,師弟讓我幫忙解決個項目上的問題,問題不難,於是我教他抓包解決,讓他電腦下了fiddler不過卻顯示不出來請求,我嘗試了一下也是如此,過濾器也沒開,突然意識到可能是360的問題,因為fiddler是通過http代理的方式,360很可能阻止第三方軟件對瀏覽器代理,於是關掉360,重啟瀏覽器終於能愉快的抓包了。

調試過程中我讓他F12勾上disable cache,然后眼睛被一個詞語吸引住了---Connection: Keep-Alive

當時很疑惑,http明明是無連接無狀態的,那么這里的keepalive是指什么?

實際上它是一種TCP復用,每次http請求都需要tcp三次握手,浪費資源和時間,因此我們可以保持tcp通道連接一段時間,這樣一次tcp連接就可以維持幾次http請求。


 

在此基礎上,還需要搞清楚幾個其他的名詞:長輪詢,段輪詢

長連接是為了tcp復用,那么這兩個詞是做什么的呢?先說個例子:

短輪詢相信大家都不難理解,比如你現在要做一個電商中商品詳情的頁面,這個詳情界面中有一個字段是庫存量(相信這個大家都不陌生,隨便打開淘寶或者京東都能找到這種頁面)。而這個庫存量需要實時的變化,保持和服務器里實際的庫存一致,怎么實現?

長輪詢這個時候就出現了,其實長輪詢和短輪詢最大的區別是,短輪詢去服務端查詢的時候,不管庫存量有沒有變化,服務器就立即返回結果了。而長輪詢則不是,在長輪詢中,服務器如果檢測到庫存量沒有變化的話,將會把當前請求掛起一段時間(這個時間也叫作超時時間,一般是幾十秒)。在這個時間里,服務器會去檢測庫存量有沒有變化,檢測到變化就立即返回,否則就一直等到超時為止。

很明顯,使用長輪詢客戶端的請求次數將會大量減少(這也就意味着節省了網絡流量,畢竟每次發請求,都會占用客戶端的上傳流量和服務端的下載流量)。但是如果大量客戶端都在請求庫存,服務端用多個線程來掛起請求,這樣服務器的壓力也太大了吧。因此長輪詢也是有適用場景的。


區分下長輪詢和長短連接,他們最根本的區別是:

第一個區別是決定的方式,一個TCP連接是否為長連接,是通過設置HTTP的Connection Header來決定的,而且是需要兩邊都設置才有效。而一種輪詢方式是否為長輪詢,是根據服務端的處理方式來決定的,與客戶端沒有關系。

第二個區別就是實現的方式,連接的長短是通過協議來規定和實現的。而輪詢的長短,是服務器通過編程的方式手動掛起請求來實現的。


 

總之,記住這一點:長連接是指的TCP連接,而不是HTTP連接。HTTP協議是基於請求/響應模式的,因此只要服務端給了響應,本次HTTP連接就結束了,TCP連接是一個雙向的通道,它是可以保持一段時間不關閉的,因此TCP連接才有真正的長連接和短連接這一說


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM