對於網址欄的URL不同的操作方式有不同的載入資源、獲取數據的方式,下麵的詳細過程針對"在地址欄輸入URL,按enter(回車)鍵載入資源"此種操作方式做解析,其它的方式的過程大同小異,差異會在後面再做分析。 1. 瀏覽器開啟一個線程來處理這個請求,對URL判斷如果是http協議就按照web方式處理; ...
對於網址欄的URL不同的操作方式有不同的載入資源、獲取數據的方式,下麵的詳細過程針對"在地址欄輸入URL,按enter(回車)鍵載入資源"此種操作方式做解析,其它的方式的過程大同小異,差異會在後面再做分析。
1. 瀏覽器開啟一個線程來處理這個請求,對URL判斷如果是http協議就按照web方式處理;
2. 瀏覽器先查看瀏覽器緩存-系統緩存-路由器緩存,如果緩存中有,會直接在屏幕中顯示頁面內容(此時沒有向服務端發請求)。若沒有,則進行下一步操作(後面需要向服務端發送請求);
3. 通過DNS解析獲取網址的IP地址;
4. 向真實IP地址伺服器發起tcp連接,與瀏覽器建立tcp三次握手。
5. 握手成功後,進行HTTP協議會話,瀏覽器發送報頭(請求報頭);
6. 進入到web伺服器上的 Web Server,如 Apache、Tomcat、Node.JS 等伺服器;
7. 進入部署好的後端應用,如 PHP、Java、JavaScript、Python 等,找到對應的請求處理;
8. 處理結束回饋報頭,將數據返回至瀏覽器;
9. 瀏覽器開始下載html文檔(響應報頭,狀態碼200),同時設置緩存;
10. 之後瀏覽器對整個 HTML 結構進行解析,形成 DOM 樹;與此同時,它還需要對相應的 CSS 文件進行解析,形成 CSS 樹(CSSOM)。
接下來,需要結合 DOM + CSSOM,形成一個繪製樹(Render Tree);
11. 得到繪製樹之後,需要計算每個結點在頁面中的位置,這一個過程稱為layout ;
12. layout的過程是在一個連續的二維平面上進行的,接下來,需要將這些結果柵格化,映射到屏幕的離散二維平面上,這一過
程稱為 paint ; 現代瀏覽器為提升性能,將頁面劃分多個 layer,各自進行 paint 然後組合成一個頁面(composite layers)。
PS: 開頭說到的"對於網址欄的URL不同的操作方式有不同的載入資源、獲取數據的方式"中其他方式的過程與上面方式差不多,只是在處理緩存這一環節上有些不同:
1. “轉至”或地址欄里回車刷新:見上
2. F5刷新:沒有第2步,在第8步判斷返回值,如果返回304則表示有緩存,且此時直接用緩存;如果返回200則表示沒有緩存,順序執行至最後
3. Ctrl+F5刷新網頁的區別:沒有第2步,且在第8步一定返回200並順序執行至最後
(對於以上3種不同方式更好的應該從http協議的緩存機制上做區分更容易理解,此處更側重'向服務端發送請求及其返回值'這方面做一下區別)
PS: 10-12步更側重於前端渲染頁面過程,詳細可參考:http://www.jianshu.com/p/016e8e78eb1f