面試題目(頭條):
網頁中的圖片資源為什么分放在不同的域名下?
瀏覽器與服務器建立一個TCP連接后,是否會在完成一個http請求后斷開?什么條件下會斷開?
一個TCP連接可以同時發送幾個HTTP請求?
瀏覽器http請求的並發性是如何體現的?並發請求的數量有沒有限制?
答案解析:
第一個問題:
網頁中的圖片資源為什么分放在不同的域名下?
瀏覽器對並發請求的數目限制是針對域名的,即針對同一域名(包括二級域名)在同一時間支持的並發請求數量的限制。如果請求數目超出限制,則會阻塞。因此,網站中對一些靜態資源,使用不同的一級域名,可以提升瀏覽器並行請求的數目,加速界面資源的獲取速度。
第二個問題
瀏覽器與服務器建立一個TCP連接后,是否會在完成一個http請求后斷開?什么條件下會斷開?
在HTTP/1.0
中,一個http請求收到服務器響應后,會斷開對應的TCP連接。這樣每次請求,都需要重新建立TCP連接,這樣一直重復建立和斷開的過程,比較耗時。所以為了充分利用TCP連接,可以設置頭字段Connection: keep-alive
,這樣http請求完成后,就不會斷開當前的TCP連接,后續的http請求可以使用當前TCP連接進行通信。

第一次訪問有初始化連接和SSL開銷

初始化連接和SSL開銷消失了,說明使用的是同一個TCP連接。
HTTP/1.1
將Connection
寫入了標准,默認值為keep-alive
。除非強制設置為Connection: close
,才會在請求后斷開TCP連接。
所以這一題的答案就是:默認情況下建立的TCP連接不會斷開,只有在請求頭中設置Connection: close
才會在請求后關閉TCP連接。
第三個問題
一個TCP連接可以同時發送幾個HTTP請求?
HTTP/1.1
中,單個TCP連接,在同一時間只能處理一個http請求,雖然存在Pipelining技術支持多個請求同時發送,但由於實踐中存在很多問題無法解決,所以瀏覽器默認是關閉,所以可以認為是不支持同時多個請求。
HTTP2
提供了多路傳輸功能,多個http請求,可以同時在同一個TCP連接中進行傳輸。
第四個問題
瀏覽器http請求的並發性是如何體現的?並發請求的數量有沒有限制?
頁面資源請求時,瀏覽器會同時和服務器建立多個TCP連接,在同一個TCP連接上順序處理多個HTTP請求。所以瀏覽器的並發性就體現在可以建立多個TCP連接,來支持多個http同時請求。
Chrome瀏覽器最多允許對同一個域名Host建立6個TCP連接,不同的瀏覽器有所區別。
補充
如果圖片都是HTTPS的連接,並且在同一域名下,瀏覽器會先和服務器協商使用HTTP2
的Multiplexing
功能進行多路傳輸,不過未必所有的掛在這個域名下的資源都會使用同一個TCP連接。如果用不了HTTPS或者HTTP2(HTTP2是在HTTPS上實現的),那么瀏覽器會就在同一個host建立多個TCP連接,每一個TCP連接進行順序請求資源。