這句話其實只對了一半,我們現如今的http協議,大部分都是1.1的,因此我們平時用的基本上都是長連線。但是前半句是不對的,http協議根本沒有長短連線這一說,也正因為誤解了這個,導致lz對於長連線一直不明不白,始終不得其要領,具體下面一段會說到。
網路上很多文章都是誤人子弟,根本沒有說明白這個概念。這裡lz要強調一下,http協議是基於請求/響應模式的,因此只要服務端給了響應,本次http連線就結束了,或者更準確的說,是本次http請求就結束了,根本沒有長連線這一說。那麼自然也就沒有短連線這一說了。
之所以網路上說http分為長連線和短連線,其實本質上是說的tcp連線。tcp連線是乙個雙向的通道,它是可以保持一段時間不關閉的,因此tcp連線才有真正的長連線和短連線這一說。
其實知道了以後,會覺得這很好理解。http協議說到底是應用層的協議,而tcp才是真正的傳輸層協議,只有負責傳輸的這一層才需要建立連線。
乙個形象的例子就是,拿你在網上購物來說,http協議是指的那個快遞單,你寄件的時候填的單子就像是發了乙個http請求,等貨物運到地方了,快遞員會根據你發的請求把貨物送給相應的收貨人。而tcp協議就是中間運貨的那個大貨車,也可能是火車或者飛機,但不管是什麼,它是負責運輸的,因此必須要有路,不管是地上還是天上。那麼這個路就是所謂的tcp連線,也就是乙個雙向的資料通道。
因此,lz現在甚至覺得,「http連線」這個詞就不應該出現,它只是乙個應用層的協議,根本就沒有所謂的連線這一說,就像ftp也是應用層的協議,但是你有聽說過ftp連線嗎?(恩,好像是聽過,-_-,但你現在知道了,其實所謂的ftp連線,嚴格來說,依舊是tcp連線)
實際上,說http請求和http響應會更準確一些,而http請求和http響應,都是通過tcp連線這個通道來回傳輸的。
不管怎麼說,一定要務必記住,長連線是指的tcp連線,而不是http連線。
長連線是為了復用,這個在之前lz就明白。那既然長連線是指的tcp連線,也就是說復用的是tcp連線。那這就很好解釋了,也就是說,長連線情況下,多個http請求可以復用同乙個tcp連線,這就節省了很多tcp連線建立和斷開的消耗。
比如你請求了的乙個網頁,這個網頁裡肯定還包含了css、js等等一系列資源,如果你是短連線(也就是每次都要重新建立tcp連線)的話,那你每開啟乙個網頁,基本要建立幾個甚至幾十個tcp連線,這浪費了多少資源就不用lz去說了吧。
但如果是長連線的話,那麼這麼多次http請求(這些請求包括請求網頁內容,css檔案,js檔案,等等),其實使用的都是乙個tcp連線,很顯然是可以節省很多消耗的。
另外,最後關於長連線還要多提一句,那就是,長連線並不是永久連線的。如果一段時間內(具體的時間長短,是可以在header當中進行設定的,也就是所謂的超時時間),這個連線沒有http請求發出的話,那麼這個長連線就會被斷掉。
下面是一些實驗資料:
一次http請求的連線及請求響應過程,實際上,我門觀察一次網頁請求抓取的所有包,發現其中一共建立了4個tcp連線,在下圖中顯示了其中的2個連線的握手資訊。
這4個連線分別用在了獲取頁面中引入的樣式表、樣式表中的字型等資訊。擷取部分依賴:
實際上,乙個頁面所引用的所有元件,包括樣式表、、指令碼等都是一次http請求,從network中可以看出本次頁面請求一共進行了包含html文件在內的7次http請求:
這些請求分在4個tcp連線中進行。具體在抓包中有所體現,舉乙個例子來說吧:
這裡對頁面中引用的normalize.css就是通過另乙個tcp連線獲取的,通過埠號可以區分,這裡是建立在60546埠的tcp連線,不同於上面的60545。
實際上瀏覽器在這裡使用了並行連線用來客服單條tcp連線的空載時間以及頻寬限制。就像下面一樣:
瀏覽器會使用並行連線來提公升效率,但是需要知道的是,tcp連線本身就會消耗較多的資源。對於乙個頁面中包含幾十上百個http請求的情況,開啟幾十個tcp連線是不可能的。通常,瀏覽器會將連線數限制4。本例中,我統計了抓包資訊,恰好開啟了4個tcp連線。
http基於tcp,tcp又是面向連線的協議。連線有建立就有關閉,我在抓包的時候發現,當所有請求資料都傳送完畢的時候,tcp連線並沒有馬上關閉。
我們回過頭看第乙個http請求頭資訊:
其中有一項:connection: keep-alive
返回頭:
返回頭中也有connection: keep-alive
。
在http請求中,keep-alive用來告訴伺服器我希望建立乙個持久連線,也就是在資料傳送完畢後不立即關閉該tcp連線。持久連線能夠避免重複地開啟關閉連線的消耗同時也能迴避tcp慢啟動特性帶來的損耗。如果伺服器同意建立該持久連線,就在響應頭中同樣包含connection: keep-alive
,否則客戶端就會認為伺服器不支援keep-alive。本連線是乙個持久連線。
通常持久連線的響應首部還會包含timeout以及max引數,用來估計伺服器將連線保持活躍的時長以及保持持久連線數的上限。注意,該值只是估計,不是承諾。不過這裡的響應頭中並沒有包含此類資訊。
本**我是使用express框架做的後台,我沒有手動設定timeout以及max,也沒查到其預設timeout時長,不過我用系統時鐘進行了測試,在資料傳送完畢後120s左右,tcp連線中斷:
上圖中包含了所有4個tcp連線斷開的4次揮手資訊。
我發現,在手動關閉網頁時也不會立即斷開tcp連線。在連線期間重新整理網頁會繼續使用已經建立的tcp連線。但是,如果關閉瀏覽器,會立即斷開tcp連線。
TCP 連線與 HTTP 請求的相關問題
1 現代瀏覽器在與伺服器建立了乙個 tcp 連線後是否會在乙個 http 請求完成後斷開?什麼情況下會斷開?預設情況下建立 tcp 連線不會斷開,只有在請求報頭中宣告 connection close 才會在請求完成後關閉連線。2 乙個 tcp 連線可以對應幾個 http 請求?如果維持連線,乙個 ...
檢視http的併發請求數及其TCP連線狀態
統計80埠的連線資料 netstat nat grep i 80 wc l 統計httpd協議連線數 統計已連線的,狀態為establish的 netstat na greo establish wc l 查出那個ip連線最多,並將其封掉 netstat na grep establish awk ...
基於TCP傳送http請求建立連線與斷開連線的過程
首先說說tcp是什麼,http又是什麼?tcp 傳輸控制協議,面向連線的,可靠地,安全的,基於位元組流的傳輸層協議 http 超文字傳輸協議,但是這個協議是應用層傳輸協議,它是建立在tcp之上的協議 建立連線 三次握手 第一次 client syn server 第二次 server ack syn...