天天看點

HTTP 連接配接建立方式

當我們在浏覽一個web頁面時,頁面裡的元素可能是來自于多個源的,例如每張圖檔有各自的來源。我們在浏覽一個擁有2張圖檔的web頁面時,浏覽器需要發起3個HTTP事務,一個用于擷取頂層HTML頁面元素,另兩個擷取相對應的圖檔。

串行連接配接

如果隻是簡單的對連接配接進行管理,使用串行化的方式去請求資源。每個請求都需要等待前方的請求完畢,并且每個事務在請求時都需要建立連接配接-傳輸資料-關閉連接配接。

使用串行化的方式去請求,則我們擁有了三倍的連接配接時延和慢啟動時延

并行連接配接

HTTP允許用戶端同時打開多條連接配接,并行地執行多個HTTP事務。此時,每個請求不用等待其他請求的處理情況,自行建立連接配接去執行自身的HTTP事務即可。

使用并行化的方式去請求,理論上相對串行化連接配接,時間縮短為了1/3;但每個任務都有自己的連接配接,在帶寬很小(隻能容下一個請求時)時,每個連接配接都會去競争這有限的帶寬,這樣其實和串行化的效率相當,而且,同時打開大量連接配接會消耗很多記憶體資源,進而引發自身的性能問題

持久連接配接

如果這三個請求的目标伺服器都是同一個,我們可以保持初次打開的TCP連接配接不關閉,在後續使用時可以直接拿來複用,這就叫做持久連接配接。

其實這裡和我們在服務端開發時使用的連接配接池,是同樣的道理,用戶端維護一個連接配接池,要使用時直接撿起來用即可

持久連接配接相對于并行連接配接,将并行連接配接引起的多次連接配接時延和慢啟動時延縮短到了一次。而且減少了打開連接配接的數量,節約了更多的資源。但要小心的是在管理持久連接配接時,如果不夠細緻,有可能會累積出大量的空閑連接配接(例如你通路了多個網站,每次都是一個持久連接配接,并且你忘記設定逾時來關閉它們)

現在比較常用的方式是打開少量的并行連接配接,并且每個連接配接都持久化。這樣可以享用兩者帶來的好處,但同樣要小心地處理,避免連接配接長期空閑。