原文地址:banggan.github.io/2019/02/20/…html
做爲前端開發,咱們日常跟瀏覽器打交道的時間也是最多的。在前端面試中,一個較爲經典的問題:在瀏覽器地址中輸入url地址,敲回車,發生了什麼?瀏覽器究竟作了什麼?相信不少人腦海裏都會出現個大概的輪廓,但是一到細化具體的過程就答不上來。那麼,做爲前端開發者,應該從哪些方面延伸來回答這個問題呢?前端
對於瀏覽器來講,當在地址欄輸入url地址,瀏覽器所作的事情就是把一個url變成一個在屏幕上顯示的網頁,大體的過程是這樣的: git
第一點主要涉及的是瀏覽器的進程、線程模型以及JS的運行機制:github
大多數瀏覽器是多進程的,有一個主控進程,以及每個tab頁面都會新開一個進程(某些狀況下多個tab會合並進程) 進程可能包括主控進程,插件進程,GPU,tab頁(瀏覽器內核)等等。面試
每個tab頁面能夠看做是瀏覽器內核進程,而後這個進程是多線程的,它有幾大類子線程:json
該部分主要包括:dns查詢、tcp/ip請求構建、五層因特網等內容segmentfault
若是輸入的是域名,須要進行dns解析成IP,大體流程:瀏覽器
這裏的tcp/ip請求須要瞭解3次握手規則創建鏈接以及斷開鏈接時的四次揮手,能夠參考以前的博客:blog.csdn.net/bangbanggan…緩存
其實這個概念挺難記全的,記不全不要緊,可是要有一個總體概念。 其實就是一個概念:從客戶端發出http請求到服務器接收,中間會通過一系列的流程。 簡括就是:從應用層的發送http請求,到傳輸層經過三次握手創建tcp/ip鏈接,再到網絡層的ip尋址,再到數據鏈路層的封裝成幀,最後到物理層的利用物理介質傳輸。 固然,服務端的接收就是反過來的步驟。 五層因特爾協議棧其實就是: 1.應用層(dns,http) 2.傳輸層(tcp,udp) 創建tcp鏈接(三次握手) 3.網絡層(IP,ARP) IP尋址 4.數據鏈路層(PPP) 5.物理層 OSI七層框架: 物理層、 數據鏈路層、 網絡層、 傳輸層、 會話層、 表示層、 應用層。 表示層:主要處理兩個通訊系統中交換信息的表示方式,包括數據格式交換,數據加密與解密,數據壓縮與終端類型轉換等 會話層:它具體管理不一樣用戶和進程之間的對話,如控制登錄和註銷過程服務器
HTTP協議是基於TCP協議出現的,在TCP的基礎上規定了Request-Response的模型,決定了通信必須由瀏覽器端發起的,首先來了解下HTTP協議的格式:
HTTP協議大體能夠分紅如下部分:其中path是請求路徑、version是固定的字符串,依次介紹下面的每一個部分:
在requestline裏面的方法部分,表示HTTP的操做類型,常見的幾種請求方法以下:
常見的狀態碼有如下幾種:
在前端開發中,最熟悉的系列無非是你們都喜歡的200請求成功的標誌,在面試中,問得較多的是304緩存問題和30一、302重定向的問題。
HTTP頭能夠看作是一個鍵值對,在HTTP標準中,Request Header以下圖:
HTTP請求的body主要用於表單的提交,常見的body格式:
HTTPS在HTTP的基礎上增長了兩個做用,一是肯定請求的目標服務端身份,二是保證傳輸的數據不會被篡改或者竊聽,該協議使用加密通道來傳輸HTTP內容,因此首先須要與服務端簡歷TLS加密通道。能夠在此處查看詳情:tools.ietf.org/html/rfc281…
HTTP2是HTTP1.1的升級版,有兩大改進:一是支持服務端推送,二是支持TCP連接複用:則使用同一個TCP連接來傳輸多個HTTP請求。詳情見:tools.ietf.org/html/rfc754…
當瀏覽器使用HTTP向服務端請求頁面後,那麼如何去解析請求回來的HTML代碼、構建DOM樹呢?
首先瀏覽器讀取獲取的HTML,根據指定的文件編碼方式如UTF-8轉換爲字符流,再將字符串轉換爲詞Token。那什麼是詞?詞是編譯原理中的最小單元,如標籤開始、屬性、標籤結束、註釋、CDATA節點。Token會標識出當前Token的種類。舉個列子: <p class="a" >hello</p>
這裏就能夠拆分紅<p(p標籤的開始)、class="a"(屬性)、>(p標籤的結束)、hello(文本)、</p>
(結束標籤)
接下來就是將詞變成DOM樹。在構建DOM樹時,是一邊生成Token一邊消耗Token來生成節點的。
<html>
<head>
<title>Web page parsing</title>
</head>
<body>
<div>
<h1>Web page parsing</h1>
<p>This is an example Web page.</p>
</div>
</body>
</html>
複製代碼
構建的DOM樹:
在構建完DOM樹,當前的對象只包含節點和屬性,沒有任何樣式信息,那麼瀏覽器是如何給DOM樹添加CSS屬性呢?咱們知道瀏覽器是流式的處理整個過程,咱們拿到DOM樹構造好的元素,依次去檢查他匹配的規則,再根據規則的優先級,作覆蓋和調整。
當CSSOM樹和DOM樹都獲得以後,將兩個樹進行合併就獲得了渲染樹:
當瀏覽器生成渲染樹之後,就會根據渲染樹來進行佈局。在這個過程當中,每個元素都要要弄清楚各個節點在頁面中的確切位置和大小,把對應的盒變爲相應的位圖。一個元素可能對應多個盒(如內聯元素,可能被分紅多行)每個盒都對應着一個位圖。合成把部分位圖合成變成合成層。最終的繪製過程就是把位圖合成層繪製到屏幕上。 這裏提一個常見的問題,重繪和迴流?具體的相關知識參考:segmentfault.com/a/119000001…
瀏覽器的工做流程大體就是:
構建DOM樹-構建CSSOM-構建渲染樹-佈局-繪製