# 計算機網路：從輸入網址到渲染頁面

::: tip 前言
你每天都在用瀏覽器——看影片、重新聞、線上辦公。但你有沒有想過：**當你在網址列輸入一個網址並按下 Enter，背後發生了什麼？**

這篇文章會用**「網購」**的生活化比喻，配合**真實的技術過程**，帶你一步步理解瀏覽器如何將一行網址變成豐富多彩的頁面。

讀完這篇，你就能：
- 理解從輸入網址到顯示頁面的完整流程
- 掌握 URL、DNS、TCP、HTTP 等核心概念
- 了解瀏覽器如何渲染頁面
- 知道靜態網站和動態網站的區別

**無需程式設計基礎**，只需要你平時網購的經驗即可。
:::

**這篇文章會帶你學什麼？**

學完這章後，你將掌握從輸入網址到頁面顯示的完整技術流程，理解瀏覽器與伺服器如何協同工作。這些知識是後續學習 API、介面、網路安全等技術的基石，也是排查「網頁打不開」、「載入慢」等日常問題的關鍵。

| 章节 | 內容 | 核心概念 |
|-----|------|---------|
| **第 1 章** | URL 解析 | 網址的結構和作用 |
| **第 2 章** | DNS 查詢 | 網域名稱如何轉換成 IP 位址 |
| **第 3 章** | TCP 交握 | 如何建立可靠的連線 |
| **第 4 章** | HTTP 通訊 | 瀏覽器和伺服器如何對話 |
| **第 5 章** | 瀏覽器渲染 | 程式碼如何變成畫面 |
| **第 6 章** | 靜態 vs 動態 | 網頁內容的產生方式 |

---

## 0. 引言：當你按下 Enter 鍵的那一刻

::: tip 核心問題
**當你在瀏覽器輸入網址並按下 Enter，後台發生了什麼？** 為什麼有的網頁打開很快，有的很慢？為什麼有時候會出現「找不到伺服器」的錯誤？
:::

### 類比：網路請求流程

想象你正在進行一次**網購**。整個過程可以分為 5 個步驟：

<div style="display: flex; gap: 20px; margin: 20px 0;">
<div style="flex: 1; padding: 16px; background: var(--vp-c-bg-alt); border-radius: 12px;">

**第 1 步：填寫訂單**
選好商品，確認收貨地址

</div>
<div style="flex: 1; padding: 16px; background: var(--vp-c-bg-alt); border-radius: 12px;">

**第 2 步：尋找倉庫**
系統找到具體的發貨倉庫

</div>
<div style="flex: 1; padding: 16px; background: var(--vp-c-bg-alt); border-radius: 12px;">

**第 3 步：建立通道**
確認倉庫營業且能發貨

</div>
</div>

<div style="display: flex; gap: 20px; margin: 20px 0;">
<div style="flex: 1; padding: 16px; background: var(--vp-c-bg-alt); border-radius: 12px;">

**第 4 步：倉庫發貨**
快遞員把包裹送上門

</div>
<div style="flex: 1; padding: 16px; background: var(--vp-c-bg-alt); border-radius: 12px;">

**第 5 步：拆箱體驗**
打開包裹，看到心儀的商品

</div>
</div>

**訪問網頁的過程和網購驚人地相似！**

當你在瀏覽器輸入 `google.com` 並按下 Enter，你就是那個「買家」，瀏覽器透過一系列操作，最終把遠方伺服器上的「商品」（網頁內容）送到你的螢幕上。

<UrlToBrowserQuickStart />

::: info 核心啟示
理解瀏覽器運作原理的關鍵是：**把複雜的技術過程對應到熟悉的生活場景**。網購的 5 個步驟完美對應了瀏覽器訪問網頁的 5 個技術階段。
:::

---

## 1. URL 解析流程

::: tip 核心問題
**為什麼網址要寫成這樣？** `https://www.example.com:8080/path/page.html?id=123#section` — 這串字元到底有什麼含義？
:::

### 類比：URL 結構對照

假設你只在訂單上寫「買鞋子」，倉庫肯定不知道發哪雙。你需要寫清楚：

