輸入一個url全過程詳解

1. 用戶在瀏覽器中輸入url,瀏覽器接收到url。

2.瀏覽器接收到這個url之後,會根據這個url會先查看緩存,如果有緩存且沒有過期的話直接提供給客戶端,完成頁面渲染。

3.否則瀏覽器就會通過DNS解析url ,獲得協議名、主機名、端口號。

  DNS解析詳解:

  1.    輸入域名時,操作系統會先檢查自己本地host文件中是否有這個網址的映射關係,如果有,就調用這個IP地址映射,完成域名解析。

  2. 如果host沒有這個域名的映射,則查找本地的DNS解析器緩存,是否有這個網址映射關係,如果有,直接返回,完成域名解析。

  3. 如果本地解析器緩存沒有的話,則查找本地DNS服務器,如果要查詢的域名包含在本地配置資源中,則完成域名解析。

  4. 如果本地DNS服務器沒有的話,就會請求根服務器,根服務器就會返回一個負責該區域的主服務器IP

  5. 本地域名服務器根據主服務器IP,鏈接到這個主域名服務器,如果有這個域名的話,就調用這個IP地址映射,完成域名解析。如果沒有的話,則遞歸請求下一級域名服務器,直到找到對應的域名

4.然後瀏覽器就會根據這個IP跟對應的服務端建立tcp連接

TCP三次握手

  1. 第一次握手:客戶端向服務器發送一個 SYN=1 報文,並指定客戶端的初始化序列號 seq=x。此時客戶端處於SYN_Sent 狀態

  2. 第二次握手:服務器接收到客戶端的 SYN=1 報文後,同意連接的話,會發出一段確定報文。確定報文中應該ACK= 1,SYN= 1,確認號是ack=x+1,同時也要為自己初始化一個序列號seq=y.此時服務器處於 SYN-RCVD

  3. 第三次握手:客戶端接收到 SYN 報文之後,還會向服務器發送確定。確定報文的 ACK=1,ack=y+1 ,自己的序列號變成 x+1。TCP 連接建立,客戶端處於 已連接狀態 。

5.當服務器接受到客戶端的確認後也進入了 已連接狀態 。此時雙方就可以開始通信了

6.接下來就是瀏覽器向服務器發送HTTP請求

TCP 連接建立之後,瀏覽器端會構建請求行、 請求頭等信息,並把和該域名相關的 Cookie 等數據附加到請求頭中,然後向服務器發送構建的請求信息。如果是 HTTPS,還需要進行 TSL 協商。服務器還會檢查 HTTP 的請求頭,看是否包含緩存信息。

7.服務器接受並解析這個請求然後發送一個數據包給瀏覽器

8.關閉瀏覽器與服務器之間的連接

TCP四次揮手

  1. 第一次揮手:客戶端向服務端發送一個FIN報文,報文中指定一個序列號。此時,客戶端處於 FIN_WAIT-1狀態
  2. 第二次揮手:服務端收到客戶端 發送的 FIN報文後,會將客戶端的序列號+1 作為ACK報文的序列號值發送給客戶端,表明收到了客戶端的報文。然後服務器就會處於 CLOSE-WAIT-1狀態
  3. 第三次揮手:服務端向客戶端發送 FIN報文,且指定一個序列號。此時,服務端處於 LAST_ACK狀態
  4. 第四次揮手:客戶端收到服務端發送的FIN報文後,會將服務端的序列號+1 作為ACK報文的序列號值發送給服務端,此時客戶端處於 TIME_WAIT 狀態。需要等服務端確定收到自己的ACK報文後才會進入 CLOSED 狀態
  5. 服務端接收到 ACK報文後,就關閉連接,處於 CLOSED 狀態。

9.瀏覽器就會根據這個數據包解析HTML文檔,構建DOM樹,構建CSSOM樹,解析js腳本,下載資源

渲染的具體過程

  1. 瀏覽器會通過 HTML Parser (HTML解析器)根據深度遍歷的原則,將html解析成 DOM tree (DOM 樹)。

  2. 瀏覽器會通過 CSS Parser (CSS解析器)將CSS 解析成 CSS Rule Tree(CSSOM 樹)。

  3. 瀏覽器會將 javascript 通過 DOM API 或者 CSSOM API 將 JS代碼進行解析並應用到布局中,且會呈現出響應式的結果。

  4. 根據 DOM 樹 與 CSSOM 樹構建出響應的 render Tree。

  5. 接下來就是進行重排(reflow)與重繪(repaint)。當頁面中任意一個節點的幾何尺寸發生變化的時候,就會觸發重排,就會重新計算頁面中所有的節點的位置。當頁面中任意元素的樣式屬性發生變化時(幾何尺寸不發生變化),就會發生重繪,重新繪畫發生變化的元素。重排一定會觸發重繪,而重繪不一定會有重排。

  6. paint:繪製。遍歷render Tree,並調用硬件圖形API 來繪製每個節點到頁面上。

10.最終就會顯示出這個頁面

Tags: