關於TCP連線的若干問題

2021-09-24 16:52:22 字數 1454 閱讀 1128

從 url 在瀏覽器被被輸入到頁面展現的過程中發生了什麼?

基本路徑為:

1 url解析/dns解析查詢網域名稱ip位址;

2 tcp 連線:tcp 三次握手;

3 網路連線發起http請求;

4 伺服器接收資料並響應請求/mvc;

5 伺服器返回 http 報文,客戶端接收資料;

6 瀏覽器載入/渲染頁面;

7 斷開連線:tcp 四次揮手

基本路徑如果劃分的細節不同,步驟和具體內容會有所區別,但大致操作是相同的

除此之外,還有一些細節:

1 現代瀏覽器在與伺服器建立了乙個 tcp 連線後是否會在乙個 http 請求完成後斷開?什麼情況下會斷開?

2 乙個 tcp 連線可以對應幾個 http 請求?

3 乙個 tcp 連線中 http 請求傳送可以一起傳送麼(比如一起發三個請求,再三個響應一起接收)?

4 為什麼有的時候重新整理頁面不需要重新建立 ssl 連線?

5 瀏覽器對同一 host 建立 tcp 連線到數量有沒有限制?

答案是:

1 http/1.0中伺服器在傳送完乙個 http 響應後,會斷開 tcp 連線;

而http/1.1中瀏覽器與伺服器只保持短暫的連線,連線無法復用預設情況下建立 tcp 連線不會斷開,只有在請求報頭中宣告 connection: close 才會在請求完成後關閉連線。

2 如果維持連線,乙個 tcp 連線是可以傳送多個 http 請求的。

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

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

(1)維持和伺服器已經建立的 tcp 連線,在同一連線上順序處理多個請求。

(2)和伺服器建立多個 tcp 連線。

4 tcp 連線有的時候會被瀏覽器和服務端維持一段時間。tcp 不需要重新建立,ssl 自然也會用之前的。

5 有。chrome 最多允許對同乙個 host 建立六個 tcp 連線。不同的瀏覽器有一些區別。

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

如果發現用不了 http2 呢?或者用不了 https(現實中的 http2 都是在 https 上實現的,所以也就是只能使用 http/1.1)。那瀏覽器就會在乙個 host 上建立多個 tcp 連線,連線數量的最大限制取決於瀏覽器設定,這些連線會在空閒的時候被瀏覽器用來傳送新的請求,如果所有的連線都正在傳送請求呢?那其他的請求就只能等等了。

關於fusionchart的若干問題

最近在做的乙個專案用到fusionchart這個外掛程式,期間遇到了一些問題,特整理出來以備忘,更與後來人分享 1 關於傳參。一般我們都是通過setdataurl url 來調後台的服務類獲取所要展現的資料,可是我們經常會在url中通過 傳多個查詢引數,這時一般都會出錯。這是因為編碼的問題,要通過e...

關於字典序的若干問題

1.六個數里取所有三個數的全排列按字典序輸出 法一 我記得比賽時我用的是二維陣列,每一維先排序,竟然立馬水過了,後來我想要是數多了就很麻煩,於是有了下面的方法。法二 1 include 2 include 3 include 4 using namespace std 56 const int ma...

ceph若干問題

ceph health可以檢視ceph集群健康狀況 ceph df 可以檢視儲存的總使用率與各pool的使用率 ceph osd df 可以檢視各osd的使用率 ceph s 或 ceph status 可以檢視集群整體狀態 首先,我們要知道ceph的osd的位址 ceph osd tree可以檢視...