魯斯前端布魯斯前端

文章中英模式

布魯斯前端面試題目 - 從輸入網址到頁面顯示的過程

深入解析從瀏覽器輸入URL到頁面完全載入的完整過程,包含DNS查詢、TCP連接、HTTP請求、渲染過程等環節,掌握前端面試中的網路與瀏覽器核心知識。

影片縮圖

懶得看文章?那就來看影片吧

從輸入網址到頁面顯示的完整流程概述

當你在瀏覽器地址欄輸入一個URL並按下Enter後,會經過以下主要階段:

  1. 1. URL解析
  2. 2. DNS解析(網域名稱 → IP地址)
  3. 3. 建立TCP連接
  4. 4. 發送HTTP請求
  5. 5. 服務器處理請求並返回HTTP響應
  6. 6. 瀏覽器解析HTML並請求其他資源
  7. 7. 瀏覽器渲染頁面
  8. 8. 關閉連接
  ┌──────────────────────────────────────────────────┐
  │                                                  │
  │  1️⃣ URL解析                                      │
  │  https://example.com/page                       │
  │                                                 │
  │  2️⃣ DNS解析                                      │
  │  example.com ──> IP (93.184.216.34)            │
  │                                                 │
  │  3️⃣ TCP連接                                      │
  │  客戶端 ⇄ 服務器 (三次握手)                       │
  │                                                 │
  │  4️⃣ HTTP請求                                     │
  │  GET /page HTTP/1.1 ──>                        │
  │                                                 │
  │  5️⃣ 服務器響應                                    │
  │  <── 200 OK + HTML內容                          │
  │                                                 │
  │  6️⃣ 請求其他資源                                  │
  │  獲取 CSS/JS/圖片                                │
  │                                                 │
  │  7️⃣ 渲染頁面                                     │
  │  DOM ──> CSSOM ──> 渲染 ──> 佈局 ──> 繪製        │
  │                                                 │
  │  8️⃣ 關閉連接                                     │
  │                                                 │
  └──────────────────────────────────────────────────┘

接下來我們會詳細解釋每個階段發生的事情。

第一階段: URL解析

瀏覽器首先解析URL的各個部分:

https://www.example.com:443/path/to/page?query=string#fragment
|-----||--------------||---||------------||-----------||----|
 協議     主機(域名)    端口    路徑          查詢參數    片段
  • 1. 協議(Protocol): http, https, ftp等
  • 2. 主機(Host): 網域名稱或IP地址
  • 3. 端口(Port): 特定服務的通信端口(如HTTP默認80,HTTPS默認443)
  • 4. 路徑(Path): 服務器上資源的路徑
  • 5. 查詢參數(Query string): 向服務器傳遞的參數
  • 6. 片段(Fragment): 頁面內的錨點,僅瀏覽器使用不發送給服務器

第二階段: DNS解析過程

DNS將網址(如www.example.com)轉換為電腦能理解的IP地址(如192.168.1.1)。

DNS查詢的順序:

  1. 1. 瀏覽器緩存: 先看瀏覽器是否記住這個網址
  2. 2. 電腦緩存: 再看電腦是否記住
  3. 3. 路由器緩存: 再問家裡的路由器
  4. 4. 網路供應商: 最後問網路供應商(ISP)
  5. 5. DNS伺服器查詢: 如果都沒有,就向網路上的DNS伺服器一層層查詢

DNS解析需要時間,這就是為什麼網站會使用CDN來加速這個過程。

第三階段: 建立連接

找到IP地址後,瀏覽器需要與伺服器建立連接:

TCP三次握手:

  1. 1. 第一次握手: 瀏覽器說「嗨,我想連接」
  2. 2. 第二次握手: 伺服器回應「好的,我收到了,可以連接」
  3. 3. 第三次握手: 瀏覽器說「太好了,我們開始通訊吧」

HTTPS的安全握手:

如果是HTTPS網站,在TCP連接後還會進行安全握手:

  1. 1. 打招呼: 瀏覽器說「我能用這些加密方式」
  2. 2. 確認方式: 伺服器選一種加密方式回應
  3. 3. 身分確認: 伺服器出示「身分證」(數位證書)
  4. 4. 交換密鑰: 雙方協商出一把「密鑰」
  5. 5. 開始加密: 之後的通訊都用這把密鑰加密

這就像你和銀行通話前,先確認對方真的是銀行,然後用只有你們知道的暗號交談,防止別人偷聽。這也是為什麼HTTPS比HTTP多花一點時間,但更安全。

第四階段: 發送HTTP請求

TCP連接建立後,瀏覽器構造HTTP請求發送到服務器:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)...
Accept: text/html,application/xhtml+xml,...
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
Cookie: user_session=abc123; visit_count=5

HTTP請求包含:

  • 1. 請求行: 包含HTTP方法(GET, POST等)、請求路徑和HTTP版本
  • 2. 請求頭: 包含各種元數據如User-Agent, Accept等
  • 3. 請求體: GET通常無請求體,POST包含表單數據等
  • 4. Connection: keep-alive: 告訴服務器保持TCP連接開啟,讓多個HTTP請求共用同一連接。HTTP/1.1預設啟用,無需配置。這減少了建立新連接的開銷,加快頁面載入速度。

