深度解析瀏覽器中輸入 URL 后發(fā)生了什么

先上張簡(jiǎn)單分析的圖:


思維導(dǎo)圖

1. DNS 域名解析

  • 第一步,瀏覽器會(huì)檢查緩存中有沒(méi)有這個(gè)域名對(duì)應(yīng)的解析過(guò)的 IP 地址,如果有,解析結(jié)束。
    瀏覽器中的緩存有時(shí)間空間限制。
  • 查找操作系統(tǒng)的緩存中是否有這個(gè)域名對(duì)應(yīng)的 DNS 解析結(jié)果。
    在 Windows 系統(tǒng)中通過(guò) C:\Windows\System32\drivers\etc\hosts 文件可以將域名解析到任何能夠訪問(wèn)的 IP 地址,瀏覽器會(huì)首先使用這個(gè)地址。Linux 中這個(gè)配置文件是 /etc/named.conf。
    緩存時(shí)間同樣受域名失效時(shí)間與緩存空間大小限制。
  • 如果以上還沒(méi)解析結(jié)束,操作系統(tǒng)會(huì)把域名發(fā)送到 LDNS ( Local DNS Server ),即本地區(qū)的域名服務(wù)器。
    到這里已經(jīng)可以解決 80% 的請(qǐng)求了。
  • 如果 LDNS 還沒(méi)有,直接到 Root Server 域名服務(wù)器請(qǐng)求解析。
  • 根域名服務(wù)器返回給本地域名服務(wù)器一個(gè)所查詢的主域名服務(wù)器( gTDL Server )地址。gTDL 是國(guó)際頂級(jí)域名服務(wù)器,如 .com、.cn 等。
  • 本地域名服務(wù)器再向主域名服務(wù)器發(fā)送請(qǐng)求。
  • 接受請(qǐng)求的主域名服務(wù)器查找并返回此域名對(duì)應(yīng)的 Name Server 域名服務(wù)器地址,它是注冊(cè)的域名服務(wù)器,如域名提供商的服務(wù)器。
  • Name Server 域名服務(wù)器查詢存儲(chǔ)的域名與 IP 的映射關(guān)系表,得到 IP 與 TTL值(TTL 值是控制返回時(shí)間的)。

2.建立TCP連接

TCP三次握手

  1. 第一次握手:建立連接??蛻舳税l(fā)送 SYN 包到服務(wù)器,Sequence Number 為 x,進(jìn)入 SYN_SENT 狀態(tài),等待服務(wù)器確認(rèn)。
  2. 第二次握手:服務(wù)器收到 SYN 包,對(duì)這個(gè)報(bào)文進(jìn)行確認(rèn),設(shè)置 Acknowledgment Number 為 Sequence Number + 1;同時(shí)自己也要發(fā)送 SYN 包,Sequence Number 為 y;服務(wù)器將這些所有信息放入 SYN + ACK 包中發(fā)送給客戶發(fā),服務(wù)器進(jìn)入 SYN_RCVD 狀態(tài)。
  3. 第三次握手:客戶端收到 SYN + ACK 包。將 Acknowledgment Number 設(shè)為 y + 1,即服務(wù)器發(fā)來(lái)的 Sequence Number + 1,并向服務(wù)器發(fā)送 ACK 包,發(fā)送完成后客戶端和服務(wù)器都進(jìn)入 ESTABLISHED 狀態(tài)。
TCP三次握手與四次揮手

3. 發(fā)起 HTTP 請(qǐng)求

請(qǐng)求方法

下面只列舉了 HTTP/1.1 支持的方法。

方法 說(shuō)明 備注
GET 獲取資源
POST 傳輸實(shí)體主體
DELETE 刪除文件 不帶驗(yàn)證機(jī)制,任何人都可以刪除
PUT 傳輸文件 不帶驗(yàn)證機(jī)制,任何人都可以上傳,存在安全問(wèn)題
TRACE 追蹤路徑 容易引發(fā) XSL 跨站攻擊
HEAD 獲得報(bào)文首部
OPTIONS 詢問(wèn)支持方法 查詢針對(duì)請(qǐng)求 URI 指定的資源支持的方法,響應(yīng)如 Allow: GET,POST,HEAD
CONNECT 要求用隧道協(xié)議連接代理 主要使用 SLL 和 TLS 協(xié)議把通信內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸

請(qǐng)求報(bào)文

請(qǐng)求報(bào)文