- **店鋪型別**（官方旗艦店/普通店）
- **店鋪名稱**（Nike 官方店）
- **商品位置**（男鞋區/跑鞋系列）
- **具體型號**（Air Max 90）
- **備註資訊**（我要紅色的）

### 實際過程：瀏覽器解析 URL 流程

**URL（Uniform Resource Locator，統一資源定位符）** 就是瀏覽器世界的「商品定位碼」。當你在網址列輸入 `https://www.example.com:8080/path/page.html?id=123#section`，瀏覽器會立即拆解它：

| URL 部分 | 範例值 | 網購類比 | 技術作用 |
| -------------------------- | -------------------- | -------------------------------------------------- | ------------------------------------------------------------------------ |
| **協定** `https://` | 安全超文本傳輸協定 | **物流方式**：保密配送（HTTPS）vs 普通配送（HTTP） | 決定使用什麼規則通訊。`http` 是普通傳輸，`https` 是加密傳輸 |
| **網域** `www.example.com` | 伺服器的人類可讀名字 | **店鋪名稱**：京東超市 | 告訴瀏覽器要找哪台伺服器。網域名稱是為了讓人記住，最終要轉換成 IP 位址 |
| **連接埠** `:8080` | 伺服器的具體「門牌號」 | **櫃檯編號**：3號櫃檯（預設不寫） | 伺服器上可能有多個服務，連接埠指定訪問哪一個。HTTP 預設 80，HTTPS 預設 443 |
| **路徑** `/path/page.html` | 伺服器上的檔案位置 | **貨架位置**：日用品區/第三排 | 指定伺服器上的具體資源位置 |
| **查詢參數** `?id=123` | 附加資訊 | **訂單備註**：紅色、XL碼 | 傳遞給伺服器的額外資料，如搜尋關鍵字、頁碼等 |
| **錨點** `#section` | 頁面內的位置 | **說明書頁碼**：翻到第5頁 | 頁面載入後自動捲動到指定位置，不傳送給伺服器 |

<UrlParserDemo />

::: info 關鍵理解
URL 的存在是為了讓**人類**能記住和輸入。電腦最終需要的是 **IP 位址**（就像快遞員最終需要的是具體的倉庫地址，而不是「Nike 官方店」這個名字）。
:::

---

## 2. DNS 查詢流程

::: tip 核心問題
**為什麼瀏覽器能找到網站？** 你輸入的是人類可讀的網域名稱（如 `baidu.com`），但電腦真正需要的是數字位址（IP）。這中間發生了什麼？
:::

### 實際過程：DNS 分層查詢流程

**DNS（Domain Name System，網域名稱系統）** 是網際網路的「分散式地址簿查詢系統」。由於全球有數十億個網域名稱，採用分層架構來分散查詢壓力：

```
你（瀏覽器）
    ↓ 問：google.com 的 IP 是多少？
本地 DNS 伺服器（你的網路供應商）
    ↓ 問：.com 歸誰管？
根網域名稱伺服器（全球13組根伺服器）
    ↓ 告訴：去問 .com 的管理者
頂級網域伺服器
    ↓ 告訴：去問 google.com 的管理者
權威網域名稱伺服器（Google 自己的 DNS 伺服器）
    ↓ 告訴：google.com 的 IP 是 142.250.80.46
返回 IP 位址給瀏覽器
```

<DnsLookupDemo />

::: info 為什麼需要這麼多層？
想象一下如果全世界只有一個地址簿，幾十億人同時查，早就崩潰了。分層設計讓每個層級只管理自己的「轄區」，既高效又可靠。

這就是網際網路設計的核心思想：**分散式系統**。
:::

---

## 3. TCP 連線建立流程

::: tip 核心問題
**為什麼需要「三次交握」？** 找到伺服器位址後，為什麼不能直接傳送資料？為什麼要先進行三次通訊？
:::

### 實際過程：TCP 三次交握流程

**TCP（Transmission Control Protocol，傳輸控制協定）** 是確保資料可靠傳輸的規則。在傳送商品（資料）前，必須透過「三次交握」建立連線：

