一道經典的面試題是從url
在瀏覽器被輸入到頁面展現的過程中發生了什麼?大多數回答都是請求響應之後dom
是怎麼被構建、被繪製出來。
要搞懂這個問題,我們需要先解決下面五個問題:
在http/1.0
中,乙個伺服器在傳送完乙個http
響應後,會斷開tcp
連線。但是這樣每次請求都會重新建立和斷開tcp
連線,代價過大。所以雖然標準中沒有設定,某些伺服器對connection: keep-alive
的header
進行了支援。
意思是說,完成這個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延時釋放 瀏覽器進行渲染 現代瀏覽器在與伺服器建...