瀏覽器的地址欄輸入URL并按下回車后,
- 開啟網(wǎng)絡請求線程
- DNS域名解析
- 根據(jù)IP建立TCP連接(三次握手)
- HTTP發(fā)起請求
- 服務器處理請求,瀏覽器接收HTTP響應
- 瀏覽器解析渲染頁面
- 關閉TCP連接(四次揮手)
一、 開啟網(wǎng)絡請求線程
瀏覽器是多進程的,每打開一個tab頁,就相當于創(chuàng)建了一個獨立的瀏覽器進程,相同類型的標簽頁會合并到一個進程中。
瀏覽器進程包含:
- Browser進程:瀏覽器的主進程(負責協(xié)調(diào)、主控、只有一個)。
作用:(1)負責管理各個標簽的創(chuàng)建和銷毀;(2)負責瀏覽器頁面顯示;(3)負責資源的管理和下載 - 第三方插件進程:可以是多個進程,負責每一個第三方插件的使用,每一個第三方插件使用時候會創(chuàng)建一個對應的進程
- GPU進程:最多1個進程,負責3D繪制和硬件加速
- 瀏覽器渲染進程(Renderer進程):可以是多個線程,瀏覽器的內(nèi)核,每個tab頁一個進程,主要負責HTML、,css,js等文件的解析,執(zhí)行和渲染,以及事件處理等。
瀏覽器渲染進程(內(nèi)核進程)
每一個tab頁面是瀏覽器內(nèi)核進程,然后這個每一個進程是多線程的,它有幾大類子線程:
(1)GUI線程;(2)JS引擎線程;(3)事件觸發(fā)線程;(4)定時器線程;(5)異步的http網(wǎng)絡請求線程
通信過程
- Browser進程接收到用戶請求,獲取頁面內(nèi)容(譬如通過網(wǎng)絡下載資源),將該任務通過RendererHost接口傳遞給Renderer進程
- Renderer進程的Renderer接口收到消息,交給GUI渲染線程,開始渲染
*GUI渲染線程接收請求,加載網(wǎng)頁并渲染網(wǎng)頁,這其中可能需要Browser進程獲取資源和需要GPU進程來幫助渲染
*當然可能會有JS線程操作DOM(這樣會造成回流或重繪)
*最后Renderer進程將結果bitmap傳遞給Browser進程 - Browser進程接收到結果并將結果繪制出來
二、 DNS域名解析
IP地址是網(wǎng)絡上標識站點的數(shù)字地址,為了方便記憶,采用域名來代替IP地址標識站點地址,域名解析就是域名到IP地址的轉(zhuǎn)換過程。域名是與IP地址的一個映射。
過程:
1)用戶在瀏覽器輸入一個URL后,瀏覽器先找瀏覽器緩存,沒有就去本機緩存,沒有就看host文件有沒有,有就返回IP。
2)如果host文件沒有,就向本地DNS服務器查詢(遞歸查詢),如果沒有查到,就向根DNS服務器查詢(迭代查詢)。
注:我們本地硬盤下有一個hosts(windows下路徑為C:\Windows\System32\drivers\etc)文件,作用是將一些常用的網(wǎng)址域名與其對應的IP地址建立一個關聯(lián)“數(shù)據(jù)庫”。一般來說,系統(tǒng)會首先自動從hosts文件中尋找對應的IP地址,如果有的話就直接使用hosts文件里面的IP地址,然后直接進行端口確認。
遞歸查詢:在該模式下DNS服務器接收到客戶機請求,必須返回一個準確的查詢結果給客戶機。如果該DNS服務器本地沒有存儲被查詢的DNS信息,那么該服務器會(替客戶機)詢問其他服務器,并將返回的查詢結果再返回給客戶機。
迭代查詢:在該模式下DNS服務器接收到客戶機請求,如果該DNS服務器本地沒有存儲被查詢的DNS信息,DNS服務器會向客戶機提供其他能夠解析查詢請求的DNS服務器地址,讓客戶機再向這臺DNS服務器提交請求,依次循環(huán)直到返回查詢的結果為止。
DNS解析是很耗時的,因此如果解析域名過多,首屏加載會變慢,可以考慮使用dns-prefetch優(yōu)化。
六、瀏覽器解析渲染頁面
- 根據(jù) html 解析出 dom 樹
- 根據(jù) css 解析生成 css 規(guī)則樹
- 結合 dom 樹和 css 規(guī)則樹生成渲染樹
- 根據(jù)渲染樹計算每一個節(jié)點的信息
- 根據(jù)計算好的信息繪制頁面