從輸入 URL 到頁面加載完成的過程中都發生了什么

話說這個前端面試經常問的題目,但仔細查閱了一下資料,發現想要很深入地理解,還是非常困難的,所以自己打算簡單梳理一遍,不討論過多細節,以便加深記憶。

主要流程:

1. 輸入URL

首先輸入URL,瀏覽器可能會做一些預處理,一般會根據之前的統計記錄來預判輸入字符可能對應的URL,比如輸入bai,瀏覽器根據之前的瀏覽記錄發現可能會訪問www.baidu.com,從而開始建立TCP (Transmission Control Protocol)鏈接甚至開始渲染,輸入URL后,瀏覽器會對URL進行檢查,首先判斷協議,還會判斷URL的安全性,接著就準備DNS解析了。

2. DNS解析

首先了解2個概念:

  • IP地址:IP 協議為互聯網上的每一個網絡和每一臺主機分配的一個邏輯地址。IP 地址如同門牌號碼,通過 IP 地址才能確定一臺主機位置。服務器本質也是一臺主機,想要訪問某個服務器,必須先知道它的 IP 地址,IP 地址由四個數字組成,中間用點號連接。
  • 補充說明:光靠IP地址也是無法通信的,因為IP地址并非和某臺設備綁定,比如你的電腦在家IP地址為192.168.1.1,但是到辦公室就變成172.22.22.22 了,這就需要我們的MAC(media access control) 地址,這是固定并且唯一的。
  • DNS:Domain Name System的縮寫,即域名系統。它是internet提供一項服務,也叫域名解析服務,主要作用是將域名解析成對應的IP地址,域名系統分為正向解析和反向解析,正向解析就是講域名解析成IP地址,反向是講IP地址解析成域名,一般用于后端。

域名與IP地址之間是呈一一對應的關系,但多個域名可以對應同一個IP地址。由于IP地址全是數字,為了簡單好記,采用域名來代替IP地址表示站點地址。
在Internet上,一個域名要由兩臺域名服務器提供“權威性的”域名解析,這兩臺域名服務器,和您的域名一起被登記在域名注冊管理機構的數據庫中,如果是國際域名,域名注冊管理機構就是Internic;如果是國內域名,域名注冊管理機構就是CNNIC(China Internet Network Information Center),這兩臺“權威性的”服務器,一主一輔,保存著相同的記錄,主要是為了提高可靠性。域名注冊管理機構的數據庫的記錄最終體現在“根”域名服務器上。

DNS解析過程:

  1. 瀏覽器搜索自己DNS緩存
  2. 從系統hosts文件中查找DNS緩存
  3. 搜索路由器的DNS緩存
  4. 搜索ISP中的DNS緩存
  5. 如果還未找到對應IP地址,則向根服務器查找域名對應IP, 根域名服務器把請求發到下一級,直到找到IP
  6. 將得到的IP返回給操作系統,同時自己也將IP地址緩存起來(這個緩存的記錄有一個失效期,當失效期到了后,您的主控DNS服務器將會自動丟棄緩存的記錄)
  7. 操作系統將IP返回給瀏覽器,同時瀏覽器也將IP地址緩存起來

3. 通過 Socket 發送數據

  • 調用 Socket API 后內核會對數據進行底層協議棧的封裝,接下來啟動 DMA(direct memory access)控制器,它將從內存中讀取數據寫入網卡。
  • 連接 Wi-Fi 路由,Wi-Fi 網卡需要通過 Wi-Fi 路由來與外部通信,原理是基于無線電,通過電流變化來產生無線電,這個過程也叫「調制」,而反過來無線電可以引起電磁場變化,從而產生電流變化,利用這個原理就能將無線電中的信息解讀出來就叫「解調」。因為內網設備的 IP 都是類似 192.168.1.x這樣的內網地址,外網無法直接向這個地址發送數據,所以網絡數據在經過路由時,路由會修改相關地址和端口,這個操作稱為 NAT(Network Address Translation)映射。家庭路由一般會通過雙絞線連接到運營商網絡的。
  • 數據過雙絞線發送到運營商網絡后,還會經過很多個中間路由轉發,當數據傳遞到這些路由器后,路由器會取出包中目的地址的前綴,通過內部的轉發表查找對應的輸出鏈路
  • 數據最終通過光纖進入服務器機房,最后通過交換機的端口將數據發往機架中的服務器

4. 建立連接--三次握手

  • 主機向服務器發送一個建立連接的請求(您好,我想認識您)
  • 服務器接到請求后發送同意連接的信號(好的,很高興認識您)
  • 主機接到同意連接的信號后,再次向服務器發送了確認信號(我也很高興認識您),自此,主機與服務器兩者建立了連接

5.網頁請求

