http的長連接和短連接(TCP連接)

HTTP1.0協(xié)議不支持長連接
從HTTP1.1協(xié)議以后,連接默認(rèn)都是長連接

網(wǎng)絡(luò)上說HTTP分為長連接和短連接,其實本質(zhì)上是說的TCP連接。TCP連接是一個雙向的通道,它是可以保持一段時間不關(guān)閉的,因此TCP連接才有真正的長連接和短連接這一說。
HTTP協(xié)議說到底是應(yīng)用層的協(xié)議,而TCP才是真正的傳輸層協(xié)議,只有負(fù)責(zé)傳輸?shù)倪@一層才需要建立連接。

這里要強(qiáng)調(diào)一下,HTTP協(xié)議是基于請求/響應(yīng)模式的,因此只要服務(wù)端給了響應(yīng),本次HTTP連接就結(jié)束了,或者更準(zhǔn)確的說,是本次HTTP請求就結(jié)束了,根本沒有長連接這一說。那么自然也就沒有短連接這一說了。

只要設(shè)置Connection為keep-alive就算是長連接?
是的,但要服務(wù)器和客戶端都設(shè)置。長連接意味著連接會被復(fù)用

我們平時用的是不是長連接?
現(xiàn)在用的基本上都是HTTP1.1協(xié)議,你觀察一下就會發(fā)現(xiàn),基本上Connection都是keep-alive。而且HTTP協(xié)議文檔上也提到了,HTTP1.1默認(rèn)是長連接,也就是默認(rèn)Connection的值就是keep-alive

長連接好處是什么?
長連接意味著連接會被復(fù)用
長連接情況下,多個HTTP請求可以復(fù)用同一個TCP連接,這就節(jié)省了很多TCP連接建立和斷開的消耗。

比如你請求了博客園的一個網(wǎng)頁,這個網(wǎng)頁里肯定還包含了CSS、JS等等一系列資源,如果你是短連接(也就是每次都要重新建立TCP連接)的話,那你每打開一個網(wǎng)頁,基本要建立幾個甚至幾十個TCP連接,這浪費(fèi)了資源。
但如果是長連接的話,那么這么多次HTTP請求(這些請求包括請求網(wǎng)頁內(nèi)容,CSS文件,JS文件,圖片等等),其實使用的都是一個TCP連接,很顯然是可以節(jié)省很多消耗的。

長連接并不是永久連接的。如果一段時間內(nèi)(具體的時間長短,是可以在header當(dāng)中進(jìn)行設(shè)置的,也就是所謂的超時時間),這個連接沒有HTTP請求發(fā)出的話,那么這個長連接就會被斷掉

長輪詢和短輪詢

短輪詢
比如你現(xiàn)在要做一個電商中商品詳情的頁面,這個詳情界面中有一個字段是庫存量(相信這個大家都不陌生,隨便打開淘寶或者京東都能找到這種頁面)。而這個庫存量需要實時的變化,保持和服務(wù)器里實際的庫存一致。
這個時候,你會怎么做?
最簡單的一種方式,就是你用JS寫個死循環(huán),不停的去請求服務(wù)器中的庫存量是多少,然后刷新到這個頁面當(dāng)中,這其實就是所謂的短輪詢。
這種方式有明顯的壞處,那就是你很浪費(fèi)服務(wù)器和客戶端的資源??蛻舳诉€好點(diǎn),現(xiàn)在PC機(jī)配置高了,你不停的請求還不至于把用戶的電腦整死,但是服務(wù)器就很蛋疼了。如果有1000個人停留在某個商品詳情頁面,那就是說會有1000個客戶端不停的去請求服務(wù)器獲取庫存量,這顯然是不合理的。
長輪詢就出現(xiàn)了
長輪詢這個時候就出現(xiàn)了,其實長輪詢和短輪詢最大的區(qū)別是,短輪詢?nèi)シ?wù)端查詢的時候,不管庫存量有沒有變化,服務(wù)器就立即返回結(jié)果了。而長輪詢則不是,在長輪詢中,服務(wù)器如果檢測到庫存量沒有變化的話,將會把當(dāng)前請求掛起一段時間(這個時間也叫作超時時間,一般是幾十秒)。在這個時間里,服務(wù)器會去檢測庫存量有沒有變化,檢測到變化就立即返回,否則就一直等到超時為止。
這樣一來,客戶端的請求次數(shù)將會大量減少(這也就意味著節(jié)省了網(wǎng)絡(luò)流量,畢竟每次發(fā)請求,都會占用客戶端的上傳流量和服務(wù)端的下載流量),而且也解決了服務(wù)端一直疲于接受請求的窘境。
但是長輪詢也是有壞處的,因為把請求掛起同樣會導(dǎo)致資源的浪費(fèi),假設(shè)還是1000個人停留在某個商品詳情頁面,那就很有可能服務(wù)器這邊掛著1000個線程,在不停檢測庫存量,這依然是有問題的。
因此,從這里可以看出,不管是長輪詢還是短輪詢,都不太適用于客戶端數(shù)量太多的情況,因為每個服務(wù)器所能承載的TCP連接數(shù)是有上限的,這種輪詢很容易把連接數(shù)頂滿。之所以舉這個例子,只是因為大家肯定都會網(wǎng)購,所以這個例子比較通俗一點(diǎn)。
哪怕輪詢解決不了獲取庫存這個問題,但只要大家明白了長短輪詢的區(qū)別,這就足夠了。實際上,據(jù)LZ自己平日里購物的觀察,那個庫存量應(yīng)該是不會變的,這個例子純屬LZ個人的意淫,-_-。

長短輪詢和長短連接的區(qū)別

第一個區(qū)別是決定的方式,一個TCP連接是否為長連接,是通過設(shè)置HTTP的Connection Header來決定的,而且是需要兩邊都設(shè)置才有效。而一種輪詢方式是否為長輪詢,是根據(jù)服務(wù)端的處理方式來決定的,與客戶端沒有關(guān)系。
第二個區(qū)別就是實現(xiàn)的方式,連接的長短是通過協(xié)議來規(guī)定和實現(xiàn)的。而輪詢的長短,是服務(wù)器通過編程的方式手動掛起請求來實現(xiàn)的.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容