4. 接收響應(yīng)結(jié)果

狀態(tài)碼

狀態(tài)碼的類別

類別 原因
1XX Informational 請(qǐng)求的信息正在處理
2XX Success 請(qǐng)求正常處理完畢
3XX Redirection 需要進(jìn)行附加操作以完成請(qǐng)求
4XX Client Error 服務(wù)器無(wú)法處理請(qǐng)求
5XX Server Error 服務(wù)器處理請(qǐng)求出錯(cuò)

具體狀態(tài)

  • 2XX
    • 200 OK
      表示從客戶端發(fā)來(lái)的請(qǐng)求在服務(wù)器端被正常處理了
    • 204 No Content
      服務(wù)器接收的請(qǐng)求已成功處理,但在返回的響應(yīng)報(bào)文中不含實(shí)體的主體部分
    • 206 Partial Content
      客戶端進(jìn)行了范圍請(qǐng)求,而服務(wù)器成功執(zhí)行了這部分的請(qǐng)求。響應(yīng)報(bào)文中包含 Content-Range 指定范圍請(qǐng)求的實(shí)體內(nèi)容。
  • 3XX

    • 301 Move Permanently
      永久重定向。表示該資源已經(jīng)分配了新的 URI,以后應(yīng)使用資源現(xiàn)在的 URI。
    • 302 Found
      臨時(shí)重定向。表示該資源已經(jīng)分配了新的 URI,希望用戶本次能使用新的 URI 訪問(wèn)。
      與 301 不同的是,302 已經(jīng)移動(dòng)的資源對(duì)應(yīng)的 URI 將來(lái)還有可能改變。
    • 303 See Other
      由于請(qǐng)求對(duì)應(yīng)的資源存在另一個(gè) URI,應(yīng)使用 GET 定向獲取請(qǐng)求的資源。
    • 304 Not Modified
      它與重定向沒(méi)有關(guān)系。
      服務(wù)器資源未改變,可直接使用客戶端未過(guò)期的緩存。304返回時(shí),不包含任何主體部分。
  • 4XX

    • 400 Bad Request
      請(qǐng)求報(bào)文中存在語(yǔ)法錯(cuò)誤。

    • 401 Unauthorized
      需要有通過(guò) HTTP 認(rèn)證的認(rèn)證信息

    • 403 Forbidden
      對(duì)請(qǐng)求資源的訪問(wèn)被服務(wù)器拒絕了

    • 404 Not Found
      無(wú)法找到請(qǐng)求的資源

  • 5XX

    • 500 Internal Server Error
      服務(wù)器端在執(zhí)行請(qǐng)求時(shí)發(fā)生了錯(cuò)誤
    • 503 Service Unavailable
      服務(wù)器暫時(shí)處于超負(fù)載狀態(tài)或正在維護(hù)

響應(yīng)報(bào)文

響應(yīng)報(bào)文

5. 瀏覽器解析 HTML

渲染引擎開(kāi)始解析 HTML / SVG / XHTML,并將標(biāo)簽轉(zhuǎn)化為內(nèi)容樹(shù)中的 DOM 節(jié)點(diǎn),產(chǎn)生 DOM Tree。接著,它解析 CSS 文件以及標(biāo)簽中的 style 樣式信息,形成 CSSOM 樹(shù)。DOM 樹(shù)與 CSSOM 樹(shù)共同構(gòu)成 Render Tree,即渲染樹(shù)。

6. 瀏覽器布局渲染

渲染的流程:

  • 計(jì)算 CSS 樣式
  • 構(gòu)建 Render Tree
  • Layout 布局
  • 繪制

Reflow / Layout:發(fā)生在元素尺寸改變時(shí),或者將 displayblock 變?yōu)?none 時(shí)。

Repaint:屏幕的一部分要重繪時(shí),如某個(gè)元素背景色的變化。

注:Reflow 的成本比 Repaint 的成本大很多。

值得注意的是,這個(gè) 5、6 是逐步完成的,為了更好的用戶體驗(yàn),渲染引擎將會(huì)盡可能早的將內(nèi)容呈現(xiàn)到屏幕上,并不會(huì)等到所有的html都解析完成之后再去構(gòu)建和布局render樹(shù)。它是解析完一部分內(nèi)容就顯示一部分內(nèi)容,同時(shí),可能還在通過(guò)網(wǎng)絡(luò)下載其余內(nèi)容。

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容