當服務器與主機建立了連接之后,下面主機便與服務器進行通信。網頁請求是一個單向請求的過程,即是一個主機向服務器請求數據,服務器返回相應的數據的過程

  • 瀏覽器根據 URL 內容生成 HTTP 請求,請求中包含請求文件的位置、請求文件的方式等等
  • 服務器接到請求后,會根據 HTTP 請求中的內容來決定如何獲取相應的 HTML 文件
  • 服務器將得到的 HTML 文件發送給瀏覽器
  • 在瀏覽器還沒有完全接收 HTML 文件時便開始渲染、顯示網頁
  • 在執行 HTML 中代碼時,根據需要,瀏覽器會繼續請求圖片、CSS、JavsScript等文件,過程同請求 HTML

6. 網頁渲染

主流程示例

webkit主流程
webkit主流程

簡單點說就是:

  • 呈現引擎將開始解析 HTML 文檔,并將各標記逐個轉化成“內容樹”上的 DOM節點。同時也會解析外部 CSS 文件以及樣式元素中的樣式數據。HTML 中這些帶有視覺指令的樣式信息將用于創建另一個樹結構:呈現樹。
  • 呈現樹包含多個帶有視覺屬性(如顏色和尺寸)的矩形。這些矩形的排列順序就是它們將在屏幕上顯示的順序。
  • 呈現樹構建完畢之后,進入“布局”處理階段,也就是為每個節點分配一個應出現在屏幕上的確切坐標。下一個階段是繪制- 呈現引擎會遍歷呈現樹,由用戶界面后端層將每個節點繪制出來。

1. 解析

html解析生成DOM樹
瀏覽器中的呈現引擎(render engine)解析html文檔,呈現引擎解析的語法是過程可以分為2部分:詞法分析和語法分析。詞法分析器(有時也稱為標記生成器),負責將輸入內容分解成一個個有效標記;而解析器負責根據語言的語法規則分析文檔的結構,從而構建解析樹。
因為常規解析器用的是與上下文無關的語法,而html語言比較“寬容”,對常見的無效html用法采取包容態度等原因,所以它的語法不是與上下文無關的語法,不能用常規解析器來解析(但css和JavaScript 可以),所以需要一些工具自動生成解析器,您只要向其提供您所用語言的語法(詞匯和語法規則),它就會生成相應的解析器。WebKit 使用了兩種非常有名的解析器生成器:用于創建詞法分析器的 Flex 以及用于創建解析器的 Bison(您也可能遇到 Lex 和 Yacc 這樣的別名)。Flex 的輸入是包含標記的正則表達式定義的文件。Bison 的輸入是采用 BNF 格式的語言語法規則。HTML 解析器的任務是將 HTML 標記解析成解析樹。
解析器的輸出“解析樹”是由 DOM 元素和屬性節點構成的樹結構。DOM 與標記之間幾乎是一一對應的關系。比如下面這段標記:

<html>
  <body>
    <p>
      Hello World
    </p>
    <div> ![](example.png)</div>
  </body>
</html>

可以翻譯成下面的DOM樹


CSS解析生成CSS規則樹
瀏覽器解析器都會將 CSS 文件解析成 StyleSheet 對象,且每個對象都包含 CSS 規則。CSS 規則對象則包含選擇器和聲明對象,以及其他與 CSS 語法對應的對象。
CSS解析
CSS解析

腳本解析
網絡的模型是同步的。網頁作者希望解析器遇到 <script> 標記時立即解析并執行腳本。文檔的解析將停止,直到腳本執行完畢。如果腳本是外部的,那么解析過程會停止,直到從網絡同步抓取資源完成后再繼續。此模型已經使用了多年,也在 HTML4 和 HTML5 規范中進行了指定。作者也可以將腳本標注為“defer”,這樣它就不會停止文檔解析,而是等到解析結束才執行。HTML5 增加了一個選項,可將腳本標記為異步,以便由其他線程解析和執行。

2. 呈現樹構建

在 DOM 樹構建的同時,瀏覽器還會構建另一個樹結構:呈現樹。這是由可視化元素按照其顯示順序而組成的樹,也是文檔的可視化表示。呈現器是和 DOM 元素相對應的,但并非一一對應。非可視化的 DOM 元素不會插入呈現樹中,例如“head”元素。如果元素的 display 屬性值為“none”,那么也不會顯示在呈現樹中(但是 visibility 屬性值為“hidden”的元素仍會顯示)。
在 WebKit 中,解析樣式和創建呈現器的過程稱為“附加”。每個 DOM 節點都有一個“attach”方法。附加是同步進行的,將節點插入 DOM 樹需要調用新的節點“attach”方法。

3. 布局

HTML 采用基于流的布局模型,這意味著大多數情況下只要一次遍歷就能計算出幾何信息。處于流中靠后位置元素通常不會影響靠前位置元素的幾何特征,因此布局可以按從左至右、從上至下的順序遍歷文檔。但是也有例外情況,比如 HTML 表格的計算就需要不止一次的遍歷。布局是一個遞歸的過程。它從根呈現器(對應于 HTML 文檔的 <html> 元素)開始,然后遞歸遍歷部分或所有的框架層次結構,為每一個需要計算的呈現器計算幾何信息。

4.繪制

在繪制階段,系統會遍歷呈現樹,并調用呈現器的“paint”方法,將呈現器的內容顯示在屏幕上。繪制工作是使用用戶界面基礎組件完成的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容