```
客戶端（你的電腦）              伺服器（商家倉庫）
   |                                |
   |--- SYN=1 --------------------->|  第1次：你好，我在家，準備收貨！(SYN)
   |                                |
   |<-- SYN=1, ACK=1 ---------------|  第2次：收到！我也準備好發貨了，你在家嗎？(SYN-ACK)
   |                                |
   |--- ACK=1 --------------------->|  第3次：在的！請發貨吧。(ACK)
   |                                |
   ===== 通道建立，開始發貨 =====
```

**三次交握的必要性**

- **第一次（SYN）**：客戶端證明自己能傳送
- **第二次（SYN-ACK）**：伺服器證明自己能接收和傳送
- **第三次（ACK）**：客戶端證明自己能接收

三次交握確保：**雙方都能傳送、雙方都能接收** —— 四個條件都滿足，才能可靠傳輸。

<TcpHandshakeDemo />

> **HTTPS 的額外步驟**：如果是 HTTPS（安全的網站），在 TCP 交握後還會進行 **TLS 交握**（1-RTT 或 2-RTT），雙方交換加密金鑰，確保之後的對話內容只有雙方能看懂，就像用暗語通話。

---

## 4. HTTP 通訊協定

::: tip 核心問題
**瀏覽器和伺服器在說什麼？** 建立連線後，瀏覽器如何「告訴」伺服器它想要什麼？伺服器又如何「回應」？
:::

::: tip 開發者頓悟：這不就是 API 嗎？
**一模一樣！**
你平時寫的 API 呼叫（`fetch` / `axios`）和瀏覽器訪問網頁，在 **HTTP 層面完全是同一個東西**。

它們都是傳送一個請求，伺服器返回一段文字資料。

- 如果伺服器給的是 **HTML**，瀏覽器就把它**畫出來**（變成網頁）。
- 如果伺服器給的是 **JSON**，你的程式碼就把它**存起來**（用於邏輯處理）。

**根本就沒有「兩種」請求，只有同一種 HTTP 請求，只是返回的資料格式（Content-Type）不同而已。**
這也是為什麼理解了 HTTP，你就理解了 90% 的後端 API 原理。
:::

**HTTP 狀態碼分類：**

| 狀態碼 | 類別 | 含義 | 生活類比 |
| ----------- | ---------- | ---------------- | -------------------------------- |
| **200** | 成功 | 請求成功處理 | 「訂單確認，馬上發貨」 |
| **301/302** | 重新導向 | 資源已移動 | 「本店搬家了，請去新店下單」 |
| **304** | 未修改 | 快取仍有效 | 「你上次買的還能用，不用重新發貨」 |
| **400** | 客戶端錯誤 | 請求格式錯誤 | 「訂單填寫模糊，看不懂」 |
| **401** | 未授權 | 需要身分驗證 | 「請先出示會員卡」 |
| **403** | 禁止訪問 | 權限不足 | 「非內部人員禁止入內」 |
| **404** | 未找到 | 資源不存在 | 「倉庫裡沒這款商品」 |
| **500** | 伺服器錯誤 | 伺服器內部錯誤 | 「倉庫起火了，暫時發不了貨」 |
| **502** | 閘道錯誤 | 上游伺服器無回應 | 「總倉沒貨了，分倉也調不到」 |
| **503** | 服務不可用 | 伺服器過載或維護 | 「爆單了，暫停接單」 |

<HttpExchangeDemo />

---

## 5. 瀏覽器渲染流程

::: tip 核心問題
**程式碼怎麼變成畫面？** 伺服器發來的是枯燥的 HTML/CSS/JavaScript 程式碼，瀏覽器如何把它們變成豐富多彩的網頁？
:::

### 實際過程：瀏覽器渲染引擎

瀏覽器收到的是 **HTML/CSS/JavaScript 程式碼**（枯燥的文字），但它要變成**像素畫面**（精美的網頁）。這個過程叫做**渲染（Rendering）**，由瀏覽器的**渲染引擎**（如 Chrome 的 Blink、Safari 的 WebKit）執行。

<BrowserRenderingDemo />

---

## 6. 靜態網站與動態網站概述

**靜態網站**就是「成品」——網頁在伺服器上已經準備好了，你訪問時伺服器直接把現成的 HTML 檔案發給你。

**動態網站**就是你訪問時才「現場製作」的頁面——伺服器收到你的請求後，去資料庫查資料、計算資料，然後產生一個全新的 HTML 發給你。

| | 靜態網站 | 動態網站 |
|---|---------|---------|
| **怎麼來的** | 提前做好，存伺服器上 | 訪問時現做 |
| **像什麼** | 超市貨架上的商品 | 餐廳現點的菜 |
| **速度** | 快 | 慢（需要計算） |
| **能改內容嗎** | 難（要重新產生） | 容易（後台直接改） |
| **適合做什麼** | 展示型內容（介紹頁、文件） | 互動型應用（購物、社交） |
| **典型例子** | 公司官網、說明文件 | 淘寶、微信、線上銀行 |

::: tip 重要提示
無論靜態網站還是動態網站，**瀏覽器渲染的原理都是一樣的！** 伺服器發來的是什麼，瀏覽器就渲染什麼。區別只在於：
- 靜態網站：伺服器發來的是「成品」
- 動態網站：伺服器發來的是「現做的」
:::

---

## 7. 總結：完整網路請求流程

讓我們回顧整個旅程：

| 階段 | 技術術語 | 網購類比 | 核心任務 | 關鍵技術 |
| ----------- | ---------- | -------- | ------------------ | ------------------------------ |
| **1. 解析** | URL 解析 | 填寫訂單 | 理解買家想買什麼 | 協定、網域、連接埠、路徑、參數 |
| **2. 查詢** | DNS 查詢 | 查倉庫址 | 找到店鋪的發貨倉庫 | 遞迴/迭代查詢、快取機制 |
| **3. 連線** | TCP 交握 | 建立通道 | 確保物流通暢 | 三次交握、序號、流量控制 |
| **4. 對話** | HTTP 交換 | 倉庫發貨 | 提交訂單並收貨 | 請求方法、狀態碼、標頭欄位 |
| **5. 展示** | 瀏覽器渲染 | 拆箱組裝 | 把商品展示出來 | DOM、CSSOM、渲染樹、佈局、繪製 |

---

## 8. 名詞速查表

| 名詞 | 全稱 | 簡單解釋 |
| ----------- | ----------------------------- | -------------------------------------------------------------------------- |
| **URL** | Uniform Resource Locator | **統一資源定位符**。網頁的「地址」，告訴瀏覽器去哪裡找資源。 |
| **DNS** | Domain Name System | **網域名稱系統**。網際網路的「電話簿」，把人類可讀的網域名稱轉換成機器可讀的 IP 位址。 |
| **IP 位址** | Internet Protocol Address | **網際網路協定位址**。每台聯網裝置的唯一「門牌號」。 |
| **TCP** | Transmission Control Protocol | **傳輸控制協定**。確保資料可靠傳輸的「規則」。 |
| **HTTP** | HyperText Transfer Protocol | **超文本傳輸協定**。瀏覽器和伺服器「對話」的規則。 |
| **HTTPS** | HTTP Secure | **安全的 HTTP**。在 HTTP 基礎上加了加密（TLS/SSL）。 |
| **DOM** | Document Object Model | **文件物件模型**。瀏覽器把 HTML 轉換成的樹形結構。 |
| **渲染** | Rendering | 瀏覽器把程式碼轉換成螢幕像素的過程。 |

---

::: tip 恭喜
現在當你再次在網址列輸入網址並按下 Enter 時，你已經能看到螢幕背後的那個忙碌而精彩的數位世界了。

你理解了：
- 為什麼有時候網頁打不開（DNS 解析失敗、伺服器當機）
- 為什麼有的網頁快、有的慢（網路延遲、伺服器效能、頁面複雜度）
- 瀏覽器是如何把程式碼變成畫面的（渲染管線）

**這就是理解技術原理的價值** — 遇到問題時，你能知道從哪裡找原因，而不是束手無策。
:::