第五階段: 服務器處理請求並返回響應

服務器接收請求後:

  1. 1. 服務器解析HTTP請求
  2. 2. 執行必要的處理(查詢數據庫、處理業務邏輯等)
  3. 3. 組裝HTTP響應並返回
HTTP/1.1 200 OK
Date: Mon, 23 May 2023 22:38:34 GMT
Server: Apache/2.4.52 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Content-Length: 138
Cache-Control: max-age=3600

<!DOCTYPE html>
<html>
<head>
  <title>Example Website</title>
</head>
<body>
  <h1>Hello, World!</h1>
  <!-- 頁面內容 -->
</body>
</html>

HTTP響應包含:

  • 1. 狀態行: HTTP版本、狀態碼和狀態信息
  • 2. 響應頭: 包含各種元數據
  • 3. 響應體: 包含實際的HTML內容或其他資源

第六階段: 瀏覽器解析HTML並請求其他資源(CRP路徑)

瀏覽器收到HTML後:

  1. 1. 解析HTML,構建DOM樹
  2. 2. 遇到外部資源(CSS, JavaScript, 圖片等)時發起新的HTTP請求
  3. 3. 解析CSS,構建CSSOM樹
  4. 4. 執行JavaScript代碼,可能會修改DOM和CSSOM

在這個過程中,瀏覽器可能會並行發起多個請求,但受到HTTP協議版本和瀏覽器限制:

  • 1. HTTP/1.1: 每個域名有6-8個並行連接限制
  • 2. HTTP/2: 單個連接可處理多個請求,大幅提高性能

第七階段: 瀏覽器渲染頁面(CRP路徑)

所有必要資源加載後,瀏覽器進行渲染過程:

  1. 1. 計算樣式: 結合DOM和CSSOM,確定每個節點的最終樣式
  2. 2. 布局(Layout/Reflow): 計算每個元素在屏幕上的位置和大小
  3. 3. 繪製(Paint): 填充像素,繪製文字、顏色、圖像等
  4. 4. 合成(Compositing): 將不同層合成到一起

這個過程非常複雜,現代瀏覽器會進行各種優化:

  • 1. 增量渲染: 不等所有資源加載完就開始渲染
  • 2. 分層渲染: 將頁面分成多個層進行獨立處理
  • 3. 硬體加速: 使用GPU加速某些渲染操作

第八階段: 關閉連接

頁面完全載入後,如果HTTP頭中指定了"Connection: close",TCP連接會關閉,通過四次揮手過程:

如果使用HTTP/1.1的Keep-Alive機制或HTTP/2,連接可能保持打開狀態以便復用,提高性能。

🔥 常見面試題目

(一) 簡述從地址欄輸入URL到頁面顯示的完整過程?

解答:完整過程包含以下關鍵步驟:

  +-------------+    +-------------+    +-------------+    +-------------+
  |   網路階段  | -> |   響應階段  | -> |   解析階段  | -> |   渲染階段  |
  +-------------+    +-------------+    +-------------+    +-------------+
  | 1. URL解析  |    | 1. 處理請求 |    | 1. 構建DOM  |    | 1. 樣式計算 |
  | 2. DNS查詢  |    | 2. 返回響應 |    | 2. 構建CSSOM|    | 2. 布局     |
  | 3. TCP連接  |    | 3. 接收數據 |    | 3. 執行JS   |    | 3. 繪製     |
  | 4. HTTP請求 |    |             |    |             |    | 4. 合成     |
  +-------------+    +-------------+    +-------------+    +-------------+

  流程順序:
  輸入URL ➜ URL解析 ➜ DNS查詢 ➜ TCP連接 ➜ (HTTPS則加SSL/TLS) ➜ HTTP請求 ➜
  服務器處理 ➜ 返回響應 ➜ 解析HTML/CSS/JS ➜ 渲染頁面 ➜ 頁面交互

重點是理解這個過程涉及網路通信、服務器處理、瀏覽器解析與渲染四大階段,每個階段都有優化空間。

(二) 瀏覽器渲染過程中的關鍵路徑是什麼?如何優化?

解答:參考前端性能優化題目的 解釋網頁的渲染過程(CRP路徑)

(三) HTTPS對比HTTP在這個過程中增加了哪些步驟?

解答:HTTPS在HTTP基礎上增加了SSL/TLS握手過程,主要用於建立安全連接:

  客戶端                                      服務器
    |                                            |
    |  -------- Client Hello --------------->   |  1. 發送支持的加密套件和隨機數
    |                                            |
    |  <------- Server Hello ----------------   |  2. 回應選定套件、隨機數和證書
    |                                            |
    |  -------- 驗證+預主密鑰 ------------->   |  3. 驗證證書並發送加密的預主密鑰
    |                                            |
    |  <------- 確認加密通信 ---------------   |  4. 雙方生成會話密鑰並確認
    |                                            |
    |  === 開始加密HTTP通信 ================>   |
    |  <=================================>      |

這個握手過程發生在TCP連接之後、HTTP請求之前,為通信提供加密保護和身份驗證,有效防止中間人攻擊。