乙個TCP連線可以傳送多少個HTTP請求?

2021-10-03 09:13:47 字數 3278 閱讀 6141

一道經典的面試題是從url在瀏覽器被輸入到頁面展現的過程中發生了什麼?大多數回答都是請求響應之後dom是怎麼被構建、被繪製出來。

要搞懂這個問題,我們需要先解決下面五個問題:

http/1.0中,乙個伺服器在傳送完乙個http響應後,會斷開tcp連線。但是這樣每次請求都會重新建立和斷開tcp連線,代價過大。所以雖然標準中沒有設定,某些伺服器對connection: keep-aliveheader進行了支援。

意思是說,完成這個http請求之後,不要斷開http請求使用tcp連線。這樣的好處是連線可以被重新使用,之後傳送http請求的時候不需要重新建立tcp連線,以及如果維持連線,那麼ssl的開銷也可以避免。

以下兩張是短時間內訪問某站點的時間統計:

頭一次訪問,有初始化連線和ssl開銷

初始化連線和ssl開銷消失了,說明使用的是同乙個tcp連線

持久連線: 既然維持tcp連線好處這麼多,http/1.1就把connection頭寫進標準,並且預設開啟持久化連線(除非請求中宣告connection: close),那麼瀏覽器和伺服器之間是會維持一段時間的tcp連線,不會乙個請求結束就斷掉。

所以第乙個問題的答案是: 預設情況下建立tcp連線不會斷開,只有在請求報頭中宣告connection: close才會請求完成之後關閉連線。

了解第乙個問題之後,其實這個問題也有了答案,如果維持連線,乙個tcp連線可以傳送多個http請求的

http/1.1存在乙個問題,單個tcp連線在同一時刻只能處理乙個請求,意思是說:兩個請求的宣告週期不能重疊,任意兩個http請求從開始到結束的時間在同乙個tcp連線裡不能重疊。

雖然http/1.1規範中規定了pipelining來試**決這個問題,但是這個功能在瀏覽器中預設是關閉的。

先來看一下 pipelining 是什麼,rfc 2616 中規定了:乙個支援持久連線的客戶端可以在乙個連線中傳送多個請求(不需要等待任意請求的響應)。收到請求的伺服器必須按照請求收到的順序傳送響應

至於標準為什麼這麼設定,我們可以大概推測乙個原因:由於http/1.1是個文字協議,同時返回的內容也並不能區分對應於哪個傳送的請求,所以順序必須維持一致

比如你向伺服器傳送了兩個請求 get /query?q=a 和 get /query?q=b,伺服器返回了兩個結果,瀏覽器是沒有辦法根據響應結果來判斷響應對應於哪乙個請求的(因為tcp都是繫結到乙個網路埠的,筆者注!!)

pipelining這種設想看起來比較美好,但是在實踐中會出現許多問題:

所以現代瀏覽器預設是不開啟http pipelining的。

但是,http2提供了multiplexing多路傳輸特性,可以在乙個tcp連線中同時完成多個http請求。至於multiplexing具體怎麼實現的就是另乙個問題了。我們可以看一下使用http2的效果。

所以這個問題也有了答案:在http/1.1存在pipelining技術可以完成這個多個請求同時傳送,但是由於瀏覽器預設關閉,所以可以認為這是不可行的。在http2中由於multiplexing特點的存在,多個http請求可以在同乙個tcp連線中並行進行。

那麼在http/1.1時代,瀏覽器是如何提高頁面載入效率的呢?主要有下面兩點:

在第乙個問題的討論中已經有答案了,tcp連線有的時候會被瀏覽器和服務端維持一段時間。tcp不需要重新建立,ssl自然也會用之前的。

假設我們還處在http/1.1時代,那個時候沒有多路傳輸,當瀏覽器拿到乙個有幾十張的網頁該怎麼辦呢?

所以答案是:有。chrome最多允許對同乙個host建立六個tcp連線。不同的瀏覽器有一些區別。

如果都是https連線並且在同乙個網域名稱下,那麼瀏覽器在ssl握手之後會和伺服器商量能不能用http2,如果能的話就使用multiplexing功能在這個連線上進行多路傳輸。不過也未必會所有掛在這個網域名稱的資源都會使用乙個tcp連線去獲取,但是可以確定的是multiplexing很可能會被用到。

如果發現用不了http2呢?或者用不了https(現實中的http2都是在https上實現的,所以也就是只能使用http/1.1)。

那瀏覽器就會在乙個host上建立多個tcp連線,連線數量的最大限制取決於瀏覽器設定,這些連線會在空閒的時候被瀏覽器用來傳送新的請求,如果所有的連線都正在傳送請求呢?那其他的請求就只能等等了。

乙個 TCP 連線可以發多少個 HTTP 請求

在 http 1.0 中,乙個伺服器在傳送完乙個 http 響應後,會斷開 tcp 鏈結。但是這樣每次請求都會重新建立和斷開 tcp 連線,代價過大。所以雖然標準中沒有設定,某些伺服器對 connection keep alive 的 header 進行了支援。意思是說,完成這個 http 請求之後...

乙個TCP連線可以發多少個HTTP請求

一 從url被輸入瀏覽器到頁面展現,這個過程中發生了什麼?二 現代瀏覽器與伺服器建立乙個tcp連線後,是否會在乙個http請求完成後斷開?什麼情況下會斷開?2.http 1.0會斷開,除非設定connection keep alive 3.http 1.1不會斷開,不會再次進行初始化連線和ssl,除...

乙個TCP 連線可以發多少個 HTTP 請求呢?

dns伺服器請求解析 檢查host檔案 建立tcp連線,三次握手 傳送http請求,請求行 請求頭部 空行和請求資料4部分組 伺服器返回,伺服器將資源複本寫到tcp套接字,由客戶端讀取。乙個響應由狀態行 響應頭部 空行和響應資料4部分組成 主動釋放or延時釋放 瀏覽器進行渲染 現代瀏覽器在與伺服器建...