資源加載和網絡棧
使用網絡棧下載網頁和網頁中的資源是渲染引擎工作的第一步,也是非常耗時間的一步。
一、Webkit資源加載機制
1. 資源
網頁本身就是一種資源,例如圖片、視頻等。HTML支持的資源主要有以下類型:
- HTML:HTML元素;
- JavaScript:JavaScript代碼,可以內嵌在HTML文件中,也可以單獨以文件形式存在;
- CSS:層疊樣式表,可以內嵌在HTML文件中,也可以單獨以文件形式存在;
- 圖片:各種編碼格式的圖片;
- SVG:用於繪製SVG的2D矢量圖形表示;
- 字體文件:CSS3支持自定義字體;
……
2. 資源緩存
資源的緩存機制是提高資源使用效率的有效方法。它的基本思想是建立一個資源的緩存池,當Webkit需要請求資源的時候,先從資源池中查找相應的資源,如果存在,測從資源池中取,如果不存在,則發送請求到服務器獲取。如下圖:
3. 資源加載器
按照加載器的類型,Webkit一共有三種類型的加載器:
- 針對每種資源類型的特定加載器,其特點是僅加載某一種特定的資源。例如:圖片加載器、字體加載器;
- 資源緩存機制的資源加載器,其特點是所有特定加載器都共享它來查找並插入緩存資源。特定加載器先通過緩存機制的資源加載器來查找是否有緩存資源;
- 通用資源加載器,Webkit需要從網絡或者文件系統獲取資源的時候使用它,因此它被所有的特定資源加載器共享。
4. 整個加載資源的過程
具體的加載過程可以看之前我寫的一篇關於瀏覽器緩存原理的文章,很詳細!
瀏覽器緩存詳細介紹
二、Chromium多進程資源加載
資源的實際加載在各個Webkit移植中有不同的實現。Chromium採用的是多進程的資源加載機制。Renderer進程在網頁的加載過程中需要獲取資源,但是由於安全性和效率上的考慮,Renderer進程的資源獲取實際上是通過進程間通信將任務交給Browser進程來完成,Browser進程有權限從網絡或者本地獲取資源。
三、網絡棧
1. 網絡棧的基本組成
網絡棧的基本組成如下圖:
2. 網絡棧的調用過程
首先是URLRequest被上層調用並啓動的時候,它會根據URL的scheme來決定需要創建什麼類型的請求。scheme就是URL的協議類型,例如:“http://” 、“file://”,也可以是自定義的協議。其次,會創建一個對象URLRequestHttpJob,該對象從Cookie管理器獲取與該URL相關聯的信息。之後,開啓一個HTTP連接的事務。再然後是建立套接字。如果用戶設置了代理,則還需要其他代理相關的對象提供支持。
3. 域名解析(DNS)
通常情況下,用戶都是使用域名來訪問網絡資源的,所以在建立TCP連接前需要解析域名。當然,Chromium使用一個單獨的線程來處理它。同樣,爲了考慮效率,也會使用相應緩存對象對域名和地址映射關係進行保存。我們可以在地址欄輸入:chrome://net-internals/#dns來清除Chrome瀏覽器的DNS緩存信息。
4. Cookie機制
Cookie是一項很古老的技術,因爲簡單易用,所以從誕生就收到廣泛的應用。Cookie格式就是一系列的鍵值對,如下:
test=webkit;test2=chromium;Expires=2019-10-19T10:33:18.797Z;Domain=.test.con
其中test和test2是自定義關鍵字,Expires和Domain是預定義關鍵字,表示失效時間和該Cookie對應的域。基於安全性考慮,一個網頁的Cookie只能被該網站自身訪問。根據失效時間Cookie分爲會話型(Session Cookie)和持久型(Persistent Cookie)。會話型當瀏覽器退出的時候即清除,沒有失效時間的Cookie就是會話型。而持久型Cookie當瀏覽器退出的時候仍然保留,直到失效時間。在有效期內,每次訪問服務器,瀏覽器都自動將Cookie帶上。
5. 高性能網絡棧-DNS預取和TCP預連接(preconnect)
DNS預取技術,主要思想是利用現有的DNS機制,提前解析網頁中可能的網絡連接。具體來講,當用戶正在瀏覽當前網頁的時候,Chromium提取網頁中的超鏈接,將域名抽取出來,利用比較少的CPU和網絡帶寬來解析這些域名或IP地址,用戶根本感覺不到這一過程。當用戶點擊這些超鏈接的時候會省不少時間。
寫網頁的時候可以指定預取哪些域名,具體做法是:
<link rel="dns-prefetch" href="http://test.com">
當然,DNS預取技術不僅應用於網頁中的超鏈接,當用戶在地址欄中輸入地址後,候選項同輸入的地址很匹配的時候,在用戶敲下回車鍵之前,Chromium已經開始使用DNS預取技術解析該域名了。