輸入一個url全過程詳解
1. 用戶在瀏覽器中輸入url,瀏覽器接收到url。
2.瀏覽器接收到這個url之後,會根據這個url會先查看緩存,如果有緩存且沒有過期的話直接提供給客戶端,完成頁面渲染。
3.否則瀏覽器就會通過DNS解析url ,獲得協議名、主機名、端口號。
DNS解析詳解:
-
輸入域名時,操作系統會先檢查自己本地host文件中是否有這個網址的映射關係,如果有,就調用這個IP地址映射,完成域名解析。
-
如果host沒有這個域名的映射,則查找本地的DNS解析器緩存,是否有這個網址映射關係,如果有,直接返回,完成域名解析。
-
如果本地解析器緩存沒有的話,則查找本地DNS服務器,如果要查詢的域名包含在本地配置資源中,則完成域名解析。
-
如果本地DNS服務器沒有的話,就會請求根服務器,根服務器就會返回一個負責該區域的主服務器IP
-
本地域名服務器根據主服務器IP,鏈接到這個主域名服務器,如果有這個域名的話,就調用這個IP地址映射,完成域名解析。如果沒有的話,則遞歸請求下一級域名服務器,直到找到對應的域名
4.然後瀏覽器就會根據這個IP跟對應的服務端建立tcp連接
TCP三次握手:
-
第一次握手:客戶端向服務器發送一個 SYN=1 報文,並指定客戶端的初始化序列號 seq=x。此時客戶端處於SYN_Sent 狀態
-
第二次握手:服務器接收到客戶端的 SYN=1 報文後,同意連接的話,會發出一段確定報文。確定報文中應該ACK= 1,SYN= 1,確認號是ack=x+1,同時也要為自己初始化一個序列號seq=y.此時服務器處於 SYN-RCVD
-
第三次握手:客戶端接收到 SYN 報文之後,還會向服務器發送確定。確定報文的 ACK=1,ack=y+1 ,自己的序列號變成 x+1。TCP 連接建立,客戶端處於 已連接狀態 。
5.當服務器接受到客戶端的確認後也進入了 已連接狀態 。此時雙方就可以開始通信了
6.接下來就是瀏覽器向服務器發送HTTP請求
TCP 連接建立之後,瀏覽器端會構建請求行、 請求頭等信息,並把和該域名相關的 Cookie 等數據附加到請求頭中,然後向服務器發送構建的請求信息。如果是 HTTPS
,還需要進行 TSL
協商。服務器還會檢查 HTTP 的請求頭,看是否包含緩存信息。
7.服務器接受並解析這個請求然後發送一個數據包給瀏覽器
8.關閉瀏覽器與服務器之間的連接
TCP四次揮手:
- 第一次揮手:客戶端向服務端發送一個FIN報文,報文中指定一個序列號。此時,客戶端處於 FIN_WAIT-1狀態
- 第二次揮手:服務端收到客戶端 發送的 FIN報文後,會將客戶端的序列號+1 作為ACK報文的序列號值發送給客戶端,表明收到了客戶端的報文。然後服務器就會處於 CLOSE-WAIT-1狀態
- 第三次揮手:服務端向客戶端發送 FIN報文,且指定一個序列號。此時,服務端處於 LAST_ACK狀態
- 第四次揮手:客戶端收到服務端發送的FIN報文後,會將服務端的序列號+1 作為ACK報文的序列號值發送給服務端,此時客戶端處於 TIME_WAIT 狀態。需要等服務端確定收到自己的ACK報文後才會進入 CLOSED 狀態
- 服務端接收到 ACK報文後,就關閉連接,處於 CLOSED 狀態。
9.瀏覽器就會根據這個數據包解析HTML文檔,構建DOM樹,構建CSSOM樹,解析js腳本,下載資源
渲染的具體過程:
-
瀏覽器會通過 HTML Parser (HTML解析器)根據深度遍歷的原則,將html解析成 DOM tree (DOM 樹)。
-
瀏覽器會通過 CSS Parser (CSS解析器)將CSS 解析成 CSS Rule Tree(CSSOM 樹)。
-
瀏覽器會將 javascript 通過 DOM API 或者 CSSOM API 將 JS代碼進行解析並應用到布局中,且會呈現出響應式的結果。
-
根據 DOM 樹 與 CSSOM 樹構建出響應的 render Tree。
-
接下來就是進行重排(reflow)與重繪(repaint)。當頁面中任意一個節點的幾何尺寸發生變化的時候,就會觸發重排,就會重新計算頁面中所有的節點的位置。當頁面中任意元素的樣式屬性發生變化時(幾何尺寸不發生變化),就會發生重繪,重新繪畫發生變化的元素。重排一定會觸發重繪,而重繪不一定會有重排。
-
paint:繪製。遍歷render Tree,並調用硬件圖形API 來繪製每個節點到頁